29 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
34 components[0].getMesh());
47 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
54 std::vector<MeshLib::MeshSubset>
const& bulk_mesh_subsets,
59 auto const first_mismatch =
60 std::adjacent_find(begin(bulk_mesh_subsets), end(bulk_mesh_subsets),
61 [](
auto const& a,
auto const& b)
62 {
return a.getMeshID() != b.getMeshID(); });
63 if (first_mismatch != end(bulk_mesh_subsets))
66 "Assumption in the MeshComponentMap violated. Expecting all of "
67 "mesh ids to be the same, but it is not true for "
68 "the mesh '{:s}' with id {:d}.",
69 first_mismatch->getMesh().getName(),
70 first_mismatch->getMeshID());
75 auto bulk_node_ids = [](
auto const& mesh)
78 if (bulk_node_ids_ptr ==
nullptr)
81 "Bulk node ids map expected in the construction of the mesh "
84 return *bulk_node_ids_ptr;
86 auto const& bulk_node_ids_map = bulk_node_ids(new_mesh_subset.
getMesh());
91 std::size_t
const new_mesh_id = new_mesh_subset.
getMeshID();
94 for (
auto*
const node : new_mesh_subset.
getNodes())
96 auto const node_id = node->getID();
107 bulk_node_ids_map[node_id]};
111 auto const global_index =
113 if (global_index ==
nop)
118 "Could not find a global index for global component "
119 "{:d} for the mesh '{:s}', node {:d}, in the "
120 "corresponding bulk mesh '{:s}' and node {:d}. This "
121 "happens because the boundary mesh is larger than the "
122 "definition region of the bulk component, usually "
123 "because the geometry for the boundary condition is "
128 bulk_mesh_subsets.front().getMesh().getName(),
129 bulk_node_ids_map[node_id]);
133 subset_dict.insert({new_location, component_id, global_index});
145 for (
auto itr_mesh_item = m.begin(); itr_mesh_item != m.end();
148 Line pos = *itr_mesh_item;
150 m.replace(itr_mesh_item, pos);
157 auto const p = m.equal_range(
Line(l));
158 std::vector<int> vec_compID;
159 for (
auto itr = p.first; itr != p.second; ++itr)
161 vec_compID.push_back(itr->comp_id);
167 int const comp_id)
const
170 auto const itr = m.find(
Line(l, comp_id));
171 return itr != m.end() ? itr->global_index :
nop;
178 auto const p = m.equal_range(
Line(l));
179 std::vector<GlobalIndexType> global_indices;
180 for (
auto itr = p.first; itr != p.second; ++itr)
182 global_indices.push_back(itr->global_index);
184 return global_indices;
188 std::vector<Location>
const& ls)
const
193 std::vector<GlobalIndexType> global_indices;
194 global_indices.reserve(ls.size());
197 for (
const auto& l : ls)
199 auto const p = m.equal_range(
Line(l));
200 for (
auto itr = p.first; itr != p.second; ++itr)
202 global_indices.push_back(itr->global_index);
206 return global_indices;
210 std::vector<Location>
const& ls)
const
213 using CIPair = std::pair<int, GlobalIndexType>;
214 std::vector<CIPair> pairs;
215 pairs.reserve(ls.size());
219 for (
const auto& l : ls)
221 auto const p = m.equal_range(
Line(l));
222 for (
auto itr = p.first; itr != p.second; ++itr)
224 pairs.emplace_back(itr->comp_id, itr->global_index);
228 auto CIPairLess = [](CIPair
const& a, CIPair
const& b)
229 {
return a.first < b.first; };
232 if (!std::is_sorted(pairs.begin(), pairs.end(), CIPairLess))
234 std::stable_sort(pairs.begin(), pairs.end(), CIPairLess);
237 std::vector<GlobalIndexType> global_indices;
238 global_indices.reserve(pairs.size());
239 transform(cbegin(pairs), cend(pairs), back_inserter(global_indices),
240 [&](
const auto& pair) {
return pair.second; });
242 return global_indices;
248 std::size_t
const range_begin,
249 std::size_t
const range_end)
const
255 if (global_index ==
nop)
264 if (global_index >= 0)
265 return global_index - range_begin;
280 auto const ghost_index_it = std::find(
284 OGS_FATAL(
"index {:d} not found in ghost_indices", real_global_index);
289 return range_end - range_begin +
296 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
301 for (
auto const& c : components)
303 std::size_t
const mesh_id = c.getMeshID();
309 comp_id, global_index++));
325 std::size_t
const global_node_id,
326 int const number_of_components_at_base_node,
327 int const number_of_components_at_high_order_node,
328 int const component_id_at_base_node,
329 int const component_id_at_high_order_node,
330 bool const is_base_node)
332 int const partition_id = partitioned_mesh.
getPartitionID(global_node_id);
334 auto const n_total_active_base_nodes_before_this_rank =
337 auto const n_total_active_high_order_nodes_before_this_rank =
340 auto const node_id_offset =
341 n_total_active_base_nodes_before_this_rank +
342 n_total_active_high_order_nodes_before_this_rank;
344 auto const index_offset = n_total_active_base_nodes_before_this_rank *
345 number_of_components_at_base_node +
346 n_total_active_high_order_nodes_before_this_rank *
347 number_of_components_at_high_order_node;
352 index_offset + (global_node_id - node_id_offset) *
353 number_of_components_at_base_node) +
354 component_id_at_base_node;
357 int const n_active_base_nodes_of_this_partition =
359 n_total_active_base_nodes_before_this_rank;
376 n_active_base_nodes_of_this_partition *
377 number_of_components_at_base_node +
378 (global_node_id - node_id_offset -
379 n_active_base_nodes_of_this_partition) *
380 number_of_components_at_high_order_node) +
381 component_id_at_high_order_node;
385 std::vector<MeshLib::MeshSubset>
const& components,
ComponentOrder order)
393 "Global index in the system of equations can only be numbered by "
394 "the order type of ComponentOrder::BY_LOCATION");
399 components[0].getMesh());
405 int components_at_high_order_nodes = 0;
406 for (
auto const& c : components)
410 components_at_high_order_nodes++;
421 int const n_components = components.size();
424 int comp_id_at_high_order_node = 0;
427 for (
auto const& c : components)
430 &c.getMesh()) !=
nullptr);
431 std::size_t
const mesh_id = c.getMeshID();
434 const auto& sub_mesh_nodes = c.getNodes();
437 for (std::size_t j = 0; j < sub_mesh_nodes.size(); j++)
439 const auto node_id = sub_mesh_nodes[j]->getID();
440 const bool is_base_node =
443 *sub_mesh_nodes[j]));
445 const auto global_node_id =
448 (!c.useTaylorHoodElements())
450 n_components * global_node_id + comp_id)
452 partitioned_mesh, global_node_id, n_components,
453 components_at_high_order_nodes, comp_id,
454 comp_id_at_high_order_node, is_base_node);
455 const bool is_ghost = partitioned_mesh.
isGhostNode(node_id);
459 global_index = -global_index;
462 if (global_index == 0)
464 global_index = -num_unknowns;
474 comp_id, global_index));
477 bool const use_whole_nodes =
482 comp_id_at_high_order_node++;
GlobalMatrix::IndexType GlobalIndexType
Definition of mesh class for partitioned mesh (by node) for parallel computing within the framework o...
Definition of the Node class.
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
Multidirectional mapping between mesh entities and degrees of freedom.
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