20 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
25 components[0].getMesh());
38 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
45 std::vector<MeshLib::MeshSubset>
const& bulk_mesh_subsets,
50 auto const first_mismatch =
51 std::adjacent_find(begin(bulk_mesh_subsets), end(bulk_mesh_subsets),
52 [](
auto const& a,
auto const& b)
53 {
return a.getMeshID() != b.getMeshID(); });
54 if (first_mismatch != end(bulk_mesh_subsets))
57 "Assumption in the MeshComponentMap violated. Expecting all of "
58 "mesh ids to be the same, but it is not true for "
59 "the mesh '{:s}' with id {:d}.",
60 first_mismatch->getMesh().getName(),
61 first_mismatch->getMeshID());
66 auto bulk_node_ids = [](
auto const& mesh)
69 if (bulk_node_ids_ptr ==
nullptr)
72 "Bulk node ids map expected in the construction of the mesh "
75 return *bulk_node_ids_ptr;
77 auto const& bulk_node_ids_map = bulk_node_ids(new_mesh_subset.
getMesh());
82 std::size_t
const new_mesh_id = new_mesh_subset.
getMeshID();
85 for (
auto*
const node : new_mesh_subset.
getNodes())
87 auto const node_id = node->getID();
98 bulk_node_ids_map[node_id]};
102 auto const global_index =
104 if (global_index ==
nop)
109 "Could not find a global index for global component "
110 "{:d} for the mesh '{:s}', node {:d}, in the "
111 "corresponding bulk mesh '{:s}' and node {:d}. This "
112 "happens because the boundary mesh is larger than the "
113 "definition region of the bulk component, usually "
114 "because the geometry for the boundary condition is "
119 bulk_mesh_subsets.front().getMesh().getName(),
120 bulk_node_ids_map[node_id]);
124 subset_dict.insert({new_location, component_id, global_index});
136 for (
auto itr_mesh_item = m.begin(); itr_mesh_item != m.end();
139 Line pos = *itr_mesh_item;
141 m.replace(itr_mesh_item, pos);
148 auto const p = m.equal_range(
Line(l));
149 std::vector<int> vec_compID;
150 for (
auto itr = p.first; itr != p.second; ++itr)
152 vec_compID.push_back(itr->comp_id);
158 int const comp_id)
const
161 auto const itr = m.find(
Line(l, comp_id));
162 return itr != m.end() ? itr->global_index :
nop;
169 auto const p = m.equal_range(
Line(l));
170 std::vector<GlobalIndexType> global_indices;
171 for (
auto itr = p.first; itr != p.second; ++itr)
173 global_indices.push_back(itr->global_index);
175 return global_indices;
179 std::vector<Location>
const& ls)
const
184 std::vector<GlobalIndexType> global_indices;
185 global_indices.reserve(ls.size());
188 for (
const auto& l : ls)
190 auto const p = m.equal_range(
Line(l));
191 for (
auto itr = p.first; itr != p.second; ++itr)
193 global_indices.push_back(itr->global_index);
197 return global_indices;
201 std::vector<Location>
const& ls)
const
204 using CIPair = std::pair<int, GlobalIndexType>;
205 std::vector<CIPair> pairs;
206 pairs.reserve(ls.size());
210 for (
const auto& l : ls)
212 auto const p = m.equal_range(
Line(l));
213 for (
auto itr = p.first; itr != p.second; ++itr)
215 pairs.emplace_back(itr->comp_id, itr->global_index);
219 auto CIPairLess = [](CIPair
const& a, CIPair
const& b)
220 {
return a.first < b.first; };
223 if (!std::is_sorted(pairs.begin(), pairs.end(), CIPairLess))
225 std::stable_sort(pairs.begin(), pairs.end(), CIPairLess);
228 std::vector<GlobalIndexType> global_indices;
229 global_indices.reserve(pairs.size());
230 transform(cbegin(pairs), cend(pairs), back_inserter(global_indices),
231 [&](
const auto& pair) {
return pair.second; });
233 return global_indices;
239 std::size_t
const range_begin,
240 std::size_t
const range_end)
const
246 if (global_index ==
nop)
255 if (global_index >= 0)
256 return global_index - range_begin;
271 auto const ghost_index_it = std::find(
275 OGS_FATAL(
"index {:d} not found in ghost_indices", real_global_index);
280 return range_end - range_begin +
287 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
292 for (
auto const& c : components)
294 std::size_t
const mesh_id = c.getMeshID();
300 comp_id, global_index++));
316 std::size_t
const global_node_id,
317 int const number_of_components_at_base_node,
318 int const number_of_components_at_high_order_node,
319 int const component_id_at_base_node,
320 int const component_id_at_high_order_node,
321 bool const is_base_node)
323 int const partition_id = partitioned_mesh.
getPartitionID(global_node_id);
325 auto const n_total_active_base_nodes_before_this_rank =
328 auto const n_total_active_high_order_nodes_before_this_rank =
331 auto const node_id_offset =
332 n_total_active_base_nodes_before_this_rank +
333 n_total_active_high_order_nodes_before_this_rank;
335 auto const index_offset = n_total_active_base_nodes_before_this_rank *
336 number_of_components_at_base_node +
337 n_total_active_high_order_nodes_before_this_rank *
338 number_of_components_at_high_order_node;
343 index_offset + (global_node_id - node_id_offset) *
344 number_of_components_at_base_node) +
345 component_id_at_base_node;
348 int const n_active_base_nodes_of_this_partition =
350 n_total_active_base_nodes_before_this_rank;
367 n_active_base_nodes_of_this_partition *
368 number_of_components_at_base_node +
369 (global_node_id - node_id_offset -
370 n_active_base_nodes_of_this_partition) *
371 number_of_components_at_high_order_node) +
372 component_id_at_high_order_node;
376 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
384 "Global index in the system of equations can only be numbered by "
385 "the order type of ComponentOrder::BY_LOCATION");
390 components[0].getMesh());
396 int components_at_high_order_nodes = 0;
397 for (
auto const& c : components)
401 components_at_high_order_nodes++;
412 int const n_components = components.size();
415 int comp_id_at_high_order_node = 0;
418 for (
auto const& c : components)
421 &c.getMesh()) !=
nullptr);
422 std::size_t
const mesh_id = c.getMeshID();
425 const auto& sub_mesh_nodes = c.getNodes();
428 for (std::size_t j = 0; j < sub_mesh_nodes.size(); j++)
430 const auto node_id = sub_mesh_nodes[j]->getID();
431 const bool is_base_node =
434 *sub_mesh_nodes[j]));
436 const auto global_node_id =
439 (!c.useTaylorHoodElements())
441 n_components * global_node_id + comp_id)
443 partitioned_mesh, global_node_id, n_components,
444 components_at_high_order_nodes, comp_id,
445 comp_id_at_high_order_node, is_base_node);
446 const bool is_ghost = partitioned_mesh.
isGhostNode(node_id);
450 global_index = -global_index;
453 if (global_index == 0)
455 global_index = -num_unknowns;
465 comp_id, global_index));
468 bool const use_whole_nodes =
473 comp_id_at_high_order_node++;
GlobalMatrix::IndexType GlobalIndexType
A subset of nodes on a single mesh.
Mesh const & getMesh() const
std::size_t getMeshID() const
return this mesh ID
std::vector< Node * > const & getNodes() const
const std::string getName() const
Get name of the mesh.
std::size_t getNumberOfNodes() const
Get the number of nodes.
std::vector< Element const * > const & getElementsConnectedToNode(std::size_t node_id) const
std::size_t getPartitionID(const std::size_t global_node_id) const
bool isGhostNode(const std::size_t node_id) const
Check whether a node with ID of node_id is a ghost node.
std::size_t getNumberOfRegularHighOrderNodesAtRank(int const partition_id) const
std::size_t getGlobalNodeID(const std::size_t node_id) const
Get the global node ID of a node with its local ID.
std::size_t getNumberOfGlobalNodes() const
Get the number of all nodes of the global mesh.
bool isForSingleThread() const
std::size_t getNumberOfGlobalBaseNodes() const
Get the number of nodes of the global mesh for linear elements.
std::size_t getNumberOfRegularBaseNodesAtRank(int const partition_id) const
void createParallelMeshComponentMap(std::vector< MeshLib::MeshSubset > const &components, ComponentOrder order)
std::vector< int > getComponentIDs(const Location &l) const
MeshLib::Location Location
std::size_t _num_global_dof
Number of global unknowns. Used internally only.
MeshComponentMap(std::vector< MeshLib::MeshSubset > const &components, ComponentOrder order)
GlobalIndexType getGlobalIndex(Location const &l, int const comp_id) const
GlobalIndexType getLocalIndex(Location const &l, int const comp_id, std::size_t const range_begin, std::size_t const range_end) const
static constexpr NUMLIB_EXPORT GlobalIndexType const nop
MeshComponentMap getSubset(std::vector< MeshLib::MeshSubset > const &bulk_mesh_subsets, MeshLib::MeshSubset const &new_mesh_subset) const
detail::ComponentGlobalIndexDict _dict
std::vector< GlobalIndexType > getGlobalIndices(const Location &l) const
void renumberByLocation(GlobalIndexType offset=0)
std::size_t _num_local_dof
std::vector< GlobalIndexType > _ghosts_indices
Global ID for ghost entries.
std::vector< GlobalIndexType > getGlobalIndicesByComponent(const std::vector< Location > &ls) const
void createSerialMeshComponentMap(std::vector< MeshLib::MeshSubset > const &components, ComponentOrder order)
std::vector< GlobalIndexType > getGlobalIndicesByLocation(const std::vector< Location > &ls) const
constexpr ranges::views::view_closure ids
For an element of a range view return its id.
bool isBaseNode(Node const &node, std::vector< Element const * > const &elements_connected_to_node)
PropertyVector< std::size_t > const * bulkNodeIDs(Mesh const &mesh)
boost::multi_index::multi_index_container< Line, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ByLocationAndComponent >, boost::multi_index::identity< Line >, LineByLocationAndComponentComparator >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ByLocation >, boost::multi_index::identity< Line >, LineByLocationComparator >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ByComponent >, boost::multi_index::member< Line, int, &Line::comp_id > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ByGlobalIndex >, boost::multi_index::member< Line, GlobalIndexType, &Line::global_index > > > > ComponentGlobalIndexDict
GlobalIndexType getGlobalIndexWithTaylorHoodElement(MeshLib::NodePartitionedMesh const &partitioned_mesh, std::size_t const global_node_id, int const number_of_components_at_base_node, int const number_of_components_at_high_order_node, int const component_id_at_base_node, int const component_id_at_high_order_node, bool const is_base_node)
ComponentOrder
Ordering of components in global matrix/vector.
@ BY_LOCATION
Ordering data by spatial location.
GlobalIndexType global_index