1 #ifndef MY_EB_H_
2 #define MY_EB_H_
3 
4 #include <AMReX_Array.H>
5 #include <AMReX_EB2_IF_Base.H>
6 
7 #include <cmath>
8 #include <algorithm>
9 
10 // For all implicit functions, >0: body; =0: boundary; <0: fluid
11 
12 class FlowerIF
13     : amrex::GPUable
14 {
15 public:
16 
FlowerIF(amrex::Real a_radius,amrex::Real a_delta,int a_npetals,const amrex::RealArray & a_center,bool a_inside)17     FlowerIF (amrex::Real a_radius, amrex::Real a_delta, int a_npetals,
18               const amrex::RealArray& a_center, bool a_inside)
19         : m_r(a_radius),
20           m_dr(a_delta),
21           m_npetals(a_npetals),
22           m_center(amrex::makeXDim3(a_center)),
23           m_inside(a_inside),
24           m_sign(a_inside ? 1.0 : -1.0)
25         {}
26 
~FlowerIF()27     ~FlowerIF () {}
28 
29     FlowerIF (const FlowerIF& rhs) noexcept = default;
30     FlowerIF (FlowerIF&& rhs) noexcept = default;
31     FlowerIF& operator= (const FlowerIF& rhs) = delete;
32     FlowerIF& operator= (FlowerIF&& rhs) = delete;
33 
34     AMREX_GPU_HOST_DEVICE inline
operator()35     amrex::Real operator() (AMREX_D_DECL(amrex::Real x, amrex::Real y, amrex::Real z))
36         const noexcept
37     {
38         amrex::Real posx = x - m_center.x;
39         amrex::Real posy = y - m_center.y;
40         amrex::Real r = std::hypot(posx, posy);
41         amrex::Real theta = std::atan2(posy, posx);
42         return m_sign*(r - m_r - m_dr * std::cos(m_npetals*theta));
43     }
44 
operator()45     inline amrex::Real operator() (const amrex::RealArray& p) const noexcept
46     {
47         return this->operator() (AMREX_D_DECL(p[0], p[1], p[2]));
48     }
49 
50 protected:
51     amrex::Real      m_r;
52     amrex::Real      m_dr;
53     amrex::Real      m_npetals;
54     amrex::XDim3     m_center;
55     bool             m_inside;
56     //
57     amrex::Real      m_sign;
58 };
59 
60 #endif
61