Actual source code: MyEB.H
petsc-3.13.4 2020-08-01
1: #ifndef MY_EB_H_
2: #define MY_EB_H_
4: #include <AMReX_Array.H>
5: #include <AMReX_EB2_IF_Base.H>
7: #include <cmath>
8: #include <algorithm>
10: // For all implicit functions, >0: body; =0: boundary; <0: fluid
12: class FlowerIF
13: : amrex::GPUable
14: {
15: public:
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: {}
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;
34: AMREX_GPU_HOST_DEVICE inline
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: }
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: }
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: };
60: #endif