xref: /petsc/src/ksp/ksp/tutorials/amrex/MyEB.H (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
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