Skip to content
Snippets Groups Projects
Commit 793bc18d authored by Karsten Rink's avatar Karsten Rink
Browse files

resolved dem-nodes below bottom layer for tet mesh generation

Conflicts:
	MeshLib/MeshGenerators/LayeredVolume.cpp
parent 6558ee1a
No related branches found
Tags
No related merge requests found
...@@ -18,10 +18,11 @@ ...@@ -18,10 +18,11 @@
#include "Raster.h" #include "Raster.h"
#include "Elements/Tri.h" #include "MeshLib/Elements/Tri.h"
#include "Elements/Quad.h" #include "MeshLib/Elements/Quad.h"
#include "MeshGenerators/MeshLayerMapper.h" #include "MeshLib/MeshEditing/ElementExtraction.h"
#include "MeshEditing/ElementExtraction.h" #include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
#include "MeshLib/MeshGenerators/MeshLayerMapper.h"
bool LayeredVolume::createRasterLayers(const MeshLib::Mesh &mesh, const std::vector<GeoLib::Raster const*> &rasters, double noDataReplacementValue) bool LayeredVolume::createRasterLayers(const MeshLib::Mesh &mesh, const std::vector<GeoLib::Raster const*> &rasters, double noDataReplacementValue)
...@@ -36,48 +37,57 @@ bool LayeredVolume::createRasterLayers(const MeshLib::Mesh &mesh, const std::vec ...@@ -36,48 +37,57 @@ bool LayeredVolume::createRasterLayers(const MeshLib::Mesh &mesh, const std::vec
// remove line elements, only tri + quad remain // remove line elements, only tri + quad remain
MeshLib::ElementExtraction ex(mesh); MeshLib::ElementExtraction ex(mesh);
ex.searchByElementType(MeshElemType::LINE); ex.searchByElementType(MeshElemType::LINE);
MeshLib::Mesh* mesh_layer (ex.removeMeshElements("MeshLayer")); MeshLib::Mesh* top (ex.removeMeshElements("MeshLayer"));
if (mesh_layer==nullptr) if (top==nullptr)
mesh_layer = new MeshLib::Mesh(mesh); top = new MeshLib::Mesh(mesh);
// map each layer and attach to subsurface mesh if (!MeshLayerMapper::layerMapping(*top, *rasters[0], noDataReplacementValue))
const std::size_t nRasters (rasters.size()); return false;
for (size_t i=0; i<nRasters; ++i)
{ MeshLib::Mesh* bottom (new MeshLib::Mesh(*top));
const double replacement_value = (i==(nRasters-1)) ? noDataReplacementValue : rasters[i]->getNoDataValue(); if (!MeshLayerMapper::layerMapping(*bottom, *rasters.back(), 0))
if (!MeshLayerMapper::layerMapping(*mesh_layer, *rasters[i], replacement_value))
{ {
this->cleanUpOnError(); delete top;
return false; return false;
} }
this->addLayerToMesh(*mesh_layer, i, *rasters[i]);
} _nodes = MeshLib::copyNodeVector(bottom->getNodes());
_elements = MeshLib::copyElementVector(bottom->getElements(), _nodes);
delete bottom;
// map each layer and attach to subsurface mesh
const std::size_t nRasters (rasters.size());
for (int i=nRasters-2; i>=0; --i)
this->addLayerToMesh(*top, nRasters-i-1, *rasters[i]);
// close boundaries between layers // close boundaries between layers
this->addLayerBoundaries(*mesh_layer, nRasters); this->addLayerBoundaries(*top, nRasters);
this->removeCongruentElements(nRasters, mesh_layer->getNElements()); this->removeCongruentElements(nRasters, top->getNElements());
delete mesh_layer; delete top;
return true; return true;
} }
void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned layer_id, GeoLib::Raster const& raster) void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &dem_mesh, unsigned layer_id, GeoLib::Raster const& raster)
{ {
const std::vector<MeshLib::Node*> &layer_nodes (mesh_layer.getNodes()); const std::size_t nNodes (dem_mesh.getNNodes());
const std::size_t nNodes (layer_nodes.size()); const std::vector<MeshLib::Node*> const& nodes (dem_mesh.getNodes());
const std::size_t node_id_offset (_nodes.size()); const std::size_t node_id_offset (_nodes.size());
const std::size_t last_layer_offset (node_id_offset-nNodes); const std::size_t last_layer_offset (node_id_offset-nNodes);
const double no_data_value (raster.getNoDataValue()); const double no_data_value (raster.getNoDataValue());
for (std::size_t i=0; i<nNodes; ++i) for (std::size_t i=0; i<nNodes; ++i)
{ {
if ((layer_id > 0) && // min of dem elevation and layer elevation
((std::abs((*layer_nodes[i])[2] - no_data_value) < std::numeric_limits<double>::epsilon()) || double const elevation = std::min(raster.interpolateValueAtPoint(*nodes[i]), (*nodes[i])[2]);
((*_nodes[last_layer_offset+i])[2]-(*layer_nodes[i])[2] < _elevation_epsilon)))
if ((std::abs(elevation - no_data_value) < std::numeric_limits<double>::epsilon()) ||
(elevation - (*_nodes[last_layer_offset+i])[2] < _elevation_epsilon))
_nodes.push_back(new MeshLib::Node(*_nodes[last_layer_offset+i])); _nodes.push_back(new MeshLib::Node(*_nodes[last_layer_offset+i]));
else else
_nodes.push_back(new MeshLib::Node(layer_nodes[i]->getCoords(), _nodes.size())); _nodes.push_back(new MeshLib::Node((*nodes[i])[0], (*nodes[i])[1], elevation, _nodes.size()));
} }
const std::vector<MeshLib::Element*> &layer_elements (mesh_layer.getElements()); const std::vector<MeshLib::Element*> &layer_elements (dem_mesh.getElements());
for (MeshLib::Element* elem : layer_elements) for (MeshLib::Element* elem : layer_elements)
{ {
if (elem->getGeomType() == MeshElemType::TRIANGLE) if (elem->getGeomType() == MeshElemType::TRIANGLE)
...@@ -85,7 +95,7 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned lay ...@@ -85,7 +95,7 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned lay
std::array<MeshLib::Node*,3> tri_nodes = {{ _nodes[node_id_offset+elem->getNodeIndex(0)], std::array<MeshLib::Node*,3> tri_nodes = {{ _nodes[node_id_offset+elem->getNodeIndex(0)],
_nodes[node_id_offset+elem->getNodeIndex(1)], _nodes[node_id_offset+elem->getNodeIndex(1)],
_nodes[node_id_offset+elem->getNodeIndex(2)] }}; _nodes[node_id_offset+elem->getNodeIndex(2)] }};
_elements.push_back(new MeshLib::Tri(tri_nodes, layer_id+1)); _elements.push_back(new MeshLib::Tri(tri_nodes, layer_id));
} }
else if (elem->getGeomType() == MeshElemType::QUAD) else if (elem->getGeomType() == MeshElemType::QUAD)
{ {
...@@ -93,7 +103,7 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned lay ...@@ -93,7 +103,7 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned lay
_nodes[node_id_offset+elem->getNodeIndex(1)], _nodes[node_id_offset+elem->getNodeIndex(1)],
_nodes[node_id_offset+elem->getNodeIndex(2)], _nodes[node_id_offset+elem->getNodeIndex(2)],
_nodes[node_id_offset+elem->getNodeIndex(3)] }}; _nodes[node_id_offset+elem->getNodeIndex(3)] }};
_elements.push_back(new MeshLib::Quad(quad_nodes, layer_id+1)); _elements.push_back(new MeshLib::Quad(quad_nodes, layer_id));
} }
} }
} }
...@@ -132,21 +142,21 @@ void LayeredVolume::addLayerBoundaries(const MeshLib::Mesh &layer, std::size_t n ...@@ -132,21 +142,21 @@ void LayeredVolume::addLayerBoundaries(const MeshLib::Mesh &layer, std::size_t n
void LayeredVolume::removeCongruentElements(std::size_t nLayers, std::size_t nElementsPerLayer) void LayeredVolume::removeCongruentElements(std::size_t nLayers, std::size_t nElementsPerLayer)
{ {
for (std::size_t i=1; i<nLayers; ++i) for (std::size_t i=nLayers-1; i>0; --i)
{ {
const std::size_t upper_offset ((i-1) * nElementsPerLayer); const std::size_t lower_offset ((i-1) * nElementsPerLayer);
const std::size_t lower_offset ( i * nElementsPerLayer); const std::size_t upper_offset ( i * nElementsPerLayer);
for (std::size_t j=0; j<nElementsPerLayer; ++j) for (std::size_t j=0; j<nElementsPerLayer; ++j)
{ {
MeshLib::Element *const high (_elements[upper_offset+j]); MeshLib::Element const*const high (_elements[upper_offset+j]);
MeshLib::Element const*const low (_elements[lower_offset+j]); MeshLib::Element *const low (_elements[lower_offset+j]);
unsigned count(0); unsigned count(0);
const std::size_t nElemNodes (low->getNNodes()); const std::size_t nElemNodes (low->getNNodes());
for (std::size_t k=0; k<nElemNodes; ++k) for (std::size_t k=0; k<nElemNodes; ++k)
if (high->getNodeIndex(k) == low->getNodeIndex(k)) if (high->getNodeIndex(k) == low->getNodeIndex(k))
{ {
high->setNode(k, _nodes[low->getNodeIndex(k)]); low->setNode(k, _nodes[high->getNodeIndex(k)]);
count++; count++;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment