1 #ifndef ERF_EB_POLYGON_H_
2 #define ERF_EB_POLYGON_H_
4 #include <AMReX_REAL.H>
5 #include <AMReX_RealVect.H>
15 amrex::RealVect a_normal )
23 ,
m_vertex({amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.),
24 amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.)})
37 ,
m_vertex({amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.),
38 amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.)})
54 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
57 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
81 amrex::Array<amrex::RealVect,m_max_vertices> vertex_cent;
87 m_zdir = vertex_cent[0].crossProduct(vertex_cent[i]);
88 if ( !amrex::almostEqual(
m_zdir.vectorLength(),0.) ) {
break; }
90 AMREX_ALWAYS_ASSERT(!amrex::almostEqual(
m_zdir.vectorLength(), 0.));
96 m_theta[i] = std::atan2(
m_zdir.dotProduct( vertex_cent[0].crossProduct(vertex_cent[i]) ),
97 vertex_cent[0].dotProduct(vertex_cent[i]));
108 amrex::Swap(vertex_cent[j], vertex_cent[j+1]);
117 amrex::RealVect vi_cross_vj = vertex_cent[i].crossProduct(vertex_cent[j]);
118 m_area += 0.5*vi_cross_vj.vectorLength();
120 AMREX_ALWAYS_ASSERT(
m_area > 0. );
123 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
124 int ok ( ) const noexcept
127 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
128 amrex::Real
area ( ) const noexcept {
129 AMREX_ALWAYS_ASSERT(
ok() );
134 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
135 amrex::Real
distance ( amrex::RealVect
const& a_point )
const noexcept {
137 amrex::RealVect x0 = a_point -
m_vertex[0];
138 return amrex::Math::abs(x0.dotProduct(
m_zdir));
142 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
144 amrex::RealVect cent(0.);
149 amrex::Real
area(0.);
153 amrex::RealVect v0_cross_v1 = v0.crossProduct(v1);
154 amrex::Real area_tri = 0.5 * v0_cross_v1.vectorLength();
157 cent += area_tri * cent_tri;
165 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
166 amrex::RealVect
normal () const noexcept {
170 #ifndef AMREX_USE_GPU
171 void report (
int const a_id, amrex::RealVect a_v0 )
173 void report (
int const , amrex::RealVect )
177 #ifndef AMREX_USE_GPU
179 amrex::Print() <<
"Face " << a_id
180 <<
" -------------------------------------------\n"
181 <<
"\nok? " << (
ok() ?
"yes" :
"no") <<
"\n\n";
183 amrex::Print() <<
"v" << i <<
": " <<
m_vertex[i] <<
'\n';
185 amrex::Print() <<
"\nvc: " <<
" " << centroid <<
"\n";
187 amrex::Real
const dist =
distance( a_v0 );
190 amrex::Print() <<
"\narea: " <<
m_area
191 <<
"\ndistance: " << dist
192 <<
"\nvolume: " << dist*
m_area
193 <<
"\n==================================================\n\n";
214 amrex::Array<amrex::RealVect,m_max_vertices>
m_vertex;
216 amrex::GpuArray<amrex::Real,m_max_vertices>
m_theta;
constexpr amrex::Real PI
Definition: ERF_Constants.H:6
Definition: ERF_EBPolygon.H:9
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::RealVect get_centroid() const noexcept
Definition: ERF_EBPolygon.H:143
int m_defined
Definition: ERF_EBPolygon.H:206
amrex::Real m_area
Definition: ERF_EBPolygon.H:210
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int ok() const noexcept
Definition: ERF_EBPolygon.H:124
amrex::GpuArray< amrex::Real, m_max_vertices > m_theta
Definition: ERF_EBPolygon.H:216
AMREX_GPU_HOST_DEVICE void add_vertex(amrex::RealVect const &a_v)
Definition: ERF_EBPolygon.H:43
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real distance(amrex::RealVect const &a_point) const noexcept
Definition: ERF_EBPolygon.H:135
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real area() const noexcept
Definition: ERF_EBPolygon.H:128
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void set_area(amrex::Real const &a_area)
Definition: ERF_EBPolygon.H:55
int const m_cell_face
Definition: ERF_EBPolygon.H:201
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::RealVect normal() const noexcept
Definition: ERF_EBPolygon.H:166
int m_sorted
Definition: ERF_EBPolygon.H:212
int m_vertices
Definition: ERF_EBPolygon.H:208
amrex::Array< amrex::RealVect, m_max_vertices > m_vertex
Definition: ERF_EBPolygon.H:214
amrex::RealVect const m_eb_normal
Definition: ERF_EBPolygon.H:204
static constexpr int m_max_vertices
Definition: ERF_EBPolygon.H:199
void report(int const a_id, amrex::RealVect a_v0)
Definition: ERF_EBPolygon.H:171
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void define()
Definition: ERF_EBPolygon.H:58
AMREX_GPU_HOST_DEVICE polygon_()
Definition: ERF_EBPolygon.H:29
AMREX_GPU_HOST_DEVICE polygon_(amrex::RealVect a_point, amrex::RealVect a_normal)
Definition: ERF_EBPolygon.H:14
amrex::RealVect const m_eb_point
Definition: ERF_EBPolygon.H:203
amrex::RealVect m_zdir
Definition: ERF_EBPolygon.H:218