15#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-2025, OpenGeoSys Community "
136 "(http://www.opengeosys.org)",
139 TCLAP::ValueArg<std::string> ogs_mesh_arg(
142 "Output (.msh | .vtk). Filename for output mesh (if extension is .msh, "
143 "old OGS-5 file format "
144 "is written, if extension is .vtu, a vtk unstructure grid file is "
145 "written (OGS-6 mesh format))",
149 cmd.add(ogs_mesh_arg);
151 TCLAP::ValueArg<std::string> gmsh_mesh_arg(
"i",
"in",
"Input (.msh) file",
152 true,
"",
"INPUT_FILE");
153 cmd.add(gmsh_mesh_arg);
155 TCLAP::SwitchArg valid_arg(
"v",
"validation",
"validate the mesh");
158 TCLAP::SwitchArg create_boundary_meshes_arg(
159 "b",
"boundaries",
"if set, boundary meshes will be generated");
160 cmd.add(create_boundary_meshes_arg);
162 TCLAP::SwitchArg exclude_lines_arg(
163 "e",
"exclude-lines",
164 "if set, lines will not be written to the ogs mesh");
165 cmd.add(exclude_lines_arg);
168 cmd.add(log_level_arg);
170 std::string
const gmsh2_opt_message =
171 "if set, the mesh is generated with Gmsh version 2 and it is saved"
172 " (or exported) as \"Version 2 ASCII\" format";
174 TCLAP::SwitchArg gmsh2_arg(
"",
"gmsh2_physical_id", gmsh2_opt_message);
177 cmd.parse(argc, argv);
183 INFO(
"Reading {:s}.", gmsh_mesh_arg.getValue());
191 gmsh2_arg.getValue()));
195 INFO(
"Could not read mesh from {:s}.", gmsh_mesh_arg.getValue());
199 INFO(
"Mem for mesh: {} MiB",
203 INFO(
"Time for reading: {:f} seconds.", run_time.
elapsed());
208 if (exclude_lines_arg.getValue() || create_boundary_meshes_arg.getValue())
212 auto const& selected_element_ids = ex.getSearchedElementIDs();
218 std::vector<std::unique_ptr<MeshLib::Mesh>> boundary_meshes;
219 if (create_boundary_meshes_arg.getValue())
225 if (exclude_lines_arg.getValue())
228 *mesh, selected_element_ids, mesh->
getName() +
"-withoutLines");
231 INFO(
"Removed {:d} lines.",
238 INFO(
"Mesh does not contain any lines.");
242 if (create_boundary_meshes_arg.getValue())
250 INFO(
"Please check your mesh carefully!");
252 "Degenerated or redundant mesh elements can cause OGS to stop or "
254 INFO(
"Use the -e option to delete redundant line elements.");
259 INFO(
"Axis aligned bounding box: {}", aabb);
261 auto const [min, max] = minMaxEdgeLength(mesh->
getElements());
262 INFO(
"Edge length: [{:g}, {:g}]", min, max);
269 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.
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)