Skip to content

Commit

Permalink
Merge branch 'partmesh_update' into 'master'
Browse files Browse the repository at this point in the history
[partmesh] Renumber bulk node IDs of the bulk mesh

Closes #3381

See merge request ogs/ogs!4513
  • Loading branch information
endJunction committed Mar 10, 2023
2 parents aef0904 + 53cd6db commit 71bd62b
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,8 @@ class NodeWiseMeshPartitioner

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.
Expand Down Expand Up @@ -135,6 +126,18 @@ class NodeWiseMeshPartitioner
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
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
17 changes: 17 additions & 0 deletions MeshLib/Properties-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions MeshLib/Properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,14 @@ class Properties
/// @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;
Expand Down
Binary file not shown.

0 comments on commit 71bd62b

Please sign in to comment.