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

MeshBoundary now builds node list from face list

MeshFlatboundary uses this list to compute the normal
parent c00a8a00
No related branches found
No related tags found
No related merge requests found
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
template <size_t dimension> template <size_t dimension>
class MeshBoundary class MeshBoundary
{ {
protected:
Kokkos::View<const unsigned int*> m_node_list;
public: public:
MeshBoundary& operator=(const MeshBoundary&) = default; MeshBoundary& operator=(const MeshBoundary&) = default;
MeshBoundary& operator=(MeshBoundary&&) = default; MeshBoundary& operator=(MeshBoundary&&) = default;
...@@ -27,6 +29,28 @@ class MeshBoundary ...@@ -27,6 +29,28 @@ class MeshBoundary
std::exit(1); std::exit(1);
} }
}); });
const Kokkos::View<const unsigned short*> face_nb_nodes = mesh.connectivity().faceNbNodes();
const Kokkos::View<const unsigned int**> face_nodes = mesh.connectivity().faceNodes();
std::vector<unsigned int> node_ids;
// not enough but should reduce significantly the number of resizing
node_ids.reserve(dimension*face_list.extent(0));
for (size_t l=0; l<face_list.extent(0); ++l) {
const size_t face_number = face_list[l];
for (size_t r=0; r<face_nb_nodes[face_number]; ++r) {
node_ids.push_back(face_nodes(face_number,r));
}
}
std::sort(node_ids.begin(), node_ids.end());
auto last = std::unique(node_ids.begin(), node_ids.end());
node_ids.resize(std::distance(node_ids.begin(), last));
Kokkos::View<unsigned int*> node_list("node_list", node_ids.size());
Kokkos::parallel_for(node_ids.size(), KOKKOS_LAMBDA(const int& r){
node_list[r] = node_ids[r];
});
m_node_list = node_list;
} }
MeshBoundary() = default; MeshBoundary() = default;
...@@ -45,8 +69,7 @@ class MeshFlatBoundary ...@@ -45,8 +69,7 @@ class MeshFlatBoundary
const Rd m_outgoing_normal; const Rd m_outgoing_normal;
template <typename MeshType> template <typename MeshType>
inline Rd _getOutgoingNormal(const MeshType& mesh, inline Rd _getOutgoingNormal(const MeshType& mesh);
const Kokkos::View<const unsigned int*>& face_list);
public: public:
MeshFlatBoundary& operator=(const MeshFlatBoundary&) = default; MeshFlatBoundary& operator=(const MeshFlatBoundary&) = default;
MeshFlatBoundary& operator=(MeshFlatBoundary&&) = default; MeshFlatBoundary& operator=(MeshFlatBoundary&&) = default;
...@@ -55,7 +78,7 @@ class MeshFlatBoundary ...@@ -55,7 +78,7 @@ class MeshFlatBoundary
MeshFlatBoundary(const MeshType& mesh, MeshFlatBoundary(const MeshType& mesh,
const Kokkos::View<const unsigned int*>& face_list) const Kokkos::View<const unsigned int*>& face_list)
: MeshBoundary<dimension>(mesh, face_list), : MeshBoundary<dimension>(mesh, face_list),
m_outgoing_normal(_getOutgoingNormal(mesh, face_list)) m_outgoing_normal(_getOutgoingNormal(mesh))
{ {
; ;
} }
...@@ -71,14 +94,11 @@ template <> ...@@ -71,14 +94,11 @@ template <>
template <typename MeshType> template <typename MeshType>
inline TinyVector<2,double> inline TinyVector<2,double>
MeshFlatBoundary<2>:: MeshFlatBoundary<2>::
_getOutgoingNormal(const MeshType& mesh, _getOutgoingNormal(const MeshType& mesh)
const Kokkos::View<const unsigned int*>& face_list)
{ {
static_assert(MeshType::dimension == 2); static_assert(MeshType::dimension == 2);
typedef TinyVector<2,double> R2; typedef TinyVector<2,double> R2;
const Kokkos::View<const unsigned short*> face_nb_nodes = mesh.connectivity().faceNbNodes();
const Kokkos::View<const unsigned int**> face_nodes = mesh.connectivity().faceNodes();
const Kokkos::View<const R2*> xr = mesh.xr(); const Kokkos::View<const R2*> xr = mesh.xr();
R2 xmin(std::numeric_limits<double>::max(), R2 xmin(std::numeric_limits<double>::max(),
...@@ -87,15 +107,8 @@ _getOutgoingNormal(const MeshType& mesh, ...@@ -87,15 +107,8 @@ _getOutgoingNormal(const MeshType& mesh,
R2 xmax(-std::numeric_limits<double>::max(), R2 xmax(-std::numeric_limits<double>::max(),
-std::numeric_limits<double>::max()); -std::numeric_limits<double>::max());
if (face_list.extent(0)==0) { for (size_t r=0; r<m_node_list.extent(0); ++r) {
std::cerr << "face_list is empty! Cannot compute normal!\n"; const R2& x = xr[m_node_list[r]];
std::exit(1);
}
for (size_t l=0; l<face_list.extent(0); ++l) {
const unsigned int face_number = face_list[l];
for (int r=0; r<face_nb_nodes(face_number); ++r) {
const R2& x = xr(face_nodes(face_number,r));
if ((x[0]<xmin[0]) or ((x[0] == xmin[0]) and (x[1] < xmin[1]))) { if ((x[0]<xmin[0]) or ((x[0] == xmin[0]) and (x[1] < xmin[1]))) {
xmin = x; xmin = x;
} }
...@@ -103,7 +116,6 @@ _getOutgoingNormal(const MeshType& mesh, ...@@ -103,7 +116,6 @@ _getOutgoingNormal(const MeshType& mesh,
xmax = x; xmax = x;
} }
} }
}
if (xmin == xmax) { if (xmin == xmax) {
std::cerr << "xmin==xmax (" << xmin << "==" << xmax << ") unable to compute normal"; std::cerr << "xmin==xmax (" << xmin << "==" << xmax << ") unable to compute normal";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment