12#ifndef __PDETOOLS_MESH_PDE_Mesh_Utilities_HPP
13#define __PDETOOLS_MESH_PDE_Mesh_Utilities_HPP
35namespace PDE_Mesh_Utilities
90 std::vector<Eigen::MatrixXi>
faces;
144 const double &max_relative_length,
150 const Eigen::Vector3d segment_origin = pde_domain.
vertices.col(0);
151 const Eigen::Vector3d segment_tangent = pde_domain.
vertices.col(1) - segment_origin;
152 const std::vector<double> coordinates = {0.0, 1.0};
153 mesh_utilities.
FillMesh1D(geometry_utilities, segment_origin, segment_tangent, coordinates, mesh);
157 const Eigen::Vector3d segment_origin = pde_domain.
vertices.col(0);
158 const Eigen::Vector3d segment_tangent = pde_domain.
vertices.col(1) - segment_origin;
159 const unsigned int num_points = round(1.0 / max_relative_length) + 1;
169 throw std::runtime_error(
"MeshGenerator_Types_1D " + std::to_string((
unsigned int)mesh_type) +
" not supported");
193 const double &max_relative_area,
199#if ENABLE_TRIANGLE == 0
200 throw std::runtime_error(
"Triangle library not active");
202 const double max_cell_area = pde_domain.
area * max_relative_area;
207 const std::vector<unsigned int> markers = {};
213 throw std::runtime_error(
"Voro library not active");
215 const unsigned num_cells =
static_cast<unsigned int>(std::max(1.0, 1.0 / max_relative_area));
226 throw std::runtime_error(
"Squared mesh cannot be created");
229 const double max_cell_edge = sqrt(pde_domain.
area * max_relative_area);
231 const Eigen::Vector3d domain_origin = pde_domain.
vertices.col(0);
232 const Eigen::Vector3d domain_base_tangent = pde_domain.
vertices.col(1) - domain_origin;
233 const Eigen::Vector3d domain_height_tangent = pde_domain.
vertices.rightCols(1) - domain_origin;
234 const unsigned int num_cells_base = ceil(domain_base_tangent.norm() / max_cell_edge);
235 const unsigned int num_cells_height = ceil(domain_height_tangent.norm() / max_cell_edge);
239 domain_height_tangent,
251 throw std::runtime_error(
"Squared mesh cannot be created");
254 const double max_cell_edge = sqrt(pde_domain.
area * max_relative_area);
256 const Eigen::Vector3d domain_origin = pde_domain.
vertices.col(0);
257 const Eigen::Vector3d domain_base_tangent = pde_domain.
vertices.col(1) - domain_origin;
258 const Eigen::Vector3d domain_height_tangent = pde_domain.
vertices.rightCols(1) - domain_origin;
259 const unsigned int num_cells_base = ceil(domain_base_tangent.norm() / max_cell_edge);
260 const unsigned int num_cells_height = ceil(domain_height_tangent.norm() / max_cell_edge);
264 domain_height_tangent,
276 throw std::runtime_error(
"Squared mesh cannot be created");
279 const double max_cell_edge = sqrt(pde_domain.
area * max_relative_area);
281 const Eigen::Vector3d domain_origin = pde_domain.
vertices.col(0);
282 const Eigen::Vector3d domain_base_tangent = pde_domain.
vertices.col(1) - domain_origin;
283 const Eigen::Vector3d domain_height_tangent = pde_domain.
vertices.rightCols(1) - domain_origin;
284 const unsigned int num_cells_base = ceil(domain_base_tangent.norm() / max_cell_edge);
285 const unsigned int num_cells_height = ceil(domain_height_tangent.norm() / max_cell_edge);
290 domain_height_tangent,
299 const double max_cell_area = pde_domain.
area * max_relative_area;
304 throw std::runtime_error(
"MeshGenerator_Types_2D " + std::to_string((
unsigned int)mesh_type) +
" not supported");
327 const double &max_relative_volume,
333#if ENABLE_TETGEN == 0
334 throw std::runtime_error(
"Tetgen library not active");
336 const double max_cell_volume = pde_domain.
volume * max_relative_volume;
341 const std::vector<unsigned int> markers = {};
347 throw std::runtime_error(
"Voro library not active");
349 const unsigned num_cells =
static_cast<unsigned int>(std::max(1.0, 1.0 / max_relative_volume));
360 throw std::runtime_error(
"Cubic mesh cannot be created");
363 const double max_cell_edge = std::cbrt(pde_domain.
volume * max_relative_volume);
365 const Eigen::Vector3d domain_origin = pde_domain.
vertices.col(0);
366 const Eigen::Vector3d domain_base_tangent = pde_domain.
vertices.col(1) - domain_origin;
367 const Eigen::Vector3d domain_width_tangent = pde_domain.
vertices.col(4) - domain_origin;
368 const Eigen::Vector3d domain_heigth_tangent = pde_domain.
vertices.col(3) - domain_origin;
369 const unsigned int num_cells_base = round(domain_base_tangent.norm() / max_cell_edge);
370 const unsigned int num_cells_width = round(domain_width_tangent.norm() / max_cell_edge);
371 const unsigned int num_cells_height = round(domain_heigth_tangent.norm() / max_cell_edge);
375 domain_heigth_tangent,
376 domain_width_tangent,
384 throw std::runtime_error(
"MeshGenerator_Types_3D " + std::to_string((
unsigned int)mesh_type) +
" not supported");
395 const std::string &file_path,
403 meshImporterConfiguration.
Folder = file_path;
404 meshImporterConfiguration.
Separator =
';';
406 importer.
Import(meshImporterConfiguration, mesh);
410 throw std::runtime_error(
"MeshGenerator_Types_1D " + std::to_string((
unsigned int)mesh_type) +
" not supported");
428 const std::string &file_path,
436 meshImporterConfiguration.
Folder = file_path;
437 meshImporterConfiguration.
Separator =
';';
439 importer.
Import(meshImporterConfiguration, mesh);
448 file_path +
"/Cell0Ds.csv",
449 file_path +
"/Cell2Ds.csv",
450 file_path +
"/Cell2DsMarker.csv",
456 throw std::runtime_error(
"MeshGenerator_Types_2D " + std::to_string((
unsigned int)mesh_type) +
" not supported");
471 const std::string &file_path,
479 meshImporterConfiguration.
Folder = file_path;
480 meshImporterConfiguration.
Separator =
';';
482 importer.
Import(meshImporterConfiguration, mesh);
486 std::vector<std::vector<bool>> meshCell3DsFacesOrientation;
495 throw std::runtime_error(
"MeshGenerator_Types_3D " + std::to_string((
unsigned int)mesh_type) +
" not supported");
527 Gedim::MeshUtilities::MeshGeometricData2DConfig(
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true))
529 std::vector<Gedim::GeometryUtilities::PolygonTypes> cell2Ds_types(mesh.
Cell2DTotalNumber(),
531 return mesh_utilities.
FillMesh2DGeometricData(geometry_utilities, mesh, cell2Ds_types, mesh_geometric_data_config);
The GeometryUtilities class intersects 3D segments.
Definition GeometryUtilities.hpp:37
std::vector< double > EquispaceCoordinates(const double &step, const bool &insertExtremes) const
Definition GeometryUtilities.cpp:75
MeshDAOImporterFromCsv.
Definition MeshDAOImporterFromCsv.hpp:24
void Import(const Gedim::MeshFromCsvUtilities::Configuration &configuration, Gedim::IMeshDAO &mesh)
Definition MeshDAOImporterFromCsv.cpp:27
MeshImporterFromCsvUtilities.
Definition MeshFromCsvUtilities.hpp:24
Definition IMeshDAO.hpp:1068
unsigned int Cell2DTotalNumber() const
Definition IMeshDAO.hpp:1746
MeshUtilities.
Definition MeshUtilities.hpp:23
MeshGeometricData3D FillMesh3DGeometricData(const Gedim::GeometryUtilities &geometryUtilities, const Gedim::IMeshDAO &convexMesh) const
Fill Mesh3D Geometric Data given a mesh with convex mesh cells.
Definition MeshUtilities3D.cpp:885
void CreateParallelepipedMesh(const Eigen::Vector3d &rectangleOrigin, const Eigen::Vector3d &rectangleLengthTangent, const Eigen::Vector3d &rectangleHeightTangent, const Eigen::Vector3d &rectangleWidthTangent, const std::vector< double > &lengthMeshCurvilinearCoordinates, const std::vector< double > &heightMeshCurvilinearCoordinates, const std::vector< double > &widthMeshCurvilinearCoordinates, Gedim::IMeshDAO &mesh) const
Definition MeshUtilities_MeshGenerators.cpp:1826
void CreateRandomlyDeformedQuadrilaterals(const Gedim::GeometryUtilities &geometryUtilities, const Eigen::Vector3d &rectangleOrigin, const Eigen::Vector3d &rectangleBaseTangent, const Eigen::Vector3d &rectangleHeightTangent, const unsigned int &numQuadrilateralsBaseTangent, const unsigned int &numQuadrilateralsHeightTangent, const double &maxDeformingPercentageBase, const double &maxDeformingPercentageHeight, Gedim::IMeshDAO &mesh) const
Definition MeshUtilities_MeshGenerators.cpp:1571
MeshGeometricData1D FillMesh1DGeometricData(const Gedim::GeometryUtilities &geometryUtilities, const Gedim::IMeshDAO &convexMesh) const
Fill Mesh1D Geometric Data given a mesh with convex mesh cells.
Definition MeshUtilities1D.cpp:145
void CreateTetrahedralMesh(const Eigen::MatrixXd &polyhedronVertices, const Eigen::MatrixXi &polyhedronEdges, const std::vector< Eigen::MatrixXi > &polyhedronFaces, const double &maxTetrahedronVolume, Gedim::IMeshDAO &mesh, const std::string &options="Qpqfezna") const
Create tetrahedral mesh on 3D polyhedron.
void CreateQuadrilateralMeshFromTriangularMesh(const Gedim::GeometryUtilities &geometryUtilities, const Gedim::IMeshDAO &triangular_mesh, Gedim::IMeshDAO &mesh) const
Create a quadrilateral mesh starting from a triangular mesh: the mesh is created by dividing triangle...
Definition MeshUtilities_MeshGenerators.cpp:2198
void ImportObjectFileFormat(const std::string &offFilePath, Gedim::IMeshDAO &mesh) const
Import 2D mesh from OFF file.
Definition MeshUtilities.cpp:219
void CreateTriangularMesh(const Eigen::MatrixXd &polygonVertices, const double &maxTriangleArea, Gedim::IMeshDAO &mesh, const std::string &options="-QDzpqnea") const
Create triangular mesh on 2D polygon.
Definition MeshUtilities_MeshGenerators.cpp:2176
void CreateRectangleMesh(const Eigen::Vector3d &rectangleOrigin, const Eigen::Vector3d &rectangleBaseTangent, const Eigen::Vector3d &rectangleHeightTangent, const std::vector< double > &baseMeshCurvilinearCoordinates, const std::vector< double > &heightMeshCurvilinearCoordinates, Gedim::IMeshDAO &mesh) const
Crete rectange Mesh on rectangle base x height.
Definition MeshUtilities_MeshGenerators.cpp:27
void CreateStructuredTriangularMesh(const Eigen::Vector3d &rectangleOrigin, const Eigen::Vector3d &rectangleBaseTangent, const Eigen::Vector3d &rectangleHeightTangent, const std::vector< double > &baseMeshCurvilinearCoordinates, const std::vector< double > &heightMeshCurvilinearCoordinates, Gedim::IMeshDAO &mesh) const
Definition MeshUtilities_MeshGenerators.cpp:142
void CreatePolygonalMesh(const Gedim::GeometryUtilities &geometryUtilities, const Eigen::MatrixXd &polygonVertices, const unsigned int numPoints, const unsigned int numIterations, Gedim::IMeshDAO &mesh, const unsigned int random_seed=0) const
Definition MeshUtilities_MeshGenerators.cpp:2186
void ComputeCell2DCell3DNeighbours(Gedim::IMeshDAO &mesh) const
Compute Cell2D Cell3DNeighbours with given mesh data.
Definition MeshUtilities3D.cpp:2381
void Mesh2DFromPolygon(const Eigen::MatrixXd &polygonVertices, const std::vector< unsigned int > vertexMarkers, const std::vector< unsigned int > edgeMarkers, Gedim::IMeshDAO &mesh) const
Create a Mesh 2D with a polygon.
Definition MeshUtilities2D.cpp:500
void CreatePolyhedralMesh(const Gedim::GeometryUtilities &geometryUtilities, const Eigen::MatrixXd &polyhedronVertices, const Eigen::MatrixXi &polyhedronEdges, const std::vector< Eigen::MatrixXi > &polyhedronFaces, const unsigned int numPoints, const unsigned int numIterations, Gedim::IMeshDAO &mesh, const unsigned int random_seed=0) const
Definition MeshUtilities_MeshGenerators.cpp:2357
void FillMesh1D(const Gedim::GeometryUtilities &geometryUtilities, const Eigen::Vector3d &segmentOrigin, const Eigen::Vector3d &segmentTangent, const std::vector< double > &coordinates, Gedim::IMeshDAO &mesh) const
Fill Mesh 1D From segment Coordinates.
Definition MeshUtilities1D.cpp:22
void ImportOpenVolumeMesh(const std::string &ovmFilePath, Gedim::IMeshDAO &mesh, std::vector< std::vector< bool > > &meshCell3DsFacesOrientation) const
Import 3D mesh from OVM file.
Definition MeshUtilities.cpp:186
MeshGeometricData2D FillMesh2DGeometricData(const Gedim::GeometryUtilities &geometryUtilities, const Gedim::IMeshDAO &convexMesh) const
Fill Mesh2D Geometric Data given a mesh with convex mesh cells.
Definition MeshUtilities2D.cpp:655
void ImportTriangularMesh(const Gedim::GeometryUtilities &geometry_utilities, const std::string &cell0Ds_file_path, const std::string &cell2Ds_file_path, const std::string &marker_file_path, const char separator, Gedim::IMeshDAO &mesh) const
Import triangular 2D mesh (non standard simple format)
Definition MeshUtilities_ImportTriangularMesh.cpp:18
void ImportVtkMesh3D(const std::string &vtkFilePath, Gedim::IMeshDAO &mesh) const
Import 3D mesh from VTK file.
Definition MeshUtilities.cpp:202
void Mesh3DFromPolyhedron(const Eigen::MatrixXd &polyhedronVertices, const Eigen::MatrixXi &polyhedronEdges, const std::vector< Eigen::MatrixXi > &polyhedronFaces, const std::vector< unsigned int > vertexMarkers, const std::vector< unsigned int > edgeMarkers, const std::vector< unsigned int > faceMarkers, Gedim::IMeshDAO &mesh) const
Create a Mesh 3D with a polyhedron.
Definition MeshUtilities3D.cpp:565
One-dimensional computational domain (a segment).
Definition PDE_Mesh_Utilities.hpp:40
Eigen::MatrixXd vertices
Segment endpoints (one per column).
Definition PDE_Mesh_Utilities.hpp:42
double length
Length of the segment.
Definition PDE_Mesh_Utilities.hpp:43
Two-dimensional computational domain.
Definition PDE_Mesh_Utilities.hpp:48
Domain_Shape_Types
Shape family of a 2D domain.
Definition PDE_Mesh_Utilities.hpp:52
@ Ellipse
Ellipse (uses the radius/center/rotation fields).
@ Polygon
Generic polygon.
@ Unknown
Unspecified shape.
@ Parallelogram
Parallelogram (enables structured meshes).
double area
Area of the domain.
Definition PDE_Mesh_Utilities.hpp:60
Eigen::Vector3d rotation_angle
Rotation of the ellipse (ellipse shape only).
Definition PDE_Mesh_Utilities.hpp:66
Eigen::Vector3d center
Center of the ellipse (ellipse shape only).
Definition PDE_Mesh_Utilities.hpp:65
Polydim::PDETools::Mesh::PDE_Mesh_Utilities::PDE_Domain_2D::Domain_Shape_Types shape_type
Domain shape family.
Definition PDE_Mesh_Utilities.hpp:68
Eigen::MatrixXd vertices
Domain vertices (one per column); boundary polygon for polygonal shapes.
Definition PDE_Mesh_Utilities.hpp:59
double radius_1
First semi-axis (ellipse shape only).
Definition PDE_Mesh_Utilities.hpp:63
double radius_2
Second semi-axis (ellipse shape only).
Definition PDE_Mesh_Utilities.hpp:64
Three-dimensional computational domain.
Definition PDE_Mesh_Utilities.hpp:80
Domain_Shape_Types
Definition PDE_Mesh_Utilities.hpp:83
std::vector< Eigen::MatrixXi > faces
Domain faces (per-face vertex/edge indices).
Definition PDE_Mesh_Utilities.hpp:90
Polydim::PDETools::Mesh::PDE_Mesh_Utilities::PDE_Domain_3D::Domain_Shape_Types shape_type
Domain shape family.
Definition PDE_Mesh_Utilities.hpp:92
Eigen::MatrixXd vertices
Domain vertices (one per column).
Definition PDE_Mesh_Utilities.hpp:88
Eigen::MatrixXi edges
Domain edges (vertex-index pairs).
Definition PDE_Mesh_Utilities.hpp:89
double volume
Volume of the domain.
Definition PDE_Mesh_Utilities.hpp:91
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition MeshFromCsvUtilities.hpp:27
char Separator
Definition MeshFromCsvUtilities.hpp:45
std::string Folder
Definition MeshFromCsvUtilities.hpp:28
Definition MeshUtilities.hpp:139
Definition MeshUtilities.hpp:167
Definition MeshUtilities.hpp:149
Definition MeshUtilities.hpp:215
Space–time domain for a 2D time-dependent problem.
Definition PDE_Mesh_Utilities.hpp:73
Polydim::PDETools::Mesh::PDE_Mesh_Utilities::PDE_Domain_2D spatial_domain
Definition PDE_Mesh_Utilities.hpp:75
std::array< double, 2 > time_domain
Time interval .
Definition PDE_Mesh_Utilities.hpp:74