libMesh
topology_map.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 // Local Includes
21 #include "libmesh/elem.h"
22 #include "libmesh/topology_map.h"
23 #include "libmesh/mesh_base.h"
24 #include "libmesh/node.h"
25 #include "libmesh/parallel_only.h"
26 #include "libmesh/remote_elem.h"
27 #include "libmesh/libmesh_logging.h"
28 
29 // C++ Includes
30 #include <limits>
31 #include <utility>
32 
33 namespace libMesh
34 {
35 
37 {
38  // This function must be run on all processors at once
39  // for non-serial meshes
40  if (!mesh.is_serial())
41  libmesh_parallel_only(mesh.comm());
42 
43  LOG_SCOPE("init()", "TopologyMap");
44 
45  // Clear the old map
46  _map.clear();
47 
48  this->fill(mesh);
49 }
50 
51 
52 
53 void TopologyMap::add_node(const Node & mid_node,
54  const std::vector<std::pair<dof_id_type, dof_id_type>> & bracketing_nodes)
55 {
56  const dof_id_type mid_node_id = mid_node.id();
57 
58  libmesh_assert_not_equal_to(mid_node_id, DofObject::invalid_id);
59 
60  for (auto [id1, id2] : bracketing_nodes)
61  {
62  libmesh_assert_not_equal_to(id1, id2);
63 
64  const dof_id_type lower_id = std::min(id1, id2);
65  const dof_id_type upper_id = std::max(id1, id2);
66 
67  // We should never be inserting inconsistent data
68 #ifndef NDEBUG
69  if (const auto it = _map.find(std::make_pair(lower_id, upper_id));
70  it != _map.end())
71  libmesh_assert_equal_to (it->second, mid_node_id);
72 #endif
73 
74  this->_map.emplace(std::make_pair(lower_id, upper_id),
75  mid_node_id);
76 
77  }
78 }
79 
80 
81 dof_id_type TopologyMap::find(const std::vector<std::pair<dof_id_type, dof_id_type>> & bracketing_nodes) const
82 {
83  dof_id_type new_node_id = DofObject::invalid_id;
84 
85  for (auto pair : bracketing_nodes)
86  {
87  const dof_id_type lower_id = std::min(pair.first, pair.second);
88  const dof_id_type upper_id = std::max(pair.first, pair.second);
89 
90  const dof_id_type possible_new_node_id =
91  this->find(lower_id, upper_id);
92 
93  if (possible_new_node_id != DofObject::invalid_id)
94  {
95  // If we found a node already, but we're still here, it's to
96  // debug map consistency: we'd better always find the same
97  // node
98  if (new_node_id != DofObject::invalid_id)
99  libmesh_assert_equal_to (new_node_id, possible_new_node_id);
100 
101  new_node_id = possible_new_node_id;
102  }
103 
104  // If we're not debugging map consistency then we can quit as
105  // soon as we find a node
106 #ifdef NDEBUG
107  if (new_node_id != DofObject::invalid_id)
108  break;
109 #endif
110  }
111  return new_node_id;
112 }
113 
114 
116  dof_id_type bracket_node2) const
117 {
118  const dof_id_type lower_id = std::min(bracket_node1, bracket_node2);
119  const dof_id_type upper_id = std::max(bracket_node1, bracket_node2);
120 
121  if (const auto it = _map.find(std::make_pair(lower_id, upper_id));
122  it != _map.end())
123  {
124  libmesh_assert_not_equal_to (it->second, DofObject::invalid_id);
125  return it->second;
126  }
127 
128  // If not found, return invalid_id
129  return DofObject::invalid_id;
130 }
131 
132 
133 
134 #ifdef LIBMESH_ENABLE_AMR
135 
137 {
138  // Populate the nodes map
139  for (const auto & elem : mesh.element_ptr_range())
140  {
141  // We only need to add nodes which might be added during mesh
142  // refinement; this means they need to be child nodes.
143  if (!elem->has_children())
144  continue;
145 
146  for (unsigned int c = 0, nc = elem->n_children(); c != nc; ++c)
147  {
148  const Elem * child = elem->child_ptr(c);
149  if (child == remote_elem)
150  continue;
151 
152  for (unsigned int n = 0, nnic = elem->n_nodes_in_child(c); n != nnic; ++n)
153  {
154  const std::vector<std::pair<dof_id_type, dof_id_type>>
155  bracketing_nodes = elem->bracketing_nodes(c,n);
156 
157  this->add_node(child->node_ref(n), bracketing_nodes);
158  }
159  }
160  }
161 }
162 
163 #else
164 
165 // no-op without AMR
166 void TopologyMap::fill(const MeshBase &) {}
167 
168 #endif
169 
170 
171 
172 } // namespace libMesh
virtual const std::vector< std::pair< dof_id_type, dof_id_type > > bracketing_nodes(unsigned int c, unsigned int n) const
Definition: elem.C:2657
A Node is like a Point, but with more information.
Definition: node.h:52
dof_id_type find(dof_id_type bracket_node1, dof_id_type bracket_node2) const
Definition: topology_map.C:115
void add_node(const Node &mid_node, const std::vector< std::pair< dof_id_type, dof_id_type >> &bracketing_nodes)
Add a node to the map, between each pair of specified bracketing nodes.
Definition: topology_map.C:53
This is the base class from which all geometric element types are derived.
Definition: elem.h:94
MeshBase & mesh
void init(MeshBase &)
Definition: topology_map.C:36
void fill(const MeshBase &)
Definition: topology_map.C:136
The libMesh namespace provides an interface to certain functionality in the library.
This is the MeshBase class.
Definition: mesh_base.h:75
const Node & node_ref(const unsigned int i) const
Definition: elem.h:2529
dof_id_type id() const
Definition: dof_object.h:828
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3163
uint8_t dof_id_type
Definition: id_types.h:67
const RemoteElem * remote_elem
Definition: remote_elem.C:57