PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
Loading...
Searching...
No Matches
particleMesh.cpp
Go to the documentation of this file.
1/*
2 * -------------------------------------------
3 * Copyright (c) 2021 - 2026 Prashant K. Jha
4 * -------------------------------------------
5 * PeriDEM https://github.com/prashjha/PeriDEM
6 *
7 * Distributed under the Boost Software License, Version 1.0. (See accompanying
8 * file LICENSE)
9 */
10
11#include "particleMesh.h"
12
14#include "inp/meshDeck.h"
15#include "inp/modelDeck.h"
16#include "mesh/mesh.h"
17#include "mesh/meshUtil.h"
18#include "meshGenerator.h"
19#include "rw/writer.h"
20#include "util/io.h"
21
22#include <stdexcept>
23
24namespace {
25
26void maybeWriteMeshFile(const inp::MeshDeck &zmeshDeck, const mesh::Mesh &mesh) {
27 if (!zmeshDeck.d_writeMeshFile || zmeshDeck.d_filename.empty())
28 return;
29 // Deck File is typically *.msh; MshWriter appends/checks that extension.
30 const std::string stem = util::io::removeExtensionFromFile(zmeshDeck.d_filename);
31 rw::writer::Writer writer(stem, "msh", "");
32 writer.appendMesh(mesh.getNodesP(), mesh.getElementType(),
33 mesh.getElementConnectivitiesP());
34 writer.close();
35}
36
37} // namespace
38
39std::shared_ptr<mesh::Mesh>
41 const geom::GeomData &zgeomDeck,
42 const inp::ModelDeck *modelDeck,
43 const std::string &modelName) {
44 if (!zmeshDeck.d_createMesh) {
45 return std::make_shared<mesh::Mesh>(&zmeshDeck, modelDeck);
46 }
47
48 if (zmeshDeck.d_createMeshInfo == "uniform" &&
49 (zgeomDeck.d_geomName == "rectangle" || zgeomDeck.d_geomName == "cuboid" ||
50 zgeomDeck.d_geomName == "square" || zgeomDeck.d_geomName == "cube")) {
51
52 if (!zgeomDeck.d_geom_p)
53 throw std::runtime_error(
54 modelName + ": uniform mesh on a box requires particle geometry object "
55 "(geom::createGeomObject on Particle.Set_i).");
56
57 const size_t dim = modelDeck->d_dim;
58 const auto bb = zgeomDeck.d_geom_p->box();
59 std::pair<std::vector<double>, std::vector<double>> box;
60 box.first.reserve(dim);
61 box.second.reserve(dim);
62 for (size_t i = 0; i < dim; ++i) {
63 const double lo_i =
64 (i == 0) ? bb.first.d_x : (i == 1) ? bb.first.d_y : bb.first.d_z;
65 const double hi_i =
66 (i == 0) ? bb.second.d_x : (i == 1) ? bb.second.d_y : bb.second.d_z;
67 box.first.push_back(lo_i);
68 box.second.push_back(hi_i);
69 }
70
71 std::vector<size_t> nGrid(dim);
72 for (size_t i = 0; i < dim; ++i) {
73 const double span = box.second[i] - box.first[i];
74 if (span <= 0.)
75 throw std::runtime_error(
76 modelName + ": uniform mesh: non-positive axis extent from geom box "
77 "(axis " +
78 std::to_string(i) + ").");
79 nGrid[i] = static_cast<size_t>(span / zmeshDeck.d_hMeshing);
80 }
81
82 mesh::Mesh temp_mesh;
83 mesh::createUniformMesh(&temp_mesh, dim, box, nGrid);
84 if (!zmeshDeck.d_voidRegions.empty())
85 mesh::removeNodesInBoxes(&temp_mesh, zmeshDeck.d_voidRegions);
86 maybeWriteMeshFile(zmeshDeck, temp_mesh);
87 return std::make_shared<mesh::Mesh>(temp_mesh);
88 }
89
90 if (zmeshDeck.d_createMeshInfo == "gmsh_builtin_mesh") {
91 if (!zgeomDeck.d_geom_p)
92 throw std::runtime_error(
93 modelName + ": gmsh_builtin_mesh requires particle geometry object "
94 "(geom::createGeomObject on Particle.Set_i).");
95 mesh::Mesh temp_mesh;
96 const std::string mesh_stem =
97 zmeshDeck.d_filename.empty()
98 ? std::string()
101 zgeomDeck.d_geom_p, zmeshDeck.d_hMeshing, mesh_stem, false,
102 zmeshDeck.d_writeMeshFile, &temp_mesh, &zmeshDeck, modelDeck);
103 return std::make_shared<mesh::Mesh>(temp_mesh);
104 }
105
106 throw std::runtime_error(
107 "Error: Unsupported in-built mesh: CreateMesh.Info = " +
108 zmeshDeck.d_createMeshInfo + " with geometry = " + zgeomDeck.d_geomName);
109}
A class for mesh data.
Definition mesh.h:53
A interface class writing data.
Definition writer.h:44
void close()
Closes the file and store it to the hard disk.
Definition writer.cpp:204
void appendMesh(const std::vector< util::Point > *nodes, const size_t &element_type, const std::vector< size_t > *en_con, const std::vector< util::Point > *u=nullptr)
Writes the mesh data to file.
Definition writer.cpp:61
void maybeWriteMeshFile(const inp::MeshDeck &zmeshDeck, const mesh::Mesh &mesh)
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).
std::shared_ptr< mesh::Mesh > createParticleMesh(const inp::MeshDeck &zmeshDeck, const geom::GeomData &zgeomDeck, const inp::ModelDeck *modelDeck, const std::string &modelName)
Build a reference-particle mesh: file, uniform rectangle, or in-process Gmsh.
Collection of methods and data related to finite element and mesh.
Definition mesh.cpp:28
void createUniformMesh(mesh::Mesh *mesh_p, size_t dim, std::pair< std::vector< double >, std::vector< double > > box, std::vector< size_t > nGrid)
Creates uniform mesh for rectangle/cuboid domain.
Definition meshUtil.cpp:62
void removeNodesInBoxes(mesh::Mesh *mesh_p, const std::vector< std::vector< double > > &boxes)
Removes nodes lying inside any of the given axis-aligned boxes.
Definition meshUtil.cpp:214
std::string removeExtensionFromFile(std::string const &filename)
Remove extension from the filename Source - https://stackoverflow.com/a/24386991.
Definition io.h:296
Input data for geometrical objects.
std::shared_ptr< geom::GeomObject > d_geom_p
Zone geometry.
std::string d_geomName
Zone type.
Structure to read and store mesh related input data.
Definition meshDeck.h:26
double d_hMeshing
Target spacing for in-built meshers only (Gmsh uniform / uniform rectangle grid).
Definition meshDeck.h:38
bool d_writeMeshFile
If true (default), Gmsh-based create-mesh paths write a .msh file; set false for in-memory only.
Definition meshDeck.h:53
bool d_createMesh
Specify if we create mesh using in-built gmsh or in-built routine for uniform discretization of recta...
Definition meshDeck.h:44
std::vector< std::vector< double > > d_voidRegions
Axis-aligned boxes emptied from an in-built uniform grid (CreateMesh.Void_Regions: [xlo,...
Definition meshDeck.h:59
std::string d_createMeshInfo
Selector for in-built mesh creation (e.g. uniform rectangle, gmsh_builtin_mesh for built-in geometrie...
Definition meshDeck.h:50
std::string d_filename
Filename to read mesh data.
Definition meshDeck.h:29
Structure to read and store model related input data.
Definition modelDeck.h:25
size_t d_dim
Dimension.
Definition modelDeck.h:106