diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp index ea475303c2ba979dd4b0d0c4479ab1ad6b675e5e..6ad63cd699d37ec499fa17ba38b601bc15a785f7 100644 --- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp +++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp @@ -125,26 +125,32 @@ void splitOffHigherOrderNode(std::vector<MeshLib::Node*> const& nodes, } } -void NodeWiseMeshPartitioner::findNonGhostNodesInPartition( - std::size_t const part_id, - const bool is_mixed_high_order_linear_elems, - std::vector<MeshLib::Node*>& extra_nodes) -{ - std::vector<MeshLib::Node*> const& nodes = _mesh->getNodes(); - auto& partition = _partitions[part_id]; - // -- Extra nodes for high order elements - for (std::size_t i = 0; i < _mesh->getNumberOfNodes(); i++) +/// 1 copy pointers to nodes belonging to the partition part_id into base nodes +/// vector, and +/// 2 collect non-linear element nodes belonging to the partition part_id in +/// extra nodes vector. +/// \return a pair of base node and extra nodes. +std::pair<std::vector<MeshLib::Node*>, std::vector<MeshLib::Node*>> +findNonGhostNodesInPartition(std::size_t const part_id, + const bool is_mixed_high_order_linear_elems, + std::size_t const n_base_nodes, + std::vector<MeshLib::Node*> const& nodes, + std::vector<std::size_t> const& partition_ids) +{ + auto const n_nodes = nodes.size(); + + std::vector<MeshLib::Node*> base_nodes; + std::vector<MeshLib::Node*> extra_nodes; + for (std::size_t i = 0; i < n_nodes; i++) { - if (_nodes_partition_ids[i] == part_id) + if (partition_ids[i] == part_id) { splitOffHigherOrderNode(nodes, is_mixed_high_order_linear_elems, i, - _mesh->getNumberOfBaseNodes(), - partition.nodes, extra_nodes); + n_base_nodes, base_nodes, extra_nodes); } } - partition.number_of_non_ghost_base_nodes = partition.nodes.size(); - partition.number_of_non_ghost_nodes = - partition.number_of_non_ghost_base_nodes + extra_nodes.size(); + + return {base_nodes, extra_nodes}; } void NodeWiseMeshPartitioner::findElementsInPartition(std::size_t const part_id) @@ -220,8 +226,16 @@ void NodeWiseMeshPartitioner::processPartition( std::size_t const part_id, const bool is_mixed_high_order_linear_elems) { std::vector<MeshLib::Node*> extra_nodes; - findNonGhostNodesInPartition(part_id, is_mixed_high_order_linear_elems, - extra_nodes); + std::tie(_partitions[part_id].nodes, extra_nodes) = + findNonGhostNodesInPartition(part_id, is_mixed_high_order_linear_elems, + _mesh->getNumberOfBaseNodes(), + _mesh->getNodes(), _nodes_partition_ids); + + _partitions[part_id].number_of_non_ghost_base_nodes = + _partitions[part_id].nodes.size(); + _partitions[part_id].number_of_non_ghost_nodes = + _partitions[part_id].number_of_non_ghost_base_nodes + + extra_nodes.size(); findElementsInPartition(part_id); findGhostNodesInPartition(part_id, is_mixed_high_order_linear_elems, diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h index 4f295f9869b7819e5404388f3b44ce19d020c091..9d73713a640ebf71870ac8d5eb9a2aae5aa31e53 100644 --- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h +++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h @@ -117,14 +117,6 @@ private: /// interpolation void renumberNodeIndices(const bool is_mixed_high_order_linear_elems); - /// 1 copy pointers to nodes belonging to the partition part_id - /// 2 collect non-linear element nodes belonging to the partition part_id in - /// extra_nodes - void findNonGhostNodesInPartition( - std::size_t const part_id, - const bool is_mixed_high_order_linear_elems, - std::vector<MeshLib::Node*>& extra_nodes); - /// 1 find elements belonging to the partition part_id: /// fills vector partition.regular_elements /// 2 find ghost elements belonging to the partition part_id