20#include <tclap/CmdLine.h>
43 std::vector<MeshLib::Element*>
const& selected_elements,
44 std::string mesh_name)
47 auto nodes = copyNodeVector(mesh.
getNodes());
48 auto elements = copyElementVector(selected_elements, nodes);
54 return std::make_unique<MeshLib::Mesh>(std::move(mesh_name), nodes,
59 MeshLib::Mesh const& mesh, std::vector<std::size_t> selected_element_ids)
61 auto const material_ids = materialIDs(mesh);
62 if (material_ids ==
nullptr)
65 "GMSH2OGS: Expected material ids to be present in the mesh to "
66 "extract boundary meshes.");
69 std::vector<std::unique_ptr<MeshLib::Mesh>> boundary_meshes;
73 while (!selected_element_ids.empty())
77 int const material_id = (*material_ids)[selected_element_ids.back()];
78 auto split = std::partition(
79 begin(selected_element_ids), end(selected_element_ids),
80 [&material_id, &material_ids](
int const id)
81 {
return (*material_ids)[id] != material_id; });
84 std::vector<MeshLib::Element*> single_material_elements;
85 single_material_elements.reserve(
86 std::distance(split, end(selected_element_ids)));
87 std::transform(split, end(selected_element_ids),
88 std::back_inserter(single_material_elements),
89 [&](
int const id) {
return elements[id]; });
92 selected_element_ids.erase(split, end(selected_element_ids));
96 mesh, single_material_elements, std::to_string(material_id)));
98 return boundary_meshes;
103 std::string
const& file_name,
104 std::vector<std::unique_ptr<MeshLib::Mesh>>& boundary_meshes)
107 auto const& mesh_node_searcher =
110 std::make_unique<MeshGeoToolsLib::SearchLength>(
113 for (
auto& boundary_mesh : boundary_meshes)
115 identifySubdomainMesh(*boundary_mesh, mesh, mesh_node_searcher);
119 '_' + boundary_mesh->getName() +
126int main(
int argc,
char* argv[])
129 "Converting meshes in gmsh file format (ASCII, version 2.2) to a vtk "
130 "unstructured grid file (new OGS file format) or to the old OGS file "
131 "format - see options.\n\n"
132 "OpenGeoSys-6 software, version " +
135 "Copyright (c) 2012-2024, OpenGeoSys Community "
136 "(http://www.opengeosys.org)",
139 TCLAP::ValueArg<std::string> ogs_mesh_arg(
142 "filename for output mesh (if extension is .msh, old OGS-5 fileformat "
143 "is written, if extension is .vtu, a vtk unstructure grid file is "
144 "written (OGS-6 mesh format))",
147 "filename as string");
148 cmd.add(ogs_mesh_arg);
150 TCLAP::ValueArg<std::string> gmsh_mesh_arg(
"i",
"in",
"gmsh input file",
151 true,
"",
"filename as string");
152 cmd.add(gmsh_mesh_arg);
154 TCLAP::SwitchArg valid_arg(
"v",
"validation",
"validate the mesh");
157 TCLAP::SwitchArg create_boundary_meshes_arg(
158 "b",
"boundaries",
"if set, boundary meshes will be generated");
159 cmd.add(create_boundary_meshes_arg);
161 TCLAP::SwitchArg exclude_lines_arg(
162 "e",
"exclude-lines",
163 "if set, lines will not be written to the ogs mesh");
164 cmd.add(exclude_lines_arg);
166 std::string
const gmsh2_opt_message =
167 "if set, the mesh is generated with Gmsh version 2 and it is saved"
168 " (or exported) as \"Version 2 ASCII\" format";
170 TCLAP::SwitchArg gmsh2_arg(
"",
"gmsh2_physical_id", gmsh2_opt_message);
173 cmd.parse(argc, argv);
178 INFO(
"Reading {:s}.", gmsh_mesh_arg.getValue());
186 gmsh2_arg.getValue()));
190 INFO(
"Could not read mesh from {:s}.", gmsh_mesh_arg.getValue());
194 INFO(
"Mem for mesh: {} MiB",
198 INFO(
"Time for reading: {:f} seconds.", run_time.
elapsed());
203 if (exclude_lines_arg.getValue() || create_boundary_meshes_arg.getValue())
207 auto const& selected_element_ids = ex.getSearchedElementIDs();
213 std::vector<std::unique_ptr<MeshLib::Mesh>> boundary_meshes;
214 if (create_boundary_meshes_arg.getValue())
220 if (exclude_lines_arg.getValue())
223 *mesh, selected_element_ids, mesh->
getName() +
"-withoutLines");
226 INFO(
"Removed {:d} lines.",
233 INFO(
"Mesh does not contain any lines.");
237 if (create_boundary_meshes_arg.getValue())
245 INFO(
"Please check your mesh carefully!");
247 "Degenerated or redundant mesh elements can cause OGS to stop or "
249 INFO(
"Use the -e option to delete redundant line elements.");
254 INFO(
"Axis aligned bounding box: {}", aabb);
256 auto const [min, max] = minMaxEdgeLength(mesh->
getElements());
257 INFO(
"Edge length: [{:g}, {:g}]", min, max);
264 if (valid_arg.isSet())
Definition of the AABB class.
Definition of Duplicate functions.
int main(int argc, char *argv[])
static std::unique_ptr< MeshLib::Mesh > createMeshFromElements(MeshLib::Mesh const &mesh, std::vector< MeshLib::Element * > const &selected_elements, std::string mesh_name)
static std::vector< std::unique_ptr< MeshLib::Mesh > > extractBoundaryMeshes(MeshLib::Mesh const &mesh, std::vector< std::size_t > selected_element_ids)
static void identifyAndWriteBoundaryMeshes(MeshLib::Mesh const &mesh, std::string const &file_name, std::vector< std::unique_ptr< MeshLib::Mesh > > &boundary_meshes)
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition of the MemWatch class.
Definition of the Mesh class.
Definition of the RunTime class.
unsigned long getVirtMemUsage()
double elapsed() const
Get the elapsed time in seconds.
void start()
Start the timer.
Class AABB is an axis aligned bounding box around a given set of geometric points of (template) type ...
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
const std::string getName() const
Get name of the mesh.
std::size_t getNumberOfNodes() const
Get the number of nodes.
std::size_t getNumberOfElements() const
Get the number of elements.
std::string getFileExtension(const std::string &path)
std::string dropFileExtension(std::string const &filename)
MeshLib::Mesh * readGMSHMesh(std::string const &fname, bool const is_created_with_gmsh2)
GITINFOLIB_EXPORT const std::string ogs_version
int writeMeshToFile(const MeshLib::Mesh &mesh, std::filesystem::path const &file_path, std::set< std::string > variable_output_names)