OGS
ElementStatus.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
4#include "ElementStatus.h"
5
6#include "Elements/Element.h"
7#include "Mesh.h"
8#include "MeshLib/Node.h"
9
10namespace MeshLib
11{
12ElementStatus::ElementStatus(Mesh const* const mesh, bool hasAnyInactive)
13 : _mesh(mesh),
14 _element_status(mesh->getNumberOfElements(), true),
15 _hasAnyInactive(hasAnyInactive)
16{
17 const std::vector<MeshLib::Node*>& nodes(_mesh->getNodes());
18 std::transform(begin(nodes), end(nodes), back_inserter(_active_nodes),
19 [this](Node const* const n)
20 { return _mesh->getElementsConnectedToNode(*n).size(); });
21}
22
24 std::vector<int> const& vec_inactive_matIDs)
25 : ElementStatus(mesh, !vec_inactive_matIDs.empty())
26{
27 if (mesh->getProperties().existsPropertyVector<int>("MaterialIDs"))
28 {
29 auto* const materialIds =
30 mesh->getProperties().getPropertyVector<int>("MaterialIDs");
31 for (auto material_id : vec_inactive_matIDs)
32 {
33 for (auto e : _mesh->getElements())
34 {
35 if ((*materialIds)[e->getID()] == material_id)
36 {
37 setElementStatus(e->getID(), false);
38 }
39 }
40 }
41 }
42
43 _vec_active_eles.reserve(getNumberOfActiveElements());
44 const std::size_t nElems(_mesh->getNumberOfElements());
45 for (std::size_t i = 0; i < nElems; ++i)
46 {
47 if (_element_status[i])
48 {
49 _vec_active_eles.push_back(
50 const_cast<MeshLib::Element*>(_mesh->getElement(i)));
51 }
52 }
53
54 _vec_active_nodes.reserve(this->getNumberOfActiveNodes());
55 const std::size_t nNodes(_mesh->getNumberOfNodes());
56 for (std::size_t i = 0; i < nNodes; ++i)
57 {
58 if (_active_nodes[i] > 0)
59 {
60 _vec_active_nodes.push_back(
61 const_cast<MeshLib::Node*>(_mesh->getNode(i)));
62 }
63 }
64
65 DBUG(
66 "Deactivated {:d} materials and resulting active {:d} nodes and {:d} "
67 "elements",
68 vec_inactive_matIDs.size(),
69 _vec_active_nodes.size(),
70 _vec_active_eles.size());
71}
72
73std::vector<MeshLib::Element*> const& ElementStatus::getActiveElements() const
74{
76 {
77 return _vec_active_eles;
78 }
79
80 return _mesh->getElements();
81}
82
83std::vector<MeshLib::Node*> const& ElementStatus::getActiveNodes() const
84{
86 {
87 return _vec_active_nodes;
88 }
89
90 return _mesh->getNodes();
91}
92
94{
95 return _active_nodes.size() -
96 std::count(_active_nodes.cbegin(), _active_nodes.cend(), 0);
97}
98
100{
101 return static_cast<std::size_t>(
102 std::count(_element_status.cbegin(), _element_status.cend(), true));
103}
104
105void ElementStatus::setElementStatus(std::size_t i, bool status)
106{
107 if (_element_status[i] != status)
108 {
109 const int change = (status) ? 1 : -1;
110 _element_status[i] = status;
111 const unsigned nElemNodes(_mesh->getElement(i)->getNumberOfNodes());
112 MeshLib::Node const* const* const nodes =
113 _mesh->getElement(i)->getNodes();
114 for (unsigned j = 0; j < nElemNodes; ++j)
115 {
116 assert(_active_nodes[j] < 255); // if one node has >255 connected
117 // elements the data type is too
118 // small
119 _active_nodes[nodes[j]->getID()] += change;
120 }
121 }
122}
123
125{
126 return _active_nodes[node->getID()] > 0;
127}
128
129} // namespace MeshLib
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
std::size_t getID() const
std::vector< MeshLib::Element * > _vec_active_eles
bool isActiveNode(MeshLib::Node const *node) const
Returns the status of the given node.
void setElementStatus(std::size_t i, bool status)
Sets the status of element i.
MeshLib::Mesh const *const _mesh
The mesh for which the element status is administrated.
std::vector< bool > _element_status
Element status for each mesh element (active/inactive = true/false)
ElementStatus(MeshLib::Mesh const *const mesh, bool hasAnyInactive=false)
Constructor assuming all nodes and elements.
std::size_t getNumberOfActiveElements() const
Returns the total number of active elements.
std::vector< MeshLib::Node * > const & getActiveNodes() const
Returns a vector of active node IDs.
std::vector< MeshLib::Element * > const & getActiveElements() const
Returns a vector of active element IDs.
std::size_t getNumberOfActiveNodes() const
Returns the total number of active nodes.
std::vector< MeshLib::Node * > _vec_active_nodes
std::vector< unsigned char > _active_nodes
Node status for each mesh node (value = number of active elements connected to node,...
Properties & getProperties()
Definition Mesh.h:125
bool existsPropertyVector(std::string_view name) const