Skip to content
Snippets Groups Projects
Commit 71bd62bb authored by Dmitri Naumov's avatar Dmitri Naumov
Browse files

Merge branch 'partmesh_update' into 'master'

[partmesh] Renumber bulk node IDs of the bulk mesh

Closes #3381

See merge request ogs/ogs!4513
parents aef09045 53cd6db8
No related branches found
No related tags found
No related merge requests found
......@@ -687,6 +687,34 @@ void NodeWiseMeshPartitioner::partitionByMETIS()
checkFieldPropertyVectorSize(_mesh->getElements(), _mesh->getProperties());
_partitioned_properties = partitionProperties(_mesh, _partitions);
renumberBulkIdsProperty(_partitions, _partitioned_properties);
}
void NodeWiseMeshPartitioner::renumberBulkIdsProperty(
std::vector<Partition> const& partitions,
MeshLib::Properties& partitioned_properties)
{
auto const bulk_node_ids_string =
MeshLib::getBulkIDString(MeshLib::MeshItemType::Node);
if (partitioned_properties.hasPropertyVector(bulk_node_ids_string))
{
renumberBulkNodeIdsProperty(
partitioned_properties.getPropertyVector<std::size_t>(
bulk_node_ids_string, MeshLib::MeshItemType::Node, 1),
partitions);
}
auto const bulk_element_ids_string =
MeshLib::getBulkIDString(MeshLib::MeshItemType::Cell);
if (partitioned_properties.hasPropertyVector<std::size_t>(
static_cast<std::string>(bulk_element_ids_string),
MeshLib::MeshItemType::Cell))
{
renumberBulkElementIdsProperty(
partitioned_properties.getPropertyVector<std::size_t>(
bulk_element_ids_string, MeshLib::MeshItemType::Cell, 1),
partitions);
}
}
void NodeWiseMeshPartitioner::renumberBulkNodeIdsProperty(
......
......@@ -86,17 +86,8 @@ public:
std::vector<Partition> partitionOtherMesh(MeshLib::Mesh const& mesh) const;
/// Renumber the bulk_node_ids property for each partition to match the
/// partitioned bulk mesh nodes.
void renumberBulkNodeIdsProperty(
MeshLib::PropertyVector<std::size_t>* const bulk_node_ids,
std::vector<Partition> const& local_partitions) const;
/// Renumber the bulk_element_ids property for each partition to match the
/// partitioned bulk mesh elements.
void renumberBulkElementIdsProperty(
MeshLib::PropertyVector<std::size_t>* const bulk_element_ids_pv,
std::vector<Partition> const& local_partitions) const;
void renumberBulkIdsProperty(std::vector<Partition> const& partitions,
MeshLib::Properties& partitioned_properties);
/// Write the partitions into binary files
/// \param file_name_base The prefix of the file name.
......@@ -135,6 +126,18 @@ private:
void renumberNodeIndices();
void processPartition(std::size_t const part_id);
/// Renumber the bulk_node_ids property for each partition to match the
/// partitioned bulk mesh nodes.
void renumberBulkNodeIdsProperty(
MeshLib::PropertyVector<std::size_t>* const bulk_node_ids,
std::vector<Partition> const& local_partitions) const;
/// Renumber the bulk_element_ids property for each partition to match the
/// partitioned bulk mesh elements.
void renumberBulkElementIdsProperty(
MeshLib::PropertyVector<std::size_t>* const bulk_element_ids_pv,
std::vector<Partition> const& local_partitions) const;
};
} // namespace ApplicationUtils
......@@ -224,21 +224,9 @@ int main(int argc, char* argv[])
auto partitions = mesh_partitioner.partitionOtherMesh(*mesh);
auto partitioned_properties = partitionProperties(mesh, partitions);
auto const bulk_node_ids_string =
MeshLib::getBulkIDString(MeshLib::MeshItemType::Node);
mesh_partitioner.renumberBulkNodeIdsProperty(
partitioned_properties.getPropertyVector<std::size_t>(
bulk_node_ids_string, MeshLib::MeshItemType::Node, 1),
partitions);
auto const bulk_element_ids_string =
MeshLib::getBulkIDString(MeshLib::MeshItemType::Cell);
if (partitioned_properties.hasPropertyVector(bulk_element_ids_string))
{
mesh_partitioner.renumberBulkElementIdsProperty(
partitioned_properties.getPropertyVector<std::size_t>(
bulk_element_ids_string, MeshLib::MeshItemType::Cell, 1),
partitions);
}
mesh_partitioner.renumberBulkIdsProperty(partitions,
partitioned_properties);
mesh_partitioner.writeOtherMesh(
other_mesh_output_file_name_wo_extension, partitions,
partitioned_properties);
......
......@@ -147,6 +147,23 @@ PropertyVector<T>* Properties::getPropertyVector(std::string_view name)
return dynamic_cast<PropertyVector<T>*>(it->second);
}
template <typename T>
bool Properties::hasPropertyVector(std::string const& name,
MeshItemType const item_type) const
{
auto const it = _properties.find(name);
if (it == _properties.end())
{
return false;
}
auto property = dynamic_cast<PropertyVector<T>*>(it->second);
return (property == nullptr) ? false
: property->getMeshItemType() == item_type;
}
template <typename T>
PropertyVector<T> const* Properties::getPropertyVector(
std::string_view name, MeshItemType const item_type,
......
......@@ -123,6 +123,14 @@ public:
/// @param name the name of the property (for instance porosity)
bool hasPropertyVector(std::string_view name) const;
/// Check if a PropertyVector accessible by the name and by the item type
/// is already stored within the Properties object.
/// @param name the name of the property, e.g. porosity.
/// @param item_type the type of mesh entity, e.g. CELL.
template <typename T>
bool hasPropertyVector(std::string const& name,
MeshItemType const item_type) const;
std::vector<std::string> getPropertyVectorNames() const;
std::vector<std::string> getPropertyVectorNames(
MeshLib::MeshItemType t) const;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment