Skip to content
Snippets Groups Projects
Commit e5e41d50 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Improve integration of item id mapping when building diamond mesh

1d remains to be treated
parent 2ee0f634
No related branches found
No related tags found
1 merge request!42Feature/diamond dual mesh manager
...@@ -26,17 +26,18 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec ...@@ -26,17 +26,18 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
const auto& primal_cell_number = primal_connectivity.cellNumber(); const auto& primal_cell_number = primal_connectivity.cellNumber();
const size_t diamond_number_of_nodes = primal_number_of_cells + primal_number_of_nodes; const size_t diamond_number_of_nodes = primal_number_of_cells + primal_number_of_nodes;
const size_t diamond_number_of_cells = primal_number_of_faces;
{ {
m_primal_node_to_dual_node_map = NodeIdToNodeIdMap{primal_number_of_nodes}; m_primal_node_to_dual_node_map = NodeIdToNodeIdMap{primal_number_of_nodes};
NodeId diamond_node_id = 0; NodeId diamond_node_id = 0;
for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) { for (NodeId primal_node_id = 0; primal_node_id < primal_number_of_nodes; ++primal_node_id) {
m_primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, diamond_node_id++); m_primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, diamond_node_id++);
} }
m_primal_cell_to_dual_node_map = CellIdToNodeIdMap{primal_number_of_cells}; m_primal_cell_to_dual_node_map = CellIdToNodeIdMap{primal_number_of_cells};
for (CellId primal_cell_id = 0; primal_cell_id < primal_connectivity.numberOfCells(); ++primal_cell_id) { for (CellId primal_cell_id = 0; primal_cell_id < primal_number_of_cells; ++primal_cell_id) {
m_primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, diamond_node_id++); m_primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, diamond_node_id++);
} }
} }
...@@ -50,19 +51,26 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec ...@@ -50,19 +51,26 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
} }
const size_t cell_number_shift = max(primal_node_number) + 1; const size_t cell_number_shift = max(primal_node_number) + 1;
for (size_t i = 0; i < m_primal_cell_to_dual_node_map.size(); ++i) { for (size_t i = 0; i < primal_number_of_cells; ++i) {
const auto [primal_cell_id, diamond_dual_node_id] = m_primal_cell_to_dual_node_map[i]; const auto [primal_cell_id, diamond_dual_node_id] = m_primal_cell_to_dual_node_map[i];
diamond_descriptor.node_number_vector[diamond_dual_node_id] = diamond_descriptor.node_number_vector[diamond_dual_node_id] =
primal_cell_number[primal_cell_id] + cell_number_shift; primal_cell_number[primal_cell_id] + cell_number_shift;
} }
const size_t diamond_number_of_cells = primal_number_of_faces; {
diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells); m_primal_face_to_dual_cell_map = FaceIdToCellIdMap{primal_number_of_faces};
CellId diamond_cell_id = 0;
for (FaceId primal_face_id = 0; primal_face_id < primal_number_of_faces; ++primal_face_id) {
m_primal_face_to_dual_cell_map[primal_face_id] = std::make_pair(primal_face_id, diamond_cell_id++);
}
}
diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells);
const auto& primal_face_number = primal_connectivity.faceNumber(); const auto& primal_face_number = primal_connectivity.faceNumber();
for (FaceId i_primal_face = 0; i_primal_face < primal_number_of_faces; ++i_primal_face) { for (size_t i = 0; i < diamond_number_of_cells; ++i) {
diamond_descriptor.cell_number_vector[i_primal_face] = primal_face_number[i_primal_face]; const auto [primal_face_id, dual_cell_id] = m_primal_face_to_dual_cell_map[i];
diamond_descriptor.cell_number_vector[dual_cell_id] = primal_face_number[primal_face_id];
} }
if constexpr (Dimension == 3) { if constexpr (Dimension == 3) {
...@@ -80,7 +88,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec ...@@ -80,7 +88,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
const auto& primal_face_to_cell_matrix = primal_connectivity.faceToCellMatrix(); const auto& primal_face_to_cell_matrix = primal_connectivity.faceToCellMatrix();
for (FaceId i_face = 0; i_face < primal_connectivity.numberOfFaces(); ++i_face) { for (FaceId i_face = 0; i_face < primal_number_of_faces; ++i_face) {
const size_t i_cell = i_face; const size_t i_cell = i_face;
const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face]; const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face];
...@@ -106,7 +114,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec ...@@ -106,7 +114,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
const auto& primal_face_to_node_matrix = primal_connectivity.faceToNodeMatrix(); const auto& primal_face_to_node_matrix = primal_connectivity.faceToNodeMatrix();
const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells(); const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells();
const auto& cell_face_is_reversed = primal_connectivity.cellFaceIsReversed(); const auto& cell_face_is_reversed = primal_connectivity.cellFaceIsReversed();
for (FaceId i_face = 0; i_face < primal_connectivity.numberOfFaces(); ++i_face) { for (FaceId i_face = 0; i_face < primal_number_of_faces; ++i_face) {
const size_t& i_diamond_cell = i_face; const size_t& i_diamond_cell = i_face;
const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face]; const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face];
const auto& primal_face_node_list = primal_face_to_node_matrix[i_face]; const auto& primal_face_node_list = primal_face_to_node_matrix[i_face];
...@@ -516,33 +524,12 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit ...@@ -516,33 +524,12 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
}(); }();
m_primal_cell_to_dual_node_map = [&]() { m_primal_cell_to_dual_node_map = [&]() {
CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()}; CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_number_of_cells};
for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) {
primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++);
}
return primal_cell_to_dual_node_map;
}();
} else {
m_primal_node_to_dual_node_map = [&]() {
NodeIdToNodeIdMap primal_node_to_dual_node_map{primal_connectivity.numberOfNodes()};
for (NodeId primal_node_id = 0; primal_node_id < primal_node_to_dual_node_map.size(); ++primal_node_id) {
const NodeId dual_node_id = primal_node_id;
primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, dual_node_id);
}
return primal_node_to_dual_node_map;
}();
m_primal_cell_to_dual_node_map = [&]() {
CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()};
NodeId dual_node_id = m_primal_node_to_dual_node_map.size();
for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) { for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) {
primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++); primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++);
} }
return primal_cell_to_dual_node_map; return primal_cell_to_dual_node_map;
}(); }();
}
m_primal_face_to_dual_cell_map = [&]() { m_primal_face_to_dual_cell_map = [&]() {
FaceIdToCellIdMap primal_face_to_dual_cell_map{primal_connectivity.numberOfFaces()}; FaceIdToCellIdMap primal_face_to_dual_cell_map{primal_connectivity.numberOfFaces()};
...@@ -555,6 +542,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit ...@@ -555,6 +542,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
return primal_face_to_dual_cell_map; return primal_face_to_dual_cell_map;
}(); }();
} }
}
m_mapper = m_mapper =
std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity, std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity,
...@@ -567,6 +555,9 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit ...@@ -567,6 +555,9 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity) DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity)
{ {
if (parallel::size() > 1) {
throw NotImplementedError("Construction of diamond dual mesh is not implemented in parallel");
}
switch (connectivity.dimension()) { switch (connectivity.dimension()) {
case 1: { case 1: {
this->_buildDiamondConnectivityFrom<1>(connectivity); this->_buildDiamondConnectivityFrom<1>(connectivity);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment