OGS
LayeredMeshGenerator.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include <fstream>
7#include <vector>
8
9#include "BaseLib/Logging.h"
10#include "GeoLib/Raster.h"
12#include "MeshLib/Mesh.h"
14#include "MeshLib/Node.h"
15#include "MeshLib/Properties.h"
19
21 MeshLib::Mesh const& mesh,
22 std::vector<GeoLib::Raster const*> const& rasters,
23 double minimum_thickness,
24 double noDataReplacementValue)
25{
26 if (mesh.getDimension() != 2)
27 {
28 return false;
29 }
30
31 auto const elem_count =
33 if (elem_count.find(MeshLib::MeshElemType::QUAD) != elem_count.end())
34 {
35 ERR("Input mesh contains QUAD-elements. Please use input mesh "
36 "containing LINE and TRIANGLE elements only.");
37 return false;
38 }
39
40 bool result = createRasterLayers(
41 mesh, rasters, minimum_thickness, noDataReplacementValue);
42 std::for_each(rasters.begin(),
43 rasters.end(),
44 [](GeoLib::Raster const* const raster) { delete raster; });
45 return result;
46}
47
48std::unique_ptr<MeshLib::Mesh> LayeredMeshGenerator::getMesh(
49 std::string const& mesh_name) const
50{
51 if (_nodes.empty())
52 {
53 WARN("LayeredMeshGenerator has not created any nodes.");
54 return nullptr;
55 }
56 if (_elements.empty())
57 {
58 WARN("LayeredMeshGenerator has not created any elements.");
59 return nullptr;
60 }
61
62 MeshLib::Properties properties;
63 if (_materials.size() == _elements.size())
64 {
65 auto* const materials = properties.createNewPropertyVector<int>(
66 "MaterialIDs", MeshLib::MeshItemType::Cell);
67 assert(materials != nullptr);
68 materials->assign(_materials);
69 }
70 else
71 {
72 WARN(
73 "Skipping MaterialID information, number of entries does not match "
74 "element number");
75 }
76
77 std::unique_ptr<MeshLib::Mesh> result(
78 new MeshLib::Mesh(mesh_name,
79 _nodes,
81 true /* compute_element_neighbors */,
82 properties));
83 MeshLib::NodeSearch ns(*result);
84 if (ns.searchUnused() > 0)
85 {
86 std::unique_ptr<MeshLib::Mesh> new_mesh(MeshToolsLib::removeNodes(
87 *result, ns.getSearchedNodeIDs(), mesh_name));
88 return new_mesh;
89 }
90 return result;
91}
92
94 GeoLib::Raster const& high)
95{
96 const double max(*std::max_element(high.begin(), high.end()));
97 const double min(*std::min_element(low.begin(), low.end()));
98 return ((max - min) * 1e-07);
99}
100
102 MeshLib::Node const& dem_node,
103 MeshLib::Node const& last_layer_node,
104 GeoLib::Raster const& raster,
105 std::size_t new_node_id) const
106{
107 double const elevation =
108 std::min(raster.interpolateValueAtPoint(dem_node), dem_node[2]);
109
110 if ((std::abs(elevation - raster.getHeader().no_data) <
111 std::numeric_limits<double>::epsilon()) ||
112 (elevation - last_layer_node[2] < _minimum_thickness))
113 {
114 return new MeshLib::Node(last_layer_node);
115 }
116
117 return new MeshLib::Node(dem_node[0], dem_node[1], elevation, new_node_id);
118}
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:34
Class Raster is used for managing raster data.
Definition Raster.h:39
std::vector< double >::const_iterator begin() const
Definition Raster.h:86
double interpolateValueAtPoint(const MathLib::Point3d &pnt) const
Definition Raster.cpp:75
RasterHeader const & getHeader() const
Returns the complete header information.
Definition Raster.h:75
std::vector< double >::const_iterator end() const
Definition Raster.h:96
virtual bool createLayers(MeshLib::Mesh const &mesh, std::vector< GeoLib::Raster const * > const &rasters, double minimum_thickness, double noDataReplacementValue=0.0) final
std::vector< int > _materials
static double calcEpsilon(GeoLib::Raster const &low, GeoLib::Raster const &high)
Calculates a data-dependent epsilon value.
MeshLib::Node * getNewLayerNode(MeshLib::Node const &dem_node, MeshLib::Node const &last_layer_node, GeoLib::Raster const &raster, std::size_t new_node_id) const
std::vector< MeshLib::Node * > _nodes
virtual bool createRasterLayers(MeshLib::Mesh const &mesh, std::vector< GeoLib::Raster const * > const &rasters, double minimum_thickness, double noDataReplacementValue)=0
std::unique_ptr< MeshLib::Mesh > getMesh(std::string const &mesh_name) const
Returns a mesh of the subsurface representation.
std::vector< MeshLib::Element * > _elements
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition Mesh.h:79
Node search class.
Definition NodeSearch.h:18
const std::vector< std::size_t > & getSearchedNodeIDs() const
return marked node IDs
Definition NodeSearch.h:23
std::size_t searchUnused()
Marks all unused nodes.
Property manager on mesh items. Class Properties manages scalar, vector or matrix properties....
PropertyVector< T > * createNewPropertyVector(std::string_view name, MeshItemType mesh_item_type, std::size_t n_components=1)
static std::map< MeshLib::MeshElemType, unsigned > getNumberOfElementTypes(const MeshLib::Mesh &mesh)
MeshLib::Mesh * removeNodes(const MeshLib::Mesh &mesh, const std::vector< std::size_t > &del_nodes_idx, const std::string &new_mesh_name)