33 throw std::runtime_error(
"writeGmshMsh22From2DTriangleMesh: only triangle meshes are supported.");
35 throw std::runtime_error(
"writeGmshMsh22From2DTriangleMesh: dimension must be 2.");
39 const size_t n = nodes.size();
40 const size_t ne = enc.size() / 3;
42 std::ofstream out(path);
44 throw std::runtime_error(
"writeGmshMsh22From2DTriangleMesh: cannot open " + path);
46 out << std::setprecision(17);
47 out <<
"$MeshFormat\n2.2 0 8\n$EndMeshFormat\n";
48 out <<
"$Nodes\n" << n <<
"\n";
49 for (
size_t i = 0; i < n; ++i) {
50 const auto &p = nodes[i];
51 out << (i + 1) <<
" " << p.d_x <<
" " << p.d_y <<
" 0\n";
54 out <<
"$Elements\n" << ne <<
"\n";
55 for (
size_t e = 0; e < ne; ++e) {
56 const size_t a = enc[3 * e] + 1;
57 const size_t b = enc[3 * e + 1] + 1;
58 const size_t c = enc[3 * e + 2] + 1;
59 out << (e + 1) <<
" 2 2 0 1 " << a <<
" " << b <<
" " << c <<
"\n";
61 out <<
"$EndElements\n";
67 const std::string &filenameStem,
bool vtk_out,
73 throw std::runtime_error(
"generateBuiltinParticleMeshGmsh: GeomObject pointer is null.");
75 const std::string &geomName = geomObj->d_name;
79 bool known = (geomName ==
"annulus_object");
89 throw std::runtime_error(
90 "generateBuiltinParticleMeshGmsh: geometry type is not in geom::acceptable_geometries.");
93 gmsh::option::setNumber(
"Mesh.MshFileVersion", 2.2);
101 gmsh::option::setNumber(
"Mesh.MeshSizeMin", h);
102 gmsh::option::setNumber(
"Mesh.MeshSizeMax", h);
110 const std::string &n = geomObj->d_name;
111 const bool geo_polygon =
112 n ==
"square" || n ==
"rectangle" || n ==
"triangle" || n ==
"hexagon" ||
113 n ==
"drum2d" || n ==
"open_rect_channel_2d";
115 gmsh::option::setNumber(
"Mesh.Algorithm", geo_polygon ? 5 : 6);
117 gmsh::model::mesh::generate(genDim);
123 if (!write_mesh_file && out_mesh ==
nullptr)
124 throw std::runtime_error(
125 "generateBuiltinParticleMeshGmsh: when write_mesh_file is false, out_mesh is required.");
127 if (out_mesh !=
nullptr) {
128 if (meshDeck ==
nullptr || modelDeck ==
nullptr)
129 throw std::runtime_error(
130 "generateBuiltinParticleMeshGmsh: meshDeck and modelDeck are required when out_mesh is set.");
134 if (write_mesh_file) {
135 if (filenameStem.empty())
136 throw std::runtime_error(
137 "generateBuiltinParticleMeshGmsh: non-empty filename stem is required when writing a .msh file.");
138 const std::string mshPath = filenameStem +
".msh";
139 if (modelDeck !=
nullptr && modelDeck->
d_dim == 2 && out_mesh !=
nullptr)
140 writeGmshMsh22From2DTriangleMesh(*out_mesh, mshPath);
142 gmsh::write(mshPath);
146 if (filenameStem.empty())
147 throw std::runtime_error(
148 "generateBuiltinParticleMeshGmsh: non-empty filename stem is required for VTK output.");
149 gmsh::write(filenameStem +
".vtk");
const std::vector< size_t > & getElementConnectivities() const
Get the reference to element-node connectivity data.
const std::vector< util::Point > & getNodes() const
Get the nodes data.
size_t getDimension() const
Get the dimension of the domain.
size_t getElementType() const
Get the type of element in mesh.
static const int vtk_type_triangle
Integer flag for triangle element.
const std::vector< std::string > & getAcceptableGeometries()
Returns list of acceptable geometries for PeriDEM simulation.
void writeGmshMsh22From2DTriangleMesh(const mesh::Mesh &m, const std::string &path)
void fillMeshFromActiveGmshModel(mesh::Mesh *mesh_p, const inp::MeshDeck *meshDeck, const inp::ModelDeck *modelDeck)
void buildGmshGeometryInCurrentModel(const geom::GeomObject &g, double h)
void generateBuiltinParticleMeshGmsh(const std::shared_ptr< geom::GeomObject > &geomObj, double h, const std::string &filenameStem, bool vtk_out, bool write_mesh_file, mesh::Mesh *out_mesh, const inp::MeshDeck *meshDeck, const inp::ModelDeck *modelDeck)
In-process Gmsh mesh from geom::GeomObject (after createGeomObject on deck / Particle data).
int gmshMeshGenerateDim(const inp::ModelDeck *modelDeck)
Structure to read and store mesh related input data.
Structure to read and store model related input data.