19#include <range/v3/algorithm/transform.hpp>
20#include <range/v3/range/conversion.hpp>
21#include <unordered_map>
53 OGS_FATAL(
"Mesh items other than nodes and cells are not supported.");
57 std::ostream& os, std::vector<std::size_t>
const& global_node_ids)
const
59 std::vector<MeshLib::IO::NodeData> nodes_buffer;
60 nodes_buffer.reserve(
nodes.size());
62 for (
const auto* node :
nodes)
64 double const* coords = node->data();
65 nodes_buffer.emplace_back(global_node_ids[node->getID()], coords[0],
66 coords[1], coords[2]);
68 return os.write(
reinterpret_cast<const char*
>(nodes_buffer.data()),
77 std::vector<const MeshLib::Element*>
const& elements)
79 return 3 * elements.size() +
80 std::accumulate(begin(elements), end(elements), 0,
81 [](
auto const nnodes,
auto const* e)
82 {
return nnodes + e->getNumberOfNodes(); });
88 static_cast<long>(
nodes.size()),
102 return os.write(
reinterpret_cast<const char*
>(data),
sizeof(data));
106 std::vector<std::size_t>
const& partition_ids,
107 std::vector<std::size_t>
const& node_id_mapping)
109 return partition_ids[node_id_mapping[node_id]];
112std::pair<std::vector<MeshLib::Node const*>, std::vector<MeshLib::Node const*>>
117 std::vector<MeshLib::Node const*> base_nodes;
120 base_nodes.reserve(nodes.size() / 2);
121 std::vector<MeshLib::Node const*> higher_order_nodes;
124 higher_order_nodes.reserve(nodes.size() / 2);
128 begin(nodes), end(nodes), std::back_inserter(base_nodes),
129 std::back_inserter(higher_order_nodes),
133 return {base_nodes, higher_order_nodes};
139std::tuple<std::vector<MeshLib::Node*>, std::vector<MeshLib::Node*>>
141 std::size_t
const part_id,
142 std::vector<MeshLib::Node*>
const& nodes,
143 std::vector<MeshLib::Element const*>
const& ghost_elements,
144 std::vector<std::size_t>
const& partition_ids,
146 std::vector<std::size_t>
const& node_id_mapping)
148 std::vector<MeshLib::Node*> base_ghost_nodes;
149 std::vector<MeshLib::Node*> higher_order_ghost_nodes;
151 std::vector<bool> is_ghost_node(nodes.size(),
false);
152 for (
const auto* ghost_elem : ghost_elements)
154 for (
unsigned i = 0; i < ghost_elem->getNumberOfNodes(); i++)
156 auto const& n = ghost_elem->getNode(i);
157 auto const node_id = n->getID();
158 if (is_ghost_node[node_id])
168 base_ghost_nodes.push_back(nodes[node_id]);
172 higher_order_ghost_nodes.push_back(nodes[node_id]);
174 is_ghost_node[node_id] =
true;
178 return std::tuple<std::vector<MeshLib::Node*>, std::vector<MeshLib::Node*>>{
179 base_ghost_nodes, higher_order_ghost_nodes};
187 std::size_t
const offset,
191 auto const& nodes = p.nodes;
192 auto const nnodes = nodes.size();
194 for (std::size_t i = 0; i < nnodes; ++i)
196 const auto global_id = nodes[i]->getID();
197 std::copy_n(&pv[n_components * global_id], n_components,
198 &partitioned_pv[offset + n_components * i]);
200 return n_components * nnodes;
209 std::size_t
const offset,
213 std::size_t
const n_regular(p.regular_elements.size());
215 for (std::size_t i = 0; i < n_regular; ++i)
217 const auto id = p.regular_elements[i]->getID();
218 std::copy_n(&pv[n_components *
id], n_components,
219 &partitioned_pv[offset + n_components * i]);
222 std::size_t
const n_ghost(p.ghost_elements.size());
223 for (std::size_t i = 0; i < n_ghost; ++i)
225 const auto id = p.ghost_elements[i]->getID();
226 std::copy_n(&pv[n_components *
id], n_components,
227 &partitioned_pv[offset + n_components * (n_regular + i)]);
229 return n_components * (n_regular + n_ghost);
240 std::size_t
const id_offset_partition,
241 std::vector<std::size_t>
const& element_ip_data_offsets,
250 std::copy_n(&pv[0], pv.
size(), &partitioned_pv[id_offset_partition]);
256 std::size_t id_offset = 0;
259 [&](std::vector<const MeshLib::Element*>
const& elements)
264 for (
auto const element : elements)
266 int const number_of_element_field_data =
271 auto const element_id = element->getID();
272 int const begin_pos = element_ip_data_offsets[element_id];
273 int const end_pos = element_ip_data_offsets[element_id + 1];
275 std::copy(pv.begin() + begin_pos, pv.begin() + end_pos,
276 &partitioned_pv[id_offset + id_offset_partition]);
277 id_offset += number_of_element_field_data;
281 copyFieldData(p.regular_elements);
282 copyFieldData(p.ghost_elements);
288 std::vector<Partition>& partitions)
290 for (
auto const& [name, property] : properties)
292 auto const item_type =
property->getMeshItemType();
301 if (property->getPropertyName().find(
"_ip") == std::string::npos)
306 std::string
const property_name =
property->getPropertyName();
307 auto countIntegrationPoints =
308 [&](std::vector<const MeshLib::Element*>
const& elements)
310 auto const ip_meta_data =
312 std::size_t counter = 0;
313 for (
auto const element : elements)
315 int const number_of_integration_points =
317 ip_meta_data, *element);
318 counter += number_of_integration_points;
323 for (
auto& p : partitions)
325 p.number_of_integration_points =
326 countIntegrationPoints(p.regular_elements) +
327 countIntegrationPoints(p.ghost_elements);
335 std::vector<MeshLib::Element*>
const& global_mesh_elements,
338 std::vector<Partition>
const& partitions,
340 std::map<MeshLib::MeshItemType, std::size_t>
const& total_number_of_tuples)
348 std::size_t partitioned_pv_size = total_number_of_tuples.at(item_type) *
351 std::vector<std::size_t> element_ip_data_offsets;
359 partitioned_pv_size = pv->
size() * partitions.size();
362 element_ip_data_offsets =
364 global_mesh_elements, *pv, properties);
370 partitioned_pv->resize(partitioned_pv_size);
372 auto copy_property_vector_values =
373 [&](
Partition const& p, std::size_t offset)
378 element_ip_data_offsets,
379 *pv, *partitioned_pv);
394 "Copying of property vector values for mesh item type {:s} is not "
396 toString(item_type));
399 std::size_t position_offset(0);
400 for (
auto p : partitions)
402 position_offset += copy_property_vector_values(p, position_offset);
408 std::vector<Partition>
const& partitions,
409 std::size_t
const total_number_of_cells)
411 auto* vtk_ghost_type =
414 if (vtk_ghost_type ==
nullptr)
416 OGS_FATAL(
"Could not create vtkGhostType cell data array.");
419 vtk_ghost_type->resize(total_number_of_cells);
420 std::size_t offset = 0;
421 for (
auto const& partition : partitions)
423 offset += partition.regular_elements.size();
424 for (std::size_t i = 0; i < partition.ghost_elements.size(); ++i)
426 if (partition.duplicate_ghost_cell[i])
428 (*vtk_ghost_type)[offset + i] |=
429 vtkDataSetAttributes::DUPLICATECELL;
432 offset += partition.ghost_elements.size();
438 std::unique_ptr<MeshLib::Mesh>
const& mesh,
439 std::vector<Partition>& partitions)
449 auto count_tuples = [&](
MeshItemType const mesh_item_type)
451 return std::accumulate(
452 begin(partitions), end(partitions), 0,
453 [&](std::size_t
const sum,
Partition const& p)
454 {
return sum + p.numberOfMeshItems(mesh_item_type); });
457 std::map<MeshItemType, std::size_t>
const total_number_of_tuples = {
458 {MeshItemType::Cell, count_tuples(MeshItemType::Cell)},
459 {MeshItemType::Node, count_tuples(MeshItemType::Node)},
460 {MeshItemType::IntegrationPoint,
461 count_tuples(MeshItemType::IntegrationPoint)}};
464 "total number of tuples after partitioning defined for cells is {:d} "
465 "and for nodes {:d} and for integration points {:d}.",
466 total_number_of_tuples.at(MeshItemType::Cell),
467 total_number_of_tuples.at(MeshItemType::Node),
468 total_number_of_tuples.at(MeshItemType::IntegrationPoint));
475 [&](
auto type,
auto const property)
478 mesh->getElements(), partitioned_properties, properties,
481 total_number_of_tuples);
486 total_number_of_tuples.at(MeshItemType::Cell));
488 return partitioned_properties;
492 std::vector<Partition>& partitions)
494 std::vector<bool> cell_visited(mesh.
getElements().size(),
false);
496 for (
auto& partition : partitions)
498 partition.duplicate_ghost_cell.resize(partition.ghost_elements.size(),
501 for (std::size_t i = 0; i < partition.ghost_elements.size(); i++)
503 const auto& ghost_element = *partition.ghost_elements[i];
504 if (!cell_visited[ghost_element.getID()])
506 cell_visited[ghost_element.getID()] =
true;
507 partition.duplicate_ghost_cell[i] =
false;
514 std::vector<MeshLib::Element*>
const& global_mesh_elements,
517 for (
auto const& [name, property] : properties)
519 auto const item_type =
property->getMeshItemType();
528 if (property->getPropertyName().find(
"_ip") == std::string::npos)
533 std::size_t number_of_total_integration_points = 0;
535 properties, property->getPropertyName());
536 for (
auto const element : global_mesh_elements)
538 int const number_of_integration_points =
541 number_of_total_integration_points += number_of_integration_points;
547 if (pv->size() != number_of_total_integration_points * component_number)
550 "The property vector's size {:d} for integration point data "
551 "{:s} does not match its actual size {:d}. The field data in "
552 "the vtu file are wrong.",
554 number_of_total_integration_points * component_number);
560 std::vector<std::size_t>
const& node_partition_map,
561 std::vector<MeshLib::Element*>
const& elements,
562 std::vector<std::size_t>
const& bulk_node_ids)
564 auto node_partition_ids = ranges::views::transform(
567 auto node_lookup = ranges::views::transform(
568 [&](std::size_t
const i)
569 {
return node_partition_map[bulk_node_ids[i]]; });
572 ranges::to<std::vector>;
575 return elements | node_partition_ids | ranges::to<std::vector>;
579 std::vector<Partition>& partitions,
580 std::vector<std::size_t>
const& nodes_partition_ids,
581 std::vector<MeshLib::Node*>
const& nodes,
582 std::vector<std::size_t>
const& bulk_node_ids)
584 for (
auto const*
const node : nodes)
586 partitions[nodes_partition_ids[bulk_node_ids[node->getID()]]]
587 .nodes.push_back(node);
594 std::vector<MeshLib::Node const*> higher_order_nodes;
597 std::tie(partition.
nodes, higher_order_nodes) =
600 std::copy(begin(higher_order_nodes), end(higher_order_nodes),
601 std::back_inserter(partition.
nodes));
606 std::vector<Partition>& partitions,
MeshLib::Mesh const& mesh)
608 for (
auto& partition : partitions)
619 for (
auto& partition : partitions)
621 partition.number_of_regular_nodes = partition.nodes.size();
622 partition.number_of_mesh_base_nodes = number_of_mesh_base_nodes;
623 partition.number_of_mesh_all_nodes = number_of_mesh_all_nodes;
628 std::vector<Partition>& partitions,
630 std::vector<std::vector<std::size_t>>
const& partition_ids_per_element)
634 auto const element_id = element->getID();
635 auto node_partition_ids = partition_ids_per_element[element_id];
637 std::sort(node_partition_ids.begin(), node_partition_ids.end());
639 std::unique(node_partition_ids.begin(), node_partition_ids.end());
640 node_partition_ids.erase(last, node_partition_ids.end());
643 if (node_partition_ids.size() == 1)
645 partitions[node_partition_ids[0]].regular_elements.push_back(
650 for (
auto const partition_id : node_partition_ids)
652 partitions[partition_id].ghost_elements.push_back(element);
662 std::vector<Partition>& partitions,
MeshLib::Mesh const& mesh,
663 std::vector<std::size_t>
const& nodes_partition_ids,
664 std::vector<std::size_t>
const& node_id_mapping)
666 for (std::size_t part_id = 0; part_id < partitions.size(); part_id++)
668 auto& partition = partitions[part_id];
669 std::vector<MeshLib::Node*> base_ghost_nodes;
670 std::vector<MeshLib::Node*> higher_order_ghost_nodes;
671 std::tie(base_ghost_nodes, higher_order_ghost_nodes) =
673 part_id, mesh.
getNodes(), partition.ghost_elements,
674 nodes_partition_ids, mesh, node_id_mapping);
676 std::copy(begin(base_ghost_nodes), end(base_ghost_nodes),
677 std::back_inserter(partition.nodes));
679 partition.number_of_base_nodes =
680 partition.number_of_regular_base_nodes + base_ghost_nodes.size();
682 std::copy(begin(higher_order_ghost_nodes),
683 end(higher_order_ghost_nodes),
684 std::back_inserter(partition.nodes));
690 std::vector<std::size_t>
const& nodes_partition_ids,
691 std::vector<std::size_t>
const& bulk_node_ids)
696 nodes_partition_ids, mesh.
getElements(), bulk_node_ids);
697 INFO(
"partitionMesh(): Partition IDs per element computed in {:g} s",
703 INFO(
"partitionMesh(): distribute nodes to partitions took {:g} s",
709 "partitionMesh(): sorting [base nodes | higher order nodes] took {:g} "
716 "partitionMesh(): setting number of nodes and of all mesh base nodes "
722 partition_ids_per_element);
723 INFO(
"partitionMesh(): distribute elements into partitions took {:g} s",
728 partitions, mesh, nodes_partition_ids, bulk_node_ids);
729 INFO(
"partitionMesh(): determine / append ghost nodes took {:g} s",
734 INFO(
"partitionMesh(): markDuplicateGhostCells took {:g} s",
740 std::vector<std::size_t> bulk_node_ids(
_mesh->getNumberOfNodes());
741 std::iota(bulk_node_ids.begin(), bulk_node_ids.end(), 0);
757 std::vector<Partition>
const& partitions,
760 auto const bulk_node_ids_string =
769 auto const bulk_element_ids_string =
772 static_cast<std::string
>(bulk_element_ids_string),
784 std::vector<Partition>
const& local_partitions)
const
786 if (bulk_node_ids_pv ==
nullptr)
791 auto& bulk_node_ids = *bulk_node_ids_pv;
793 std::size_t offset = 0;
795 assert(
_partitions.size() == local_partitions.size());
796 int const n_partitions =
static_cast<int>(
_partitions.size());
797 for (
int partition_id = 0; partition_id < n_partitions; ++partition_id)
799 auto const& bulk_partition =
_partitions[partition_id];
800 auto const& local_partition = local_partitions[partition_id];
803 auto const& bulk_nodes = bulk_partition.nodes;
804 auto const n_bulk_nodes = bulk_nodes.size();
805 std::map<std::size_t, std::size_t> global_to_local;
806 for (std::size_t local_node_id = 0; local_node_id < n_bulk_nodes;
809 global_to_local[bulk_nodes[local_node_id]->getID()] = local_node_id;
812 auto const& local_nodes = local_partition.nodes;
813 auto const n_local_nodes = local_nodes.size();
814 for (std::size_t local_node_id = 0; local_node_id < n_local_nodes;
817 bulk_node_ids[offset + local_node_id] =
818 global_to_local[bulk_node_ids[offset + local_node_id]];
820 offset += n_local_nodes;
826 std::vector<Partition>
const& local_partitions)
const
828 if (bulk_element_ids_pv ==
nullptr)
833 auto& bulk_element_ids = *bulk_element_ids_pv;
835 std::size_t offset = 0;
837 assert(
_partitions.size() == local_partitions.size());
838 int const n_partitions =
static_cast<int>(
_partitions.size());
839 for (
int partition_id = 0; partition_id < n_partitions; ++partition_id)
841 auto const& bulk_partition =
_partitions[partition_id];
842 auto const& local_partition = local_partitions[partition_id];
845 std::map<std::size_t, std::size_t> global_to_local;
848 std::vector<MeshLib::Element const*>
const& elements,
849 std::size_t
const offset)
851 auto const n_elements = elements.size();
852 for (std::size_t e = 0; e < n_elements; ++e)
854 global_to_local[elements[e]->getID()] = offset + e;
858 map_elements(bulk_partition.regular_elements, 0);
859 map_elements(bulk_partition.ghost_elements,
860 bulk_partition.regular_elements.size());
863 auto renumber_elements =
864 [&bulk_element_ids, &global_to_local](
865 std::vector<MeshLib::Element const*>
const& elements,
866 std::size_t
const offset)
868 auto const n_elements = elements.size();
869 for (std::size_t e = 0; e < n_elements; ++e)
871 bulk_element_ids[offset + e] =
872 global_to_local[bulk_element_ids[offset + e]];
877 offset += renumber_elements(local_partition.regular_elements, offset);
878 offset += renumber_elements(local_partition.ghost_elements, offset);
885 auto const bulk_node_ids_string =
887 auto const& bulk_node_ids =
891 std::vector<Partition> partitions(
_partitions.size());
900 std::size_t node_global_id_offset = 0;
904 for (std::size_t i = 0; i < partition.number_of_regular_nodes; i++)
907 node_global_id_offset++;
916 os.write(
reinterpret_cast<const char*
>(pv.data()), pv.
size() *
sizeof(T));
922 std::ostream& out_val, std::ostream& out_meta)
947 std::vector<Partition>
const& partitions,
950 auto const number_of_properties =
951 partitioned_properties.
size(mesh_item_type);
952 if (number_of_properties == 0)
957 auto const file_name_infix = toString(mesh_item_type);
959 auto const file_name_cfg = file_name_base +
"_partitioned_" +
960 file_name_infix +
"_properties_cfg" +
961 std::to_string(partitions.size()) +
".bin";
962 std::ofstream out(file_name_cfg, std::ios::binary);
965 OGS_FATAL(
"Could not open file '{:s}' for output.", file_name_cfg);
968 auto const file_name_val = file_name_base +
"_partitioned_" +
969 file_name_infix +
"_properties_val" +
970 std::to_string(partitions.size()) +
".bin";
971 std::ofstream out_val(file_name_val, std::ios::binary);
974 OGS_FATAL(
"Could not open file '{:s}' for output.", file_name_val);
980 partitioned_properties,
981 [&](
auto type,
auto const& property)
986 mesh_item_type, out_val, out);
989 unsigned long offset = 0;
990 for (
const auto& partition : partitions)
993 offset,
static_cast<unsigned long>(
994 partition.numberOfMeshItems(mesh_item_type))};
996 "Write meta data for node-based PropertyVector: global offset "
997 "{:d}, number of tuples {:d}",
998 pvpmd.offset, pvpmd.number_of_tuples);
1000 offset += pvpmd.number_of_tuples;
1010 std::ostream&
writeConfig(std::ostream& os)
const;
1015 os.write(
reinterpret_cast<const char*
>(
this),
sizeof(
ConfigOffsets));
1017 static long reserved = 0;
1019 return os.write(
reinterpret_cast<const char*
>(&reserved),
sizeof(
long));
1031 return {
static_cast<long>(partition.
nodes.size()),
1063 const std::string& file_name_base, std::vector<Partition>
const& partitions)
1065 auto const file_name_cfg = file_name_base +
"_partitioned_msh_cfg" +
1066 std::to_string(partitions.size()) +
".bin";
1067 std::ofstream of_bin_cfg(file_name_cfg, std::ios::binary);
1070 OGS_FATAL(
"Could not open file '{:s}' for output.", file_name_cfg);
1073 std::vector<long> partitions_element_offsets;
1074 partitions_element_offsets.reserve(partitions.size());
1075 std::vector<long> partitions_ghost_element_offsets;
1076 partitions_ghost_element_offsets.reserve(partitions.size());
1079 for (
const auto& partition : partitions)
1081 partition.writeConfig(of_bin_cfg);
1088 partitions_element_offsets.push_back(
1089 partition_offsets.regular_elements);
1090 partitions_ghost_element_offsets.push_back(
1091 partition_offsets.ghost_elements);
1094 return std::make_tuple(partitions_element_offsets,
1095 partitions_ghost_element_offsets);
1107 const std::unordered_map<std::size_t, long>& local_node_ids,
1108 std::vector<long>& elem_info,
1111 constexpr unsigned mat_id =
1114 elem_info[counter++] = mat_id;
1115 elem_info[counter++] =
static_cast<long>(elem.
getCellType());
1116 elem_info[counter++] = nn;
1118 for (
long i = 0; i < nn; i++)
1120 auto const& n = *elem.
getNode(i);
1121 elem_info[counter++] = local_node_ids.at(n.getID());
1127 std::vector<MeshLib::Node const*>
const& nodes)
1129 std::unordered_map<std::size_t, long> local_ids;
1130 local_ids.reserve(nodes.size());
1132 long local_node_id = 0;
1133 for (
const auto* node : nodes)
1135 local_ids[node->getID()] = local_node_id++;
1147 std::vector<Partition>
const& partitions,
1148 std::vector<long>
const& regular_element_offsets,
1149 std::vector<long>
const& ghost_element_offsets)
1151 const std::string npartitions_str = std::to_string(partitions.size());
1153 auto const file_name_ele =
1154 file_name_base +
"_partitioned_msh_ele" + npartitions_str +
".bin";
1155 std::ofstream element_info_os(file_name_ele, std::ios::binary);
1156 if (!element_info_os)
1158 OGS_FATAL(
"Could not open file '{:s}' for output.", file_name_ele);
1161 auto const file_name_ele_g =
1162 file_name_base +
"_partitioned_msh_ele_g" + npartitions_str +
".bin";
1163 std::ofstream ghost_element_info_os(file_name_ele_g, std::ios::binary);
1164 if (!ghost_element_info_os)
1166 OGS_FATAL(
"Could not open file '{:s}' for output.", file_name_ele_g);
1169 for (std::size_t i = 0; i < partitions.size(); i++)
1171 const auto& partition = partitions[i];
1176 std::vector<long> ele_info(regular_element_offsets[i]);
1178 auto writeElementData =
1180 std::vector<MeshLib::Element const*>
const& elements,
1181 long const element_offsets,
1182 std::ofstream& output_stream)
1184 long counter = elements.size();
1185 std::vector<long> ele_info(element_offsets);
1187 for (std::size_t j = 0; j < elements.size(); j++)
1189 const auto* elem = elements[j];
1190 ele_info[j] = counter;
1195 output_stream.write(
reinterpret_cast<const char*
>(ele_info.data()),
1196 ele_info.size() *
sizeof(
long));
1200 writeElementData(partition.regular_elements, regular_element_offsets[i],
1203 writeElementData(partition.ghost_elements, ghost_element_offsets[i],
1204 ghost_element_info_os);
1213 std::vector<Partition>
const& partitions,
1214 std::vector<std::size_t>
const& global_node_ids)
1216 auto const file_name = file_name_base +
"_partitioned_msh_nod" +
1217 std::to_string(partitions.size()) +
".bin";
1218 std::ofstream os(file_name, std::ios::binary);
1221 OGS_FATAL(
"Could not open file '{:s}' for output.", file_name);
1224 for (
const auto& partition : partitions)
1226 partition.writeNodes(os, global_node_ids);
1241 const std::vector<IntegerType>& regular_element_offsets =
1242 std::get<0>(elements_offsets);
1243 const std::vector<IntegerType>& ghost_element_offsets =
1244 std::get<1>(elements_offsets);
1246 ghost_element_offsets);
1252 std::string
const& output_filename_base,
1253 std::vector<Partition>
const& partitions,
1258 const auto elem_integers =
1261 const std::vector<IntegerType>& num_elem_integers =
1262 std::get<0>(elem_integers);
1263 const std::vector<IntegerType>& num_g_elem_integers =
1264 std::get<1>(elem_integers);
1265 writeElements(output_filename_base, partitions, num_elem_integers,
1266 num_g_elem_integers);
1268 writeProperties(output_filename_base, partitioned_properties, partitions,
1270 writeProperties(output_filename_base, partitioned_properties, partitions,
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition of mesh-related Enumerations.
Declare a class to perform node wise mesh partitioning.
void applyToPropertyVectors(Properties const &properties, Function f)
Definition of the RunTime class.
Implementation of the VtuInterface class.
void renumberBulkElementIdsProperty(MeshLib::PropertyVector< std::size_t > *const bulk_element_ids_pv, std::vector< Partition > const &local_partitions) const
std::vector< Partition > partitionOtherMesh(MeshLib::Mesh const &mesh) const
MeshLib::Mesh const & mesh() const
void write(const std::string &file_name_base)
void renumberBulkIdsProperty(std::vector< Partition > const &partitions, MeshLib::Properties &partitioned_properties)
void renumberBulkNodeIdsProperty(MeshLib::PropertyVector< std::size_t > *const bulk_node_ids, std::vector< Partition > const &local_partitions) const
void renumberNodeIndices()
std::unique_ptr< MeshLib::Mesh > _mesh
Pointer to a mesh object.
MeshLib::Properties _partitioned_properties
Properties where values at ghost nodes and extra nodes are inserted.
std::vector< std::size_t > _nodes_global_ids
Global IDs of all nodes after partitioning.
void partitionByMETIS()
Partition by node.
std::vector< Partition > _partitions
Data for all partitions.
std::vector< std::size_t > _nodes_partition_ids
Partition IDs of each nodes.
void writeOtherMesh(std::string const &output_filename_base, std::vector< Partition > const &partitions, MeshLib::Properties const &partitioned_properties) const
double elapsed() const
Get the elapsed time in seconds.
void start()
Start the timer.
virtual CellType getCellType() const =0
virtual unsigned getNumberOfNodes() const =0
virtual const Node * getNode(unsigned idx) const =0
constexpr std::span< Node *const > nodes() const
Span of element's nodes, their pointers actually.
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
std::size_t computeNumberOfBaseNodes() const
Get the number of base nodes.
Properties & getProperties()
std::size_t getNumberOfNodes() const
Get the number of nodes.
std::vector< Element const * > const & getElementsConnectedToNode(std::size_t node_id) const
Property manager on mesh items. Class Properties manages scalar, vector or matrix properties....
bool hasPropertyVector(std::string_view name) const
std::map< std::string, PropertyVectorBase * >::size_type size() const
PropertyVector< T > * createNewPropertyVector(std::string_view name, MeshItemType mesh_item_type, std::size_t n_components=1)
PropertyVector< T > const * getPropertyVector(std::string_view name) const
MeshItemType getMeshItemType() const
int getNumberOfGlobalComponents() const
std::string const & getPropertyName() const
std::size_t getNumberOfTuples() const
std::tuple< std::vector< MeshLib::Node * >, std::vector< MeshLib::Node * > > findGhostNodesInPartition(std::size_t const part_id, std::vector< MeshLib::Node * > const &nodes, std::vector< MeshLib::Element const * > const &ghost_elements, std::vector< std::size_t > const &partition_ids, MeshLib::Mesh const &mesh, std::vector< std::size_t > const &node_id_mapping)
std::size_t copyCellPropertyVectorValues(Partition const &p, std::size_t const offset, MeshLib::PropertyVector< T > const &pv, MeshLib::PropertyVector< T > &partitioned_pv)
std::unordered_map< std::size_t, long > enumerateLocalNodeIds(std::vector< MeshLib::Node const * > const &nodes)
Generates a mapping of given node ids to a new local (renumbered) node ids.
void addVtkGhostTypeProperty(MeshLib::Properties &partitioned_properties, std::vector< Partition > const &partitions, std::size_t const total_number_of_cells)
bool writePropertyVector(MeshLib::PropertyVector< T > const *const pv, MeshLib::MeshItemType const mesh_item_type, std::ostream &out_val, std::ostream &out_meta)
void checkFieldPropertyVectorSize(std::vector< MeshLib::Element * > const &global_mesh_elements, MeshLib::Properties const &properties)
void writeNodes(const std::string &file_name_base, std::vector< Partition > const &partitions, std::vector< std::size_t > const &global_node_ids)
ConfigOffsets incrementConfigOffsets(ConfigOffsets const &oldConfig, PartitionOffsets const &offsets)
void setIntegrationPointNumberOfPartition(MeshLib::Properties const &properties, std::vector< Partition > &partitions)
void distributeNodesToPartitions(std::vector< Partition > &partitions, std::vector< std::size_t > const &nodes_partition_ids, std::vector< MeshLib::Node * > const &nodes, std::vector< std::size_t > const &bulk_node_ids)
void reorderNodesIntoBaseAndHigherOrderNodes(Partition &partition, MeshLib::Mesh const &mesh)
void reorderNodesIntoBaseAndHigherOrderNodesPerPartition(std::vector< Partition > &partitions, MeshLib::Mesh const &mesh)
MeshLib::Properties partitionProperties(std::unique_ptr< MeshLib::Mesh > const &mesh, std::vector< Partition > &partitions)
Partition existing properties and add vtkGhostType cell data array property.
void setNumberOfNodesInPartitions(std::vector< Partition > &partitions, MeshLib::Mesh const &mesh)
std::pair< std::vector< MeshLib::Node const * >, std::vector< MeshLib::Node const * > > splitIntoBaseAndHigherOrderNodes(std::vector< MeshLib::Node const * > const &nodes, MeshLib::Mesh const &mesh)
PartitionOffsets computePartitionOffsets(Partition const &partition)
NodeWiseMeshPartitioner::IntegerType getNumberOfIntegerVariablesOfElements(std::vector< const MeshLib::Element * > const &elements)
void determineAndAppendGhostNodesToPartitions(std::vector< Partition > &partitions, MeshLib::Mesh const &mesh, std::vector< std::size_t > const &nodes_partition_ids, std::vector< std::size_t > const &node_id_mapping)
void partitionMesh(std::vector< Partition > &partitions, MeshLib::Mesh const &mesh, std::vector< std::size_t > const &nodes_partition_ids, std::vector< std::size_t > const &bulk_node_ids)
std::tuple< std::vector< long >, std::vector< long > > writeConfigData(const std::string &file_name_base, std::vector< Partition > const &partitions)
std::size_t copyFieldPropertyDataToPartitions(MeshLib::Properties const &properties, Partition const &p, std::size_t const id_offset_partition, std::vector< std::size_t > const &element_ip_data_offsets, MeshLib::PropertyVector< T > const &pv, MeshLib::PropertyVector< T > &partitioned_pv)
void writePropertyVectorValues(std::ostream &os, MeshLib::PropertyVector< T > const &pv)
void getElementIntegerVariables(const MeshLib::Element &elem, const std::unordered_map< std::size_t, long > &local_node_ids, std::vector< long > &elem_info, long &counter)
void markDuplicateGhostCells(MeshLib::Mesh const &mesh, std::vector< Partition > &partitions)
void distributeElementsIntoPartitions(std::vector< Partition > &partitions, MeshLib::Mesh const &mesh, std::vector< std::vector< std::size_t > > const &partition_ids_per_element)
std::size_t copyNodePropertyVectorValues(Partition const &p, std::size_t const offset, MeshLib::PropertyVector< T > const &pv, MeshLib::PropertyVector< T > &partitioned_pv)
std::size_t partitionLookup(std::size_t const &node_id, std::vector< std::size_t > const &partition_ids, std::vector< std::size_t > const &node_id_mapping)
std::vector< std::vector< std::size_t > > computePartitionIDPerElement(std::vector< std::size_t > const &node_partition_map, std::vector< MeshLib::Element * > const &elements, std::vector< std::size_t > const &bulk_node_ids)
void writeProperties(const std::string &file_name_base, MeshLib::Properties const &partitioned_properties, std::vector< Partition > const &partitions, MeshLib::MeshItemType const mesh_item_type)
void writeElements(std::string const &file_name_base, std::vector< Partition > const &partitions, std::vector< long > const ®ular_element_offsets, std::vector< long > const &ghost_element_offsets)
bool copyPropertyVector(std::vector< MeshLib::Element * > const &global_mesh_elements, MeshLib::Properties &partitioned_properties, MeshLib::Properties const &properties, std::vector< Partition > const &partitions, MeshLib::PropertyVector< T > const *const pv, std::map< MeshLib::MeshItemType, std::size_t > const &total_number_of_tuples)
void writeValueBinary(std::ostream &out, T const &val)
write value as binary into the given output stream
void writePropertyVectorPartitionMetaData(std::ostream &os, PropertyVectorPartitionMetaData const &pvpmd)
void writePropertyVectorMetaData(std::ostream &os, PropertyVectorMetaData const &pvmd)
constexpr ranges::views::view_closure ids
For an element of a range view return its id.
IntegrationPointMetaData getIntegrationPointMetaData(MeshLib::Properties const &properties, std::string const &name)
constexpr std::string_view getBulkIDString(MeshItemType mesh_item_type)
long ghost_element_rank_offset
std::ostream & writeConfig(std::ostream &os) const
std::size_t number_of_mesh_base_nodes
std::size_t number_of_base_nodes
std::size_t number_of_regular_nodes
std::ostream & writeConfig(std::ostream &os) const
std::size_t number_of_mesh_all_nodes
std::size_t numberOfMeshItems(MeshLib::MeshItemType const item_type) const
std::size_t number_of_regular_base_nodes
std::vector< const MeshLib::Element * > regular_elements
Non ghost elements.
std::vector< const MeshLib::Element * > ghost_elements
std::ostream & writeNodes(std::ostream &os, std::vector< std::size_t > const &global_node_ids) const
std::vector< MeshLib::Node const * > nodes
nodes.
std::size_t number_of_integration_points
struct NodeData used for parallel reading and also partitioning