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_vertices({amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.),
24 amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.)})
37 ,
m_vertices({amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.),
38 amrex::RealVect(0.), amrex::RealVect(0.), amrex::RealVect(0.)})
44 const std::string& msg,
bool print_msg =
false)
47 amrex::Print() << msg <<
"\n";
55 if ( amrex::almostEqual(
m_vertices[i][0],a_v[0]) &&
57 amrex::almostEqual(
m_vertices[i][2],a_v[2]) ) {
71 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
74 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
98 amrex::Array<amrex::RealVect,m_max_vertices> vertex_cent;
105 amrex::RealVect v_normal;
107 const amrex::RealVect& vertex_cent_0 = vertex_cent[0];
111 amrex::RealVect
vi = vertex_cent[i];
112 amrex::RealVect v_cross = vertex_cent_0.crossProduct(
vi);
120 if (!amrex::almostEqual(max_norm2, 0.0))
122 v_normal /= std::sqrt(max_norm2);
131 m_theta[i] = std::atan2(
m_zdir.dotProduct( vertex_cent[0].crossProduct(vertex_cent[i]) ),
132 vertex_cent[0].dotProduct(vertex_cent[i]));
143 amrex::Swap(vertex_cent[j], vertex_cent[j+1]);
153 amrex::RealVect vi_cross_vj = vertex_cent[i].crossProduct(vertex_cent[j]);
154 m_area += 0.5*vi_cross_vj.vectorLength();
156 AMREX_ALWAYS_ASSERT(
m_area > 0. );
159 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
160 int ok ( ) const noexcept
163 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
165 AMREX_ALWAYS_ASSERT(
ok() );
170 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
174 return amrex::Math::abs(x0.dotProduct(
m_zdir));
178 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
180 amrex::RealVect cent(0.);
189 amrex::RealVect v0_cross_v1 = v0.crossProduct(v1);
190 amrex::Real area_tri = 0.5 * v0_cross_v1.vectorLength();
193 cent += area_tri * cent_tri;
201 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
202 amrex::RealVect
normal () const noexcept {
206 #ifndef AMREX_USE_GPU
207 void report (
int const a_id, amrex::RealVect a_v0 )
209 void report (
int const , amrex::RealVect )
213 #ifndef AMREX_USE_GPU
215 amrex::Print() <<
"Face " << a_id
216 <<
" -------------------------------------------\n"
217 <<
"\nok? " << (
ok() ?
"yes" :
"no") <<
"\n\n";
219 amrex::Print() <<
"v" << i <<
": " <<
m_vertices[i] <<
'\n';
221 amrex::Print() <<
"\nvc: " <<
" " << centroid <<
"\n";
226 amrex::Print() <<
"\narea: " <<
m_area
227 <<
"\ndistance: " << dist
228 <<
"\nvolume: " << dist*
m_area
229 <<
"\n==================================================\n\n";
234 amrex::Print() <<
"EBPolygon: id = " << a_id <<
", m_num_vertices = " <<
m_num_vertices <<
'\n';
236 amrex::Print() <<
"EBPolygon: v" << i <<
": " <<
m_vertices[i] <<
'\n';
262 amrex::GpuArray<amrex::Real,m_max_vertices>
m_theta;
constexpr amrex::Real PI
Definition: ERF_Constants.H:6
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_EBPolygon.H:9
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::RealVect get_centroid() const noexcept
Definition: ERF_EBPolygon.H:179
int m_defined
Definition: ERF_EBPolygon.H:252
AMREX_GPU_HOST_DEVICE int get_num_vertices()
Definition: ERF_EBPolygon.H:67
amrex::Real m_area
Definition: ERF_EBPolygon.H:256
amrex::Array< amrex::RealVect, m_max_vertices > m_vertices
Definition: ERF_EBPolygon.H:260
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int ok() const noexcept
Definition: ERF_EBPolygon.H:160
amrex::GpuArray< amrex::Real, m_max_vertices > m_theta
Definition: ERF_EBPolygon.H:262
AMREX_GPU_HOST_DEVICE void add_vertex(amrex::RealVect const &a_v)
Definition: ERF_EBPolygon.H:53
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real distance(amrex::RealVect const &a_point) const noexcept
Definition: ERF_EBPolygon.H:171
void debug(int const a_id)
Definition: ERF_EBPolygon.H:233
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real area() const noexcept
Definition: ERF_EBPolygon.H:164
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void set_area(amrex::Real const &a_area)
Definition: ERF_EBPolygon.H:72
AMREX_GPU_HOST void add_vertex(amrex::RealVect const &a_v, const std::string &msg, bool print_msg=false)
Definition: ERF_EBPolygon.H:43
void debug()
Definition: ERF_EBPolygon.H:239
int const m_cell_face
Definition: ERF_EBPolygon.H:247
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::RealVect normal() const noexcept
Definition: ERF_EBPolygon.H:202
int m_sorted
Definition: ERF_EBPolygon.H:258
amrex::RealVect const m_eb_normal
Definition: ERF_EBPolygon.H:250
static constexpr int m_max_vertices
Definition: ERF_EBPolygon.H:245
void report(int const a_id, amrex::RealVect a_v0)
Definition: ERF_EBPolygon.H:207
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void define()
Definition: ERF_EBPolygon.H:75
int m_num_vertices
Definition: ERF_EBPolygon.H:254
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:249
amrex::RealVect m_zdir
Definition: ERF_EBPolygon.H:264
real(c_double), private vi
Definition: ERF_module_mp_morr_two_moment.F90:219