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

Merge branch 'feature/diamond-dual-mesh-manager' into 'develop'

Feature/diamond dual mesh manager

See merge request !45
parents db01d577 c9aa8a7c
No related branches found
No related tags found
1 merge request!45Feature/diamond dual mesh manager
......@@ -44,19 +44,19 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
diamond_descriptor.node_number_vector.resize(diamond_number_of_nodes);
for (size_t i = 0; i < m_primal_node_to_dual_node_map.size(); ++i) {
parallel_for(m_primal_node_to_dual_node_map.size(), [&](size_t i) {
const auto [primal_node_id, diamond_dual_node_id] = m_primal_node_to_dual_node_map[i];
diamond_descriptor.node_number_vector[diamond_dual_node_id] = primal_node_number[primal_node_id];
}
});
const size_t cell_number_shift = max(primal_node_number) + 1;
for (size_t i = 0; i < primal_number_of_cells; ++i) {
parallel_for(primal_number_of_cells, [&](size_t 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] =
primal_cell_number[primal_cell_id] + cell_number_shift;
}
});
{
m_primal_face_to_dual_cell_map = FaceIdToCellIdMap{primal_number_of_faces};
......@@ -68,10 +68,10 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells);
const auto& primal_face_number = primal_connectivity.faceNumber();
for (size_t i = 0; i < diamond_number_of_cells; ++i) {
parallel_for(diamond_number_of_cells, [&](size_t i) {
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) {
const size_t number_of_edges = diamond_descriptor.edge_to_node_vector.size();
......@@ -88,9 +88,9 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
const auto& primal_face_to_cell_matrix = primal_connectivity.faceToCellMatrix();
for (FaceId i_face = 0; i_face < primal_number_of_faces; ++i_face) {
const size_t i_cell = i_face;
const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face];
parallel_for(primal_number_of_faces, [&](FaceId face_id) {
const size_t i_cell = face_id;
const auto& primal_face_cell_list = primal_face_to_cell_matrix[face_id];
if (primal_face_cell_list.size() == 1) {
diamond_descriptor.cell_type_vector[i_cell] = CellType::Triangle;
......@@ -107,22 +107,22 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
diamond_descriptor.cell_type_vector[i_cell] = CellType::Diamond;
}
}
}
});
diamond_descriptor.cell_to_node_vector.resize(diamond_number_of_cells);
const auto& primal_face_to_node_matrix = primal_connectivity.faceToNodeMatrix();
const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells();
const auto& cell_face_is_reversed = primal_connectivity.cellFaceIsReversed();
for (FaceId i_face = 0; i_face < primal_number_of_faces; ++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_node_list = primal_face_to_node_matrix[i_face];
parallel_for(primal_number_of_faces, [&](FaceId face_id) {
const size_t& i_diamond_cell = face_id;
const auto& primal_face_cell_list = primal_face_to_cell_matrix[face_id];
const auto& primal_face_node_list = primal_face_to_node_matrix[face_id];
if (primal_face_cell_list.size() == 1) {
diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 1);
const CellId cell_id = primal_face_cell_list[0];
const auto i_face_in_cell = primal_face_local_number_in_their_cells(i_face, 0);
const auto i_face_in_cell = primal_face_local_number_in_their_cells(face_id, 0);
for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node] = primal_face_node_list[i_node];
......@@ -149,7 +149,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
const CellId cell0_id = primal_face_cell_list[0];
const CellId cell1_id = primal_face_cell_list[1];
const auto i_face_in_cell0 = primal_face_local_number_in_their_cells(i_face, 0);
const auto i_face_in_cell0 = primal_face_local_number_in_their_cells(face_id, 0);
if constexpr (Dimension == 2) {
Assert(primal_face_node_list.size() == 2);
......@@ -176,7 +176,7 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connec
}
}
}
}
});
}
template <>
......@@ -368,7 +368,6 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
face_array[i] = diamond_face_list[i];
}
diamond_descriptor.addRefItemList(RefFaceList{primal_ref_face_list.refId(), face_array});
std::cout << "stored " << primal_ref_face_list.refId() << '\n';
}
}
}
......@@ -420,7 +419,6 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
edge_array[i] = diamond_edge_list[i];
}
diamond_descriptor.addRefItemList(RefEdgeList{primal_ref_edge_list.refId(), edge_array});
std::cout << "stored " << primal_ref_edge_list.refId() << '\n';
}
}
}
......@@ -508,7 +506,6 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
m_connectivity = ConnectivityType::build(diamond_descriptor);
{
if constexpr (Dimension == 1) {
const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
......@@ -542,7 +539,6 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
return primal_face_to_dual_cell_map;
}();
}
}
m_mapper =
std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity,
......
......@@ -322,6 +322,8 @@ class VTKWriter
{
Array<int8_t> types(mesh->numberOfCells());
const auto& cell_type = mesh->connectivity().cellType();
const auto& cell_to_node_matrix = mesh->connectivity().cellToNodeMatrix();
parallel_for(
mesh->numberOfCells(), PUGS_LAMBDA(CellId j) {
switch (cell_type[j]) {
......@@ -342,7 +344,11 @@ class VTKWriter
break;
}
case CellType::Pyramid: {
types[j] = 14;
if (cell_to_node_matrix[j].size() == 5) {
types[j] = 14; // quadrangle basis
} else {
types[j] = 41; // polygonal basis
}
break;
}
case CellType::Prism: {
......@@ -365,10 +371,16 @@ class VTKWriter
}
});
_write_array(fout, "types", types);
}
if constexpr (MeshType::Dimension == 3) {
const bool has_general_polyhedron = [&] {
for (size_t i = 0; i < types.size(); ++i) {
if (types[i] == 41)
return true;
}
return false;
}();
if (has_general_polyhedron) {
const auto& cell_to_face_matrix = mesh->connectivity().cellToFaceMatrix();
const auto& cell_to_node_matrix = mesh->connectivity().cellToNodeMatrix();
const auto& face_to_node_matrix = mesh->connectivity().faceToNodeMatrix();
const auto& cell_face_is_reversed = mesh->connectivity().cellFaceIsReversed();
......@@ -422,6 +434,9 @@ class VTKWriter
}
fout << "</DataArray>\n";
}
}
}
fout << "</Cells>\n";
fout << "</Piece>\n";
fout << "</UnstructuredGrid>\n";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment