Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_EB_STL_utils.H
Go to the documentation of this file.
1#ifndef AMREX_EB_STL_UTILS_H_
2#define AMREX_EB_STL_UTILS_H_
3
4#include <AMReX_Config.H>
5#include <AMReX_Geometry.H>
6#include <AMReX_MultiFab.H>
7#include <AMReX_Dim3.H>
8#include <AMReX_EB2_Graph.H>
9
10#include <algorithm>
11#include <cstdint>
12#include <limits>
13#include <utility>
14
15namespace amrex
16{
17
19{
20public:
21
23 struct Triangle {
24 XDim3 v1, v2, v3;
25
26 [[nodiscard]] Real cent (int d) const
27 {
28 static_assert(sizeof(XDim3) == sizeof(Real)*3);
29 return Real(1./3.)*((&v1.x)[d] + (&v2.x)[d] + (&v3.x)[d]);
30 }
31
32 [[nodiscard]] std::pair<Real,Real> minmax (int d) const
33 {
34 static_assert(sizeof(XDim3) == sizeof(Real)*3);
35 return std::minmax({(&v1.x)[d], (&v2.x)[d], (&v3.x)[d]});
36 }
37 };
39
41 template <int M, int N>
42 struct BVHNodeT
43 {
44 RealBox boundingbox{AMREX_D_DECL(std::numeric_limits<Real>::max(),
45 std::numeric_limits<Real>::max(),
46 std::numeric_limits<Real>::max()),
47 AMREX_D_DECL(std::numeric_limits<Real>::lowest(),
48 std::numeric_limits<Real>::lowest(),
49 std::numeric_limits<Real>::lowest())};
50 STLtools::Triangle triangles[M];
51 XDim3 trinorm[M];
52 int children[N];
53 std::int8_t ntriangles = 0;
54 std::int8_t nchildren = 0;
55 };
57
58 static constexpr int m_bvh_max_size = 4; // max # of triangles in a leaf node
59 static constexpr int m_bvh_max_splits = 4; // max # of children
60 static constexpr int m_bvh_max_stack_size = 12; // max depth of the tree
61
62 using Node = BVHNodeT<m_bvh_max_size,m_bvh_max_splits>;
63
64 static constexpr int allregular = -1;
65 static constexpr int mixedcells = 0;
66 static constexpr int allcovered = 1;
67
68 void setBVHOptimization (bool flag) { m_bvh_optimization = flag; }
69
70 void read_stl_file (std::string const& fname, Real scale, Array<Real,3> const& center,
71 int reverse_normal);
72
73 void fill (MultiFab& mf, IntVect const& nghost, Geometry const& geom,
74 Real outside_value = -1._rt, Real inside_value = 1._rt) const;
75
76 [[nodiscard]] int getBoxType (Box const& box, Geometry const& geom, RunOn) const;
77
78 static constexpr bool isGPUable () noexcept { return true; }
79
80 void fillFab (BaseFab<Real>& levelset, const Geometry& geom, RunOn,
81 Box const& bounding_box) const;
82
83 void getIntercept (Array<Array4<Real>,AMREX_SPACEDIM> const& inter_arr,
84 Array<Array4<EB2::Type_t const>,AMREX_SPACEDIM> const& type_arr,
85 Array4<Real const> const& lst, Geometry const& geom, RunOn,
86 Box const& bounding_box) const;
87
88 static void updateIntercept (Array<Array4<Real>,AMREX_SPACEDIM> const& inter_arr,
89 Array<Array4<EB2::Type_t const>,AMREX_SPACEDIM> const& type_arr,
90 Array4<Real const> const& lst, Geometry const& geom) ;
91
92 void fillSignedDistance (MultiFab& mf, IntVect const& nghost, Geometry const& geom) const;
93
94 void prepare (Gpu::PinnedVector<Triangle> a_tri_pts); // public for cuda
95
96private:
97
98 bool m_bvh_optimization = true;
99
103
105
106 XDim3 m_ptmin; // All triangles are inside the bounding box defined by
107 XDim3 m_ptmax; // m_ptmin and m_ptmax.
108 XDim3 m_ptref; // The reference point is slightly outside the bounding box.
109 bool m_boundry_is_outside; // Is the bounding box boundary outside or inside the object?
110
111 void read_ascii_stl_file (std::string const& fname, Real scale,
112 Array<Real,3> const& center, int reverse_normal,
113 Gpu::PinnedVector<Triangle>& a_tri_pts);
114 void read_binary_stl_file (std::string const& fname, Real scale,
115 Array<Real,3> const& center, int reverse_normal,
116 Gpu::PinnedVector<Triangle>& a_tri_pts);
117
118 static void build_bvh (Triangle* begin, Triangle * end, Gpu::PinnedVector<Node>& bvh_nodes);
119 static void bvh_size (int ntri, std::size_t& nnodes);
120};
121
122}
123#endif
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
A FortranArrayBox(FAB)-like object.
Definition AMReX_BaseFab.H:185
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
A Box with real dimensions.
Definition AMReX_RealBox.H:26
Definition AMReX_EB_STL_utils.H:19
int m_num_tri
Definition AMReX_EB_STL_utils.H:104
static void bvh_size(int ntri, std::size_t &nnodes)
Definition AMReX_EB_STL_utils.cpp:818
static constexpr int allregular
Definition AMReX_EB_STL_utils.H:64
static constexpr int m_bvh_max_stack_size
Definition AMReX_EB_STL_utils.H:60
XDim3 m_ptmax
Definition AMReX_EB_STL_utils.H:107
static void updateIntercept(Array< Array4< Real >, 3 > const &inter_arr, Array< Array4< EB2::Type_t const >, 3 > const &type_arr, Array4< Real const > const &lst, Geometry const &geom)
Definition AMReX_EB_STL_utils.cpp:1271
static constexpr int m_bvh_max_size
Definition AMReX_EB_STL_utils.H:58
static constexpr int m_bvh_max_splits
Definition AMReX_EB_STL_utils.H:59
void fillSignedDistance(MultiFab &mf, IntVect const &nghost, Geometry const &geom) const
Definition AMReX_EB_STL_utils.cpp:1328
Gpu::DeviceVector< Node > m_bvh_nodes
Definition AMReX_EB_STL_utils.H:102
BVHNodeT< m_bvh_max_size, m_bvh_max_splits > Node
Definition AMReX_EB_STL_utils.H:62
int getBoxType(Box const &box, Geometry const &geom, RunOn) const
Definition AMReX_EB_STL_utils.cpp:911
bool m_bvh_optimization
Definition AMReX_EB_STL_utils.H:98
void prepare(Gpu::PinnedVector< Triangle > a_tri_pts)
Definition AMReX_EB_STL_utils.cpp:559
void fill(MultiFab &mf, IntVect const &nghost, Geometry const &geom, Real outside_value=-1._rt, Real inside_value=1._rt) const
Definition AMReX_EB_STL_utils.cpp:835
void getIntercept(Array< Array4< Real >, 3 > const &inter_arr, Array< Array4< EB2::Type_t const >, 3 > const &type_arr, Array4< Real const > const &lst, Geometry const &geom, RunOn, Box const &bounding_box) const
Definition AMReX_EB_STL_utils.cpp:1087
void read_binary_stl_file(std::string const &fname, Real scale, Array< Real, 3 > const &center, int reverse_normal, Gpu::PinnedVector< Triangle > &a_tri_pts)
Definition AMReX_EB_STL_utils.cpp:433
XDim3 m_ptref
Definition AMReX_EB_STL_utils.H:108
void read_stl_file(std::string const &fname, Real scale, Array< Real, 3 > const &center, int reverse_normal)
Definition AMReX_EB_STL_utils.cpp:406
void setBVHOptimization(bool flag)
Definition AMReX_EB_STL_utils.H:68
Gpu::DeviceVector< XDim3 > m_tri_normals_d
Definition AMReX_EB_STL_utils.H:101
static constexpr int mixedcells
Definition AMReX_EB_STL_utils.H:65
static constexpr bool isGPUable() noexcept
Definition AMReX_EB_STL_utils.H:78
static constexpr int allcovered
Definition AMReX_EB_STL_utils.H:66
void read_ascii_stl_file(std::string const &fname, Real scale, Array< Real, 3 > const &center, int reverse_normal, Gpu::PinnedVector< Triangle > &a_tri_pts)
Definition AMReX_EB_STL_utils.cpp:487
bool m_boundry_is_outside
Definition AMReX_EB_STL_utils.H:109
XDim3 m_ptmin
Definition AMReX_EB_STL_utils.H:106
void fillFab(BaseFab< Real > &levelset, const Geometry &geom, RunOn, Box const &bounding_box) const
Definition AMReX_EB_STL_utils.cpp:1019
static void build_bvh(Triangle *begin, Triangle *end, Gpu::PinnedVector< Node > &bvh_nodes)
Definition AMReX_EB_STL_utils.cpp:734
Gpu::DeviceVector< Triangle > m_tri_pts_d
Definition AMReX_EB_STL_utils.H:100
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
std::array< T, N > Array
Definition AMReX_Array.H:25
Definition AMReX_Amr.cpp:49
RunOn
Definition AMReX_GpuControl.H:69
__host__ __device__ Dim3 begin(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2006
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2015
__host__ __device__ IntVectND< dim > scale(const IntVectND< dim > &p, int s) noexcept
Returns a IntVectND obtained by multiplying each of the components of this IntVectND by s.
Definition AMReX_IntVect.H:1016
Definition AMReX_Array4.H:61
Definition AMReX_Dim3.H:13
Real x
Definition AMReX_Dim3.H:13