Loading [MathJax]/extensions/tex2jax.js
OGS
MeshLib::Mesh2MeshPropertyInterpolation Class Referencefinal

Detailed Description

Class Mesh2MeshPropertyInterpolation transfers properties of mesh elements of a (source) mesh to mesh elements of another (destination) mesh deploying weighted interpolation. The two meshes must have the same dimension.

Definition at line 29 of file Mesh2MeshPropertyInterpolation.h.

#include <Mesh2MeshPropertyInterpolation.h>

Collaboration diagram for MeshLib::Mesh2MeshPropertyInterpolation:
[legend]

Public Member Functions

 Mesh2MeshPropertyInterpolation (Mesh const &src_mesh, std::string const &property_name)
 
bool setPropertiesForMesh (Mesh &dest_mesh) const
 

Private Member Functions

void interpolatePropertiesForMesh (Mesh const &dest_mesh, MeshLib::PropertyVector< double > &dest_properties) const
 
void interpolateElementPropertiesToNodeProperties (std::vector< double > &interpolated_properties) const
 

Private Attributes

Mesh const & _src_mesh
 
std::string const & _property_name
 

Constructor & Destructor Documentation

◆ Mesh2MeshPropertyInterpolation()

MeshLib::Mesh2MeshPropertyInterpolation::Mesh2MeshPropertyInterpolation ( Mesh const &  src_mesh,
std::string const &  property_name 
)

Constructor taking the source or input mesh and properties.

Parameters
src_meshthe mesh the given property information is assigned to.
property_nameis the name of a PropertyVector in the source_mesh

Definition at line 30 of file Mesh2MeshPropertyInterpolation.cpp.

Member Function Documentation

◆ interpolateElementPropertiesToNodeProperties()

void MeshLib::Mesh2MeshPropertyInterpolation::interpolateElementPropertiesToNodeProperties ( std::vector< double > &  interpolated_properties) const
private

Method interpolates the element wise given properties to the nodes of the element

Parameters
interpolated_propertiesthe vector must have the same number of entries as the source mesh has number of nodes, the content of the particular entries will be overwritten

Definition at line 151 of file Mesh2MeshPropertyInterpolation.cpp.

154 {
155  // fetch the source of property values
157  {
158  WARN("Did not find PropertyVector<double> '{:s}'.", _property_name);
159  return;
160  }
161  auto const* elem_props =
163 
164  std::vector<MeshLib::Node*> const& src_nodes(_src_mesh.getNodes());
165  const std::size_t n_src_nodes(src_nodes.size());
166  for (std::size_t k(0); k < n_src_nodes; k++)
167  {
168  const std::size_t n_con_elems(
169  _src_mesh.getElementsConnectedToNode(*src_nodes[k]).size());
170  interpolated_properties[k] = (*elem_props)
171  [_src_mesh.getElementsConnectedToNode(*src_nodes[k])[0]->getID()];
172  for (std::size_t j(1); j < n_con_elems; j++)
173  {
174  interpolated_properties[k] +=
175  (*elem_props)[_src_mesh
176  .getElementsConnectedToNode(*src_nodes[k])[j]
177  ->getID()];
178  }
179  interpolated_properties[k] /= n_con_elems;
180  }
181 }
void WARN(char const *fmt, Args const &... args)
Definition: Logging.h:37
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
Definition: Mesh.h:95
Properties & getProperties()
Definition: Mesh.h:123
std::vector< Element const * > const & getElementsConnectedToNode(std::size_t node_id) const
Definition: Mesh.cpp:232
PropertyVector< T > const * getPropertyVector(std::string const &name) const
bool existsPropertyVector(std::string const &name) const

References _property_name, _src_mesh, MeshLib::Properties::existsPropertyVector(), MeshLib::Mesh::getElementsConnectedToNode(), MeshLib::Mesh::getNodes(), MeshLib::Mesh::getProperties(), MeshLib::Properties::getPropertyVector(), and WARN().

Referenced by interpolatePropertiesForMesh().

◆ interpolatePropertiesForMesh()

void MeshLib::Mesh2MeshPropertyInterpolation::interpolatePropertiesForMesh ( Mesh const &  dest_mesh,
MeshLib::PropertyVector< double > &  dest_properties 
) const
private
Parameters
dest_mesh
dest_properties

Definition at line 87 of file Mesh2MeshPropertyInterpolation.cpp.

90 {
91  std::vector<double> interpolated_src_node_properties(
94  interpolated_src_node_properties);
95 
96  // idea: looping over the destination elements and calculate properties
97  // from interpolated_src_node_properties to accelerate the (source) point
98  // search construct a grid
99  std::vector<MeshLib::Node*> const& src_nodes(_src_mesh.getNodes());
100  GeoLib::Grid<MeshLib::Node> src_grid(src_nodes.begin(), src_nodes.end(),
101  64);
102 
103  auto const& dest_elements(dest_mesh.getElements());
104  const std::size_t n_dest_elements(dest_elements.size());
105  for (std::size_t k(0); k < n_dest_elements; k++)
106  {
107  MeshLib::Element& dest_element(*dest_elements[k]);
108  if (dest_element.getGeomType() == MeshElemType::LINE)
109  {
110  continue;
111  }
112 
113  // compute axis aligned bounding box around the current element
114  const GeoLib::AABB elem_aabb(
115  dest_element.getNodes(),
116  dest_element.getNodes() + dest_element.getNumberOfBaseNodes());
117 
118  // request "interesting" nodes from grid
119  std::vector<std::vector<MeshLib::Node*> const*> const nodes =
120  src_grid.getPntVecsOfGridCellsIntersectingCuboid(
121  elem_aabb.getMinPoint(), elem_aabb.getMaxPoint());
122 
123  std::size_t cnt(0);
124  double average_value(0.0);
125 
126  for (auto const* nodes_vec : nodes)
127  {
128  for (auto const* node : *nodes_vec)
129  {
130  if (elem_aabb.containsPointXY(*node) &&
131  MeshLib::isPointInElementXY(*node, dest_element))
132  {
133  average_value +=
134  interpolated_src_node_properties[node->getID()];
135  cnt++;
136  }
137  }
138  }
139 
140  if (cnt == 0)
141  {
142  OGS_FATAL(
143  "Mesh2MeshInterpolation: Could not find values in source mesh "
144  "for the element {:d}.",
145  k);
146  }
147  dest_properties[k] = average_value / cnt;
148  }
149 }
#define OGS_FATAL(...)
Definition: Error.h:26
Class AABB is an axis aligned bounding box around a given set of geometric points of (template) type ...
Definition: AABB.h:49
void interpolateElementPropertiesToNodeProperties(std::vector< double > &interpolated_properties) const
std::size_t getNumberOfNodes() const
Get the number of nodes.
Definition: Mesh.h:89
bool isPointInElementXY(MathLib::Point3d const &p, Element const &e)
Definition: Element.cpp:177

References _src_mesh, GeoLib::AABB::containsPointXY(), MeshLib::Mesh::getElements(), MeshLib::Element::getGeomType(), GeoLib::AABB::getMaxPoint(), GeoLib::AABB::getMinPoint(), MeshLib::Mesh::getNodes(), MeshLib::Element::getNodes(), MeshLib::Element::getNumberOfBaseNodes(), MeshLib::Mesh::getNumberOfNodes(), GeoLib::Grid< POINT >::getPntVecsOfGridCellsIntersectingCuboid(), interpolateElementPropertiesToNodeProperties(), MeshLib::isPointInElementXY(), MeshLib::LINE, and OGS_FATAL.

Referenced by setPropertiesForMesh().

◆ setPropertiesForMesh()

bool MeshLib::Mesh2MeshPropertyInterpolation::setPropertiesForMesh ( Mesh dest_mesh) const

Calculates entries for the property vector and sets appropriate indices in the mesh elements.

Parameters
dest_meshthe mesh the property information will be calculated and set via weighted interpolation
Returns
true if the operation was successful, false on error

Definition at line 36 of file Mesh2MeshPropertyInterpolation.cpp.

37 {
38  if (_src_mesh.getDimension() != dest_mesh.getDimension())
39  {
40  ERR("MeshLib::Mesh2MeshPropertyInterpolation::setPropertiesForMesh() "
41  "dimension of source (dim = {:d}) and destination (dim = {:d}) "
42  "mesh does not match.",
43  _src_mesh.getDimension(), dest_mesh.getDimension());
44  return false;
45  }
46 
47  if (_src_mesh.getDimension() != 2)
48  {
49  WARN(
50  "MeshLib::Mesh2MeshPropertyInterpolation::setPropertiesForMesh() "
51  "implemented only for 2D case at the moment.");
52  return false;
53  }
54 
55  MeshLib::PropertyVector<double>* dest_properties;
56  if (dest_mesh.getProperties().existsPropertyVector<double>(_property_name))
57  {
58  dest_properties =
59  dest_mesh.getProperties().getPropertyVector<double>(_property_name);
60  }
61  else
62  {
63  INFO("Create new PropertyVector '{:s}' of type double.",
65  dest_properties =
66  dest_mesh.getProperties().createNewPropertyVector<double>(
68  if (!dest_properties)
69  {
70  WARN(
71  "Could not get or create a PropertyVector of type double using "
72  "the given name '{:s}'.",
74  return false;
75  }
76  }
77  if (dest_properties->size() != dest_mesh.getNumberOfElements())
78  {
79  dest_properties->resize(dest_mesh.getNumberOfElements());
80  }
81 
82  interpolatePropertiesForMesh(dest_mesh, *dest_properties);
83 
84  return true;
85 }
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:32
void ERR(char const *fmt, Args const &... args)
Definition: Logging.h:42
void interpolatePropertiesForMesh(Mesh const &dest_mesh, MeshLib::PropertyVector< double > &dest_properties) const
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition: Mesh.h:71
std::size_t size() const

References _property_name, _src_mesh, MeshLib::Cell, MeshLib::Properties::createNewPropertyVector(), ERR(), MeshLib::Properties::existsPropertyVector(), MeshLib::Mesh::getDimension(), MeshLib::Mesh::getNumberOfElements(), MeshLib::Mesh::getProperties(), MeshLib::Properties::getPropertyVector(), INFO(), interpolatePropertiesForMesh(), MeshLib::PropertyVector< PROP_VAL_TYPE >::size(), and WARN().

Referenced by main().

Member Data Documentation

◆ _property_name

std::string const& MeshLib::Mesh2MeshPropertyInterpolation::_property_name
private

◆ _src_mesh

Mesh const& MeshLib::Mesh2MeshPropertyInterpolation::_src_mesh
private

The documentation for this class was generated from the following files: