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

Added getFaceNumber and various fixes

- getFaceNumber is really crappy: awful and slow
- fixed face node ordering at creation (based on gmsh numbering)
- fixed is reversed face info storage
parent 581f8023
No related branches found
No related tags found
No related merge requests found
...@@ -56,10 +56,18 @@ private: ...@@ -56,10 +56,18 @@ private:
class Face class Face
{ {
private: private:
std::vector<unsigned int> m_node_id_list;
bool m_reversed; bool m_reversed;
std::vector<unsigned int> m_node_id_list;
public: public:
friend std::ostream& operator<<(std::ostream& os, const Face& f)
{
for (auto id : f.m_node_id_list) {
std::cout << id << ' ';
}
return os;
}
KOKKOS_INLINE_FUNCTION KOKKOS_INLINE_FUNCTION
const bool& reversed() const const bool& reversed() const
{ {
...@@ -76,24 +84,36 @@ private: ...@@ -76,24 +84,36 @@ private:
std::vector<unsigned int> _sort(const std::vector<unsigned int>& node_list) std::vector<unsigned int> _sort(const std::vector<unsigned int>& node_list)
{ {
const auto min_id = std::min_element(node_list.begin(), node_list.end()); const auto min_id = std::min_element(node_list.begin(), node_list.end());
const size_t shift = std::distance(min_id, node_list.begin()); const int shift = std::distance(node_list.begin(), min_id);
std::vector<unsigned int> rotated_node_list(node_list.size()); std::vector<unsigned int> rotated_node_list(node_list.size());
if (node_list[(shift+1)%node_list.size()] < node_list[(shift+node_list.size()-1)%node_list.size()]) { if (node_list[(shift+1)%node_list.size()] > node_list[(shift+node_list.size()-1)%node_list.size()]) {
for (size_t i=0; i<node_list.size(); ++i) { for (size_t i=0; i<node_list.size(); ++i) {
const size_t reverse_shift = node_list.size()-shift; rotated_node_list[i] = node_list[(shift+node_list.size()-i)%node_list.size()];
rotated_node_list[(reverse_shift+node_list.size()-i)%node_list.size()] = node_list[i];
m_reversed = true; m_reversed = true;
} }
} else { } else {
for (size_t i=0; i<node_list.size(); ++i) { for (size_t i=0; i<node_list.size(); ++i) {
rotated_node_list[(shift+i)%node_list.size()] = node_list[i]; rotated_node_list[i] = node_list[(shift+i)%node_list.size()];
} }
} }
return rotated_node_list; return rotated_node_list;
} }
bool operator==(const Face& f) const
{
if (m_node_id_list.size() == f.nodeIdList().size()) {
for (size_t j=0; j<m_node_id_list.size(); ++j) {
if (m_node_id_list[j] != f.nodeIdList()[j]) {
return false;
}
}
return true;
}
return false;
}
KOKKOS_INLINE_FUNCTION KOKKOS_INLINE_FUNCTION
bool operator<(const Face& f) const bool operator<(const Face& f) const
{ {
...@@ -119,8 +139,8 @@ private: ...@@ -119,8 +139,8 @@ private:
KOKKOS_INLINE_FUNCTION KOKKOS_INLINE_FUNCTION
Face(const std::vector<unsigned int>& given_node_id_list) Face(const std::vector<unsigned int>& given_node_id_list)
: m_node_id_list(_sort(given_node_id_list)), : m_reversed(false),
m_reversed(false) m_node_id_list(_sort(given_node_id_list))
{ {
; ;
} }
...@@ -149,45 +169,45 @@ private: ...@@ -149,45 +169,45 @@ private:
} }
case 8: { // hexahedron case 8: { // hexahedron
// face 0 // face 0
Face f0({m_cell_nodes(j,0), Face f0({m_cell_nodes(j,3),
m_cell_nodes(j,1),
m_cell_nodes(j,2), m_cell_nodes(j,2),
m_cell_nodes(j,3)}); m_cell_nodes(j,1),
m_cell_nodes(j,0)});
face_cells_map[f0].push_back(std::make_tuple(j, 0, f0.reversed())); face_cells_map[f0].push_back(std::make_tuple(j, 0, f0.reversed()));
// face 1 // face 1
Face f1({m_cell_nodes(j,4), Face f1({m_cell_nodes(j,4),
m_cell_nodes(j,7), m_cell_nodes(j,5),
m_cell_nodes(j,6), m_cell_nodes(j,6),
m_cell_nodes(j,5)}); m_cell_nodes(j,7)});
face_cells_map[f1].push_back(std::make_tuple(j, 1, f1.reversed())); face_cells_map[f1].push_back(std::make_tuple(j, 1, f1.reversed()));
// face 2 // face 2
Face f2({m_cell_nodes(j,0), Face f2({m_cell_nodes(j,0),
m_cell_nodes(j,3), m_cell_nodes(j,4),
m_cell_nodes(j,7), m_cell_nodes(j,7),
m_cell_nodes(j,4)}); m_cell_nodes(j,3)});
face_cells_map[f2].push_back(std::make_tuple(j, 2, f2.reversed())); face_cells_map[f2].push_back(std::make_tuple(j, 2, f2.reversed()));
// face 3 // face 3
Face f3({m_cell_nodes(j,1), Face f3({m_cell_nodes(j,1),
m_cell_nodes(j,5), m_cell_nodes(j,2),
m_cell_nodes(j,6), m_cell_nodes(j,6),
m_cell_nodes(j,2)}); m_cell_nodes(j,5)});
face_cells_map[f3].push_back(std::make_tuple(j, 3, f3.reversed())); face_cells_map[f3].push_back(std::make_tuple(j, 3, f3.reversed()));
// face 4 // face 4
Face f4({m_cell_nodes(j,0), Face f4({m_cell_nodes(j,0),
m_cell_nodes(j,4), m_cell_nodes(j,1),
m_cell_nodes(j,5), m_cell_nodes(j,5),
m_cell_nodes(j,1)}); m_cell_nodes(j,4)});
face_cells_map[f4].push_back(std::make_tuple(j, 4, f4.reversed())); face_cells_map[f4].push_back(std::make_tuple(j, 4, f4.reversed()));
// face 5 // face 5
Face f5({m_cell_nodes(j,3), Face f5({m_cell_nodes(j,3),
m_cell_nodes(j,2), m_cell_nodes(j,7),
m_cell_nodes(j,6), m_cell_nodes(j,6),
m_cell_nodes(j,7)}); m_cell_nodes(j,2)});
face_cells_map[f5].push_back(std::make_tuple(j, 5, f5.reversed())); face_cells_map[f5].push_back(std::make_tuple(j, 5, f5.reversed()));
cell_nb_faces[j] = 6; cell_nb_faces[j] = 6;
...@@ -257,7 +277,7 @@ private: ...@@ -257,7 +277,7 @@ private:
std::cerr << __FILE__ << ':' << __LINE__ << ':' std::cerr << __FILE__ << ':' << __LINE__ << ':'
<< rang::fg::red << " m_max_nb_face_per_cell forced to 6" << rang::fg::reset << '\n'; << rang::fg::red << " m_max_nb_face_per_cell forced to 6" << rang::fg::reset << '\n';
m_max_nb_face_per_cell = 6; m_max_nb_face_per_cell = 6;
Kokkos::View<unsigned int**> cell_faces("cell_faces", m_number_of_faces, m_max_nb_face_per_cell); Kokkos::View<unsigned int**> cell_faces("cell_faces", m_number_of_cells, m_max_nb_face_per_cell);
{ {
int l=0; int l=0;
for (const auto& face_cells_vector : face_cells_map) { for (const auto& face_cells_vector : face_cells_map) {
...@@ -273,16 +293,17 @@ private: ...@@ -273,16 +293,17 @@ private:
} }
m_cell_faces = cell_faces; m_cell_faces = cell_faces;
Kokkos::View<bool**> cell_faces_is_reversed("cell_faces_is_reversed", m_number_of_faces, m_max_nb_face_per_cell); Kokkos::View<bool**> cell_faces_is_reversed("cell_faces_is_reversed", m_number_of_cells, m_max_nb_face_per_cell);
{ {
int l=0; int l=0;
for (const auto& face_cells_vector : face_cells_map) { for (const auto& face_cells_vector : face_cells_map) {
const auto& cells_vector = face_cells_vector.second; const auto& cells_vector = face_cells_vector.second;
for (unsigned short lj=0; lj<cells_vector.size(); ++lj) { for (unsigned short lj=0; lj<cells_vector.size(); ++lj) {
unsigned int cell_number; unsigned int cell_number;
unsigned short cell_local_face;
bool reversed; bool reversed;
std::tie(cell_number, std::ignore, reversed); std::tie(cell_number, cell_local_face, reversed) = cells_vector[lj];
cell_faces_is_reversed(cell_number,lj) = reversed; cell_faces_is_reversed(cell_number,cell_local_face) = reversed;
} }
++l; ++l;
} }
...@@ -436,15 +457,18 @@ private: ...@@ -436,15 +457,18 @@ private:
return m_face_cell_local_face; return m_face_cell_local_face;
} }
unsigned int getFaceNumber(const unsigned int node0_id, unsigned int getFaceNumber(const std::vector<unsigned int>& face_nodes) const
const unsigned int node1_id) const
{ {
#warning rewrite #warning rewrite
const unsigned int n0_id = std::min(node0_id, node1_id);
const unsigned int n1_id = std::max(node0_id, node1_id);
// worst code ever // worst code ever
const Face face(face_nodes);
for (unsigned int l=0; l<m_number_of_faces; ++l) { for (unsigned int l=0; l<m_number_of_faces; ++l) {
if ((m_face_nodes(l,0) == n0_id) and (m_face_nodes(l,1) == n1_id)) { std::vector<unsigned int> nodes(m_face_nb_nodes[l]);
for (size_t r=0; r<nodes.size(); ++r) {
nodes[r] = m_face_nodes(l,r);
}
Face f(nodes);
if (f == face) {
return l; return l;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment