4#include <tclap/CmdLine.h>
32 std::vector<MeshLib::Element*>
const& selected_elements,
33 std::string mesh_name)
36 auto nodes = copyNodeVector(mesh.
getNodes());
37 auto elements = copyElementVector(selected_elements, nodes);
43 return std::make_unique<MeshLib::Mesh>(std::move(mesh_name), nodes,
48 MeshLib::Mesh const& mesh, std::vector<std::size_t> selected_element_ids)
50 auto const material_ids = materialIDs(mesh);
51 if (material_ids ==
nullptr)
54 "GMSH2OGS: Expected material ids to be present in the mesh to "
55 "extract boundary meshes.");
58 std::vector<std::unique_ptr<MeshLib::Mesh>> boundary_meshes;
62 while (!selected_element_ids.empty())
66 int const material_id = (*material_ids)[selected_element_ids.back()];
67 auto split = std::partition(
68 begin(selected_element_ids), end(selected_element_ids),
69 [&material_id, &material_ids](
int const id)
70 {
return (*material_ids)[id] != material_id; });
73 std::vector<MeshLib::Element*> single_material_elements;
74 single_material_elements.reserve(
75 std::distance(split, end(selected_element_ids)));
76 std::transform(split, end(selected_element_ids),
77 std::back_inserter(single_material_elements),
78 [&](
int const id) {
return elements[id]; });
81 selected_element_ids.erase(split, end(selected_element_ids));
85 mesh, single_material_elements, std::to_string(material_id)));
87 return boundary_meshes;
92 std::string
const& file_name,
93 std::vector<std::unique_ptr<MeshLib::Mesh>>& boundary_meshes)
96 auto const& mesh_node_searcher =
99 std::make_unique<MeshGeoToolsLib::SearchLength>(
102 for (
auto& boundary_mesh : boundary_meshes)
104 identifySubdomainMesh(*boundary_mesh, mesh, mesh_node_searcher);
108 '_' + boundary_mesh->getName() +
115int main(
int argc,
char* argv[])
118 "Converting meshes in gmsh file format (ASCII, version 2.2) to a vtk "
119 "unstructured grid file (new OGS file format) or to the old OGS file "
120 "format - see options.\n\n"
121 "OpenGeoSys-6 software, version " +
124 "Copyright (c) 2012-2026, OpenGeoSys Community "
125 "(http://www.opengeosys.org)",
128 TCLAP::ValueArg<std::string> ogs_mesh_arg(
131 "Output (.msh | .vtk). Filename for output mesh (if extension is .msh, "
132 "old OGS-5 file format "
133 "is written, if extension is .vtu, a vtk unstructure grid file is "
134 "written (OGS-6 mesh format))",
138 cmd.add(ogs_mesh_arg);
140 TCLAP::ValueArg<std::string> gmsh_mesh_arg(
"i",
"in",
"Input (.msh) file",
141 true,
"",
"INPUT_FILE");
142 cmd.add(gmsh_mesh_arg);
144 TCLAP::SwitchArg valid_arg(
"v",
"validation",
"validate the mesh");
147 TCLAP::SwitchArg create_boundary_meshes_arg(
148 "b",
"boundaries",
"if set, boundary meshes will be generated");
149 cmd.add(create_boundary_meshes_arg);
151 TCLAP::SwitchArg exclude_lines_arg(
152 "e",
"exclude-lines",
153 "if set, lines will not be written to the ogs mesh");
154 cmd.add(exclude_lines_arg);
157 cmd.add(log_level_arg);
159 std::string
const gmsh2_opt_message =
160 "if set, the mesh is generated with Gmsh version 2 and it is saved"
161 " (or exported) as \"Version 2 ASCII\" format";
163 TCLAP::SwitchArg gmsh2_arg(
"",
"gmsh2_physical_id", gmsh2_opt_message);
166 cmd.parse(argc, argv);
172 INFO(
"Reading {:s}.", gmsh_mesh_arg.getValue());
180 gmsh2_arg.getValue()));
184 INFO(
"Could not read mesh from {:s}.", gmsh_mesh_arg.getValue());
188 INFO(
"Mem for mesh: {} MiB",
192 INFO(
"Time for reading: {:f} seconds.", run_time.
elapsed());
197 if (exclude_lines_arg.getValue() || create_boundary_meshes_arg.getValue())
201 auto const& selected_element_ids = ex.getSearchedElementIDs();
207 std::vector<std::unique_ptr<MeshLib::Mesh>> boundary_meshes;
208 if (create_boundary_meshes_arg.getValue())
214 if (exclude_lines_arg.getValue())
217 *mesh, selected_element_ids, mesh->
getName() +
"-withoutLines");
220 INFO(
"Removed {:d} lines.",
227 INFO(
"Mesh does not contain any lines.");
231 if (create_boundary_meshes_arg.getValue())
239 INFO(
"Please check your mesh carefully!");
241 "Degenerated or redundant mesh elements can cause OGS to stop or "
243 INFO(
"Use the -e option to delete redundant line elements.");
248 INFO(
"Axis aligned bounding box: {}", aabb);
250 auto const [min, max] = minMaxEdgeLength(mesh->
getElements());
251 INFO(
"Edge length: [{:g}, {:g}]", min, max);
258 if (valid_arg.isSet())
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)
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.
TCLAP::ValueArg< std::string > makeLogLevelArg()
void initOGSLogger(std::string const &log_level)
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)