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