8 #ifndef OPEN_BOUNDARY_H_
9 #define OPEN_BOUNDARY_H_
18 amrex::Real
pow (amrex::Real base) {
19 using namespace amrex::literals;
20 if constexpr (
exp==0) {
22 }
else if constexpr (
exp==1) {
25 return pow<
exp-1>(base) * base;
63 using namespace amrex::literals;
68 s_v*(-pow<2>(
x) + pow<2>(y)),
70 s_v*(pow<3>(
x) - 3*
x*pow<2>(y)),
71 s_v*(-3*pow<2>(
x)*y + pow<3>(y)),
72 s_v*(pow<4>(
x) - 6*pow<2>(
x)*pow<2>(y) + pow<4>(y)),
73 s_v*(-pow<3>(
x)*y +
x*pow<3>(y)),
74 s_v*(pow<5>(
x) - 10*pow<3>(
x)*pow<2>(y) + 5*
x*pow<4>(y)),
75 s_v*(5*pow<4>(
x)*y - 10*pow<2>(
x)*pow<3>(y) + pow<5>(y)),
76 s_v*(-pow<6>(
x) + 15*pow<4>(
x)*pow<2>(y) - 15*pow<2>(
x)*pow<4>(y) + pow<6>(y)),
77 s_v*(pow<5>(
x)*y - 10.0_rt/3.0_rt*pow<3>(
x)*pow<3>(y) +
x*pow<5>(y)),
78 s_v*(pow<7>(
x) - 21*pow<5>(
x)*pow<2>(y) + 35*pow<3>(
x)*pow<4>(y) - 7*
x*pow<6>(y)),
79 s_v*(-7*pow<6>(
x)*y + 35*pow<4>(
x)*pow<3>(y) - 21*pow<2>(
x)*pow<5>(y) + pow<7>(y)),
80 s_v*(pow<8>(
x) - 28*pow<6>(
x)*pow<2>(y) + 70*pow<4>(
x)*pow<4>(y) - 28*pow<2>(
x)*pow<6>(y) + pow<8>(y)),
81 s_v*(-pow<7>(
x)*y + 7*pow<5>(
x)*pow<3>(y) - 7*pow<3>(
x)*pow<5>(y) +
x*pow<7>(y)),
82 s_v*(pow<9>(
x) - 36*pow<7>(
x)*pow<2>(y) + 126*pow<5>(
x)*pow<4>(y) - 84*pow<3>(
x)*pow<6>(y) + 9*
x*pow<8>(y)),
83 s_v*(9*pow<8>(
x)*y - 84*pow<6>(
x)*pow<3>(y) + 126*pow<4>(
x)*pow<5>(y) - 36*pow<2>(
x)*pow<7>(y) + pow<9>(y)),
84 s_v*(-pow<10>(
x) + 45*pow<8>(
x)*pow<2>(y) - 210*pow<6>(
x)*pow<4>(y) + 210*pow<4>(
x)*pow<6>(y) - 45*pow<2>(
x)*pow<8>(y) + pow<10>(y)),
85 s_v*(pow<9>(
x)*y - 12*pow<7>(
x)*pow<3>(y) + (126.0_rt/5.0_rt)*pow<5>(
x)*pow<5>(y) - 12*pow<3>(
x)*pow<7>(y) +
x*pow<9>(y)),
86 s_v*(pow<11>(
x) - 55*pow<9>(
x)*pow<2>(y) + 330*pow<7>(
x)*pow<4>(y) - 462*pow<5>(
x)*pow<6>(y) + 165*pow<3>(
x)*pow<8>(y) - 11*
x*pow<10>(y)),
87 s_v*(-11*pow<10>(
x)*y + 165*pow<8>(
x)*pow<3>(y) - 462*pow<6>(
x)*pow<5>(y) + 330*pow<4>(
x)*pow<7>(y) - 55*pow<2>(
x)*pow<9>(y) + pow<11>(y)),
88 s_v*(pow<12>(
x) - 66*pow<10>(
x)*pow<2>(y) + 495*pow<8>(
x)*pow<4>(y) - 924*pow<6>(
x)*pow<6>(y) + 495*pow<4>(
x)*pow<8>(y) - 66*pow<2>(
x)*pow<10>(y) + pow<12>(y)),
89 s_v*(-pow<11>(
x)*y + (55.0_rt/3.0_rt)*pow<9>(
x)*pow<3>(y) - 66*pow<7>(
x)*pow<5>(y) + 66*pow<5>(
x)*pow<7>(y) - 55.0_rt/3.0_rt*pow<3>(
x)*pow<9>(y) +
x*pow<11>(y)),
90 s_v*(pow<13>(
x) - 78*pow<11>(
x)*pow<2>(y) + 715*pow<9>(
x)*pow<4>(y) - 1716*pow<7>(
x)*pow<6>(y) + 1287*pow<5>(
x)*pow<8>(y) - 286*pow<3>(
x)*pow<10>(y) + 13*
x*pow<12>(y)),
91 s_v*(13*pow<12>(
x)*y - 286*pow<10>(
x)*pow<3>(y) + 1287*pow<8>(
x)*pow<5>(y) - 1716*pow<6>(
x)*pow<7>(y) + 715*pow<4>(
x)*pow<9>(y) - 78*pow<2>(
x)*pow<11>(y) + pow<13>(y)),
92 s_v*(-pow<14>(
x) + 91*pow<12>(
x)*pow<2>(y) - 1001*pow<10>(
x)*pow<4>(y) + 3003*pow<8>(
x)*pow<6>(y) - 3003*pow<6>(
x)*pow<8>(y) + 1001*pow<4>(
x)*pow<10>(y) - 91*pow<2>(
x)*pow<12>(y) + pow<14>(y)),
93 s_v*(pow<13>(
x)*y - 26*pow<11>(
x)*pow<3>(y) + 143*pow<9>(
x)*pow<5>(y) - 1716.0_rt/7.0_rt*pow<7>(
x)*pow<7>(y) + 143*pow<5>(
x)*pow<9>(y) - 26*pow<3>(
x)*pow<11>(y) +
x*pow<13>(y)),
94 s_v*(pow<15>(
x) - 105*pow<13>(
x)*pow<2>(y) + 1365*pow<11>(
x)*pow<4>(y) - 5005*pow<9>(
x)*pow<6>(y) + 6435*pow<7>(
x)*pow<8>(y) - 3003*pow<5>(
x)*pow<10>(y) + 455*pow<3>(
x)*pow<12>(y) - 15*
x*pow<14>(y)),
95 s_v*(-15*pow<14>(
x)*y + 455*pow<12>(
x)*pow<3>(y) - 3003*pow<10>(
x)*pow<5>(y) + 6435*pow<8>(
x)*pow<7>(y) - 5005*pow<6>(
x)*pow<9>(y) + 1365*pow<4>(
x)*pow<11>(y) - 105*pow<2>(
x)*pow<13>(y) + pow<15>(y)),
96 s_v*(pow<16>(
x) - 120*pow<14>(
x)*pow<2>(y) + 1820*pow<12>(
x)*pow<4>(y) - 8008*pow<10>(
x)*pow<6>(y) + 12870*pow<8>(
x)*pow<8>(y) - 8008*pow<6>(
x)*pow<10>(y) + 1820*pow<4>(
x)*pow<12>(y) - 120*pow<2>(
x)*pow<14>(y) + pow<16>(y)),
97 s_v*(-pow<15>(
x)*y + 35*pow<13>(
x)*pow<3>(y) - 273*pow<11>(
x)*pow<5>(y) + 715*pow<9>(
x)*pow<7>(y) - 715*pow<7>(
x)*pow<9>(y) + 273*pow<5>(
x)*pow<11>(y) - 35*pow<3>(
x)*pow<13>(y) +
x*pow<15>(y)),
98 s_v*(pow<17>(
x) - 136*pow<15>(
x)*pow<2>(y) + 2380*pow<13>(
x)*pow<4>(y) - 12376*pow<11>(
x)*pow<6>(y) + 24310*pow<9>(
x)*pow<8>(y) - 19448*pow<7>(
x)*pow<10>(y) + 6188*pow<5>(
x)*pow<12>(y) - 680*pow<3>(
x)*pow<14>(y) + 17*
x*pow<16>(y)),
99 s_v*(17*pow<16>(
x)*y - 680*pow<14>(
x)*pow<3>(y) + 6188*pow<12>(
x)*pow<5>(y) - 19448*pow<10>(
x)*pow<7>(y) + 24310*pow<8>(
x)*pow<9>(y) - 12376*pow<6>(
x)*pow<11>(y) + 2380*pow<4>(
x)*pow<13>(y) - 136*pow<2>(
x)*pow<15>(y) + pow<17>(y)),
100 s_v*(-pow<18>(
x) + 153*pow<16>(
x)*pow<2>(y) - 3060*pow<14>(
x)*pow<4>(y) + 18564*pow<12>(
x)*pow<6>(y) - 43758*pow<10>(
x)*pow<8>(y) + 43758*pow<8>(
x)*pow<10>(y) - 18564*pow<6>(
x)*pow<12>(y) + 3060*pow<4>(
x)*pow<14>(y) - 153*pow<2>(
x)*pow<16>(y) + pow<18>(y)),
101 s_v*(pow<17>(
x)*y - 136.0_rt/3.0_rt*pow<15>(
x)*pow<3>(y) + 476*pow<13>(
x)*pow<5>(y) - 1768*pow<11>(
x)*pow<7>(y) + (24310.0_rt/9.0_rt)*pow<9>(
x)*pow<9>(y) - 1768*pow<7>(
x)*pow<11>(y) + 476*pow<5>(
x)*pow<13>(y) - 136.0_rt/3.0_rt*pow<3>(
x)*pow<15>(y) +
x*pow<17>(y))
114 using namespace amrex::literals;
115 amrex::Real radius_2 = pow<2>(x_domain) + pow<2>(y_domain);
117 amrex::Real
x = x_domain / radius_2;
118 amrex::Real y = y_domain / radius_2;
120 amrex::get<0>(m_c) * (std::log(radius_2))
121 + amrex::get<1>(m_c) * (-2*
x)
122 + amrex::get<2>(m_c) * (-2*y)
123 + amrex::get<3>(m_c) * (pow<2>(
x) - pow<2>(y))
124 + amrex::get<4>(m_c) * (-4*
x*y)
125 + amrex::get<5>(m_c) * (-2.0_rt/3.0_rt*pow<3>(
x) + 2*
x*pow<2>(y))
126 + amrex::get<6>(m_c) * (2*pow<2>(
x)*y - 2.0_rt/3.0_rt*pow<3>(y))
127 + amrex::get<7>(m_c) * (-1.0_rt/2.0_rt*pow<4>(
x) + 3*pow<2>(
x)*pow<2>(y) - 1.0_rt/2.0_rt*pow<4>(y))
128 + amrex::get<8>(m_c) * (8*pow<3>(
x)*y - 8*
x*pow<3>(y))
129 + amrex::get<9>(m_c) * (-2.0_rt/5.0_rt*pow<5>(
x) + 4*pow<3>(
x)*pow<2>(y) - 2*
x*pow<4>(y))
130 + amrex::get<10>(m_c) * (-2*pow<4>(
x)*y + 4*pow<2>(
x)*pow<3>(y) - 2.0_rt/5.0_rt*pow<5>(y))
131 + amrex::get<11>(m_c) * ((1.0_rt/3.0_rt)*pow<6>(
x) - 5*pow<4>(
x)*pow<2>(y) + 5*pow<2>(
x)*pow<4>(y) - 1.0_rt/3.0_rt*pow<6>(y))
132 + amrex::get<12>(m_c) * (-12*pow<5>(
x)*y + 40*pow<3>(
x)*pow<3>(y) - 12*
x*pow<5>(y))
133 + amrex::get<13>(m_c) * (-2.0_rt/7.0_rt*pow<7>(
x) + 6*pow<5>(
x)*pow<2>(y) - 10*pow<3>(
x)*pow<4>(y) + 2*
x*pow<6>(y))
134 + amrex::get<14>(m_c) * (2*pow<6>(
x)*y - 10*pow<4>(
x)*pow<3>(y) + 6*pow<2>(
x)*pow<5>(y) - 2.0_rt/7.0_rt*pow<7>(y))
135 + amrex::get<15>(m_c) * (-1.0_rt/4.0_rt*pow<8>(
x) + 7*pow<6>(
x)*pow<2>(y) - 35.0_rt/2.0_rt*pow<4>(
x)*pow<4>(y) + 7*pow<2>(
x)*pow<6>(y) - 1.0_rt/4.0_rt*pow<8>(y))
136 + amrex::get<16>(m_c) * (16*pow<7>(
x)*y - 112*pow<5>(
x)*pow<3>(y) + 112*pow<3>(
x)*pow<5>(y) - 16*
x*pow<7>(y))
137 + amrex::get<17>(m_c) * (-2.0_rt/9.0_rt*pow<9>(
x) + 8*pow<7>(
x)*pow<2>(y) - 28*pow<5>(
x)*pow<4>(y) + (56.0_rt/3.0_rt)*pow<3>(
x)*pow<6>(y) - 2*
x*pow<8>(y))
138 + amrex::get<18>(m_c) * (-2*pow<8>(
x)*y + (56.0_rt/3.0_rt)*pow<6>(
x)*pow<3>(y) - 28*pow<4>(
x)*pow<5>(y) + 8*pow<2>(
x)*pow<7>(y) - 2.0_rt/9.0_rt*pow<9>(y))
139 + amrex::get<19>(m_c) * ((1.0_rt/5.0_rt)*pow<10>(
x) - 9*pow<8>(
x)*pow<2>(y) + 42*pow<6>(
x)*pow<4>(y) - 42*pow<4>(
x)*pow<6>(y) + 9*pow<2>(
x)*pow<8>(y) - 1.0_rt/5.0_rt*pow<10>(y))
140 + amrex::get<20>(m_c) * (-20*pow<9>(
x)*y + 240*pow<7>(
x)*pow<3>(y) - 504*pow<5>(
x)*pow<5>(y) + 240*pow<3>(
x)*pow<7>(y) - 20*
x*pow<9>(y))
141 + amrex::get<21>(m_c) * (-2.0_rt/11.0_rt*pow<11>(
x) + 10*pow<9>(
x)*pow<2>(y) - 60*pow<7>(
x)*pow<4>(y) + 84*pow<5>(
x)*pow<6>(y) - 30*pow<3>(
x)*pow<8>(y) + 2*
x*pow<10>(y))
142 + amrex::get<22>(m_c) * (2*pow<10>(
x)*y - 30*pow<8>(
x)*pow<3>(y) + 84*pow<6>(
x)*pow<5>(y) - 60*pow<4>(
x)*pow<7>(y) + 10*pow<2>(
x)*pow<9>(y) - 2.0_rt/11.0_rt*pow<11>(y))
143 + amrex::get<23>(m_c) * (-1.0_rt/6.0_rt*pow<12>(
x) + 11*pow<10>(
x)*pow<2>(y) - 165.0_rt/2.0_rt*pow<8>(
x)*pow<4>(y) + 154*pow<6>(
x)*pow<6>(y) - 165.0_rt/2.0_rt*pow<4>(
x)*pow<8>(y) + 11*pow<2>(
x)*pow<10>(y) - 1.0_rt/6.0_rt*pow<12>(y))
144 + amrex::get<24>(m_c) * (24*pow<11>(
x)*y - 440*pow<9>(
x)*pow<3>(y) + 1584*pow<7>(
x)*pow<5>(y) - 1584*pow<5>(
x)*pow<7>(y) + 440*pow<3>(
x)*pow<9>(y) - 24*
x*pow<11>(y))
145 + amrex::get<25>(m_c) * (-2.0_rt/13.0_rt*pow<13>(
x) + 12*pow<11>(
x)*pow<2>(y) - 110*pow<9>(
x)*pow<4>(y) + 264*pow<7>(
x)*pow<6>(y) - 198*pow<5>(
x)*pow<8>(y) + 44*pow<3>(
x)*pow<10>(y) - 2*
x*pow<12>(y))
146 + amrex::get<26>(m_c) * (-2*pow<12>(
x)*y + 44*pow<10>(
x)*pow<3>(y) - 198*pow<8>(
x)*pow<5>(y) + 264*pow<6>(
x)*pow<7>(y) - 110*pow<4>(
x)*pow<9>(y) + 12*pow<2>(
x)*pow<11>(y) - 2.0_rt/13.0_rt*pow<13>(y))
147 + amrex::get<27>(m_c) * ((1.0_rt/7.0_rt)*pow<14>(
x) - 13*pow<12>(
x)*pow<2>(y) + 143*pow<10>(
x)*pow<4>(y) - 429*pow<8>(
x)*pow<6>(y) + 429*pow<6>(
x)*pow<8>(y) - 143*pow<4>(
x)*pow<10>(y) + 13*pow<2>(
x)*pow<12>(y) - 1.0_rt/7.0_rt*pow<14>(y))
148 + amrex::get<28>(m_c) * (-28*pow<13>(
x)*y + 728*pow<11>(
x)*pow<3>(y) - 4004*pow<9>(
x)*pow<5>(y) + 6864*pow<7>(
x)*pow<7>(y) - 4004*pow<5>(
x)*pow<9>(y) + 728*pow<3>(
x)*pow<11>(y) - 28*
x*pow<13>(y))
149 + amrex::get<29>(m_c) * (-2.0_rt/15.0_rt*pow<15>(
x) + 14*pow<13>(
x)*pow<2>(y) - 182*pow<11>(
x)*pow<4>(y) + (2002.0_rt/3.0_rt)*pow<9>(
x)*pow<6>(y) - 858*pow<7>(
x)*pow<8>(y) + (2002.0_rt/5.0_rt)*pow<5>(
x)*pow<10>(y) - 182.0_rt/3.0_rt*pow<3>(
x)*pow<12>(y) + 2*
x*pow<14>(y))
150 + amrex::get<30>(m_c) * (2*pow<14>(
x)*y - 182.0_rt/3.0_rt*pow<12>(
x)*pow<3>(y) + (2002.0_rt/5.0_rt)*pow<10>(
x)*pow<5>(y) - 858*pow<8>(
x)*pow<7>(y) + (2002.0_rt/3.0_rt)*pow<6>(
x)*pow<9>(y) - 182*pow<4>(
x)*pow<11>(y) + 14*pow<2>(
x)*pow<13>(y) - 2.0_rt/15.0_rt*pow<15>(y))
151 + amrex::get<31>(m_c) * (-1.0_rt/8.0_rt*pow<16>(
x) + 15*pow<14>(
x)*pow<2>(y) - 455.0_rt/2.0_rt*pow<12>(
x)*pow<4>(y) + 1001*pow<10>(
x)*pow<6>(y) - 6435.0_rt/4.0_rt*pow<8>(
x)*pow<8>(y) + 1001*pow<6>(
x)*pow<10>(y) - 455.0_rt/2.0_rt*pow<4>(
x)*pow<12>(y) + 15*pow<2>(
x)*pow<14>(y) - 1.0_rt/8.0_rt*pow<16>(y))
152 + amrex::get<32>(m_c) * (32*pow<15>(
x)*y - 1120*pow<13>(
x)*pow<3>(y) + 8736*pow<11>(
x)*pow<5>(y) - 22880*pow<9>(
x)*pow<7>(y) + 22880*pow<7>(
x)*pow<9>(y) - 8736*pow<5>(
x)*pow<11>(y) + 1120*pow<3>(
x)*pow<13>(y) - 32*
x*pow<15>(y))
153 + amrex::get<33>(m_c) * (-2.0_rt/17.0_rt*pow<17>(
x) + 16*pow<15>(
x)*pow<2>(y) - 280*pow<13>(
x)*pow<4>(y) + 1456*pow<11>(
x)*pow<6>(y) - 2860*pow<9>(
x)*pow<8>(y) + 2288*pow<7>(
x)*pow<10>(y) - 728*pow<5>(
x)*pow<12>(y) + 80*pow<3>(
x)*pow<14>(y) - 2*
x*pow<16>(y))
154 + amrex::get<34>(m_c) * (-2*pow<16>(
x)*y + 80*pow<14>(
x)*pow<3>(y) - 728*pow<12>(
x)*pow<5>(y) + 2288*pow<10>(
x)*pow<7>(y) - 2860*pow<8>(
x)*pow<9>(y) + 1456*pow<6>(
x)*pow<11>(y) - 280*pow<4>(
x)*pow<13>(y) + 16*pow<2>(
x)*pow<15>(y) - 2.0_rt/17.0_rt*pow<17>(y))
155 + amrex::get<35>(m_c) * ((1.0_rt/9.0_rt)*pow<18>(
x) - 17*pow<16>(
x)*pow<2>(y) + 340*pow<14>(
x)*pow<4>(y) - 6188.0_rt/3.0_rt*pow<12>(
x)*pow<6>(y) + 4862*pow<10>(
x)*pow<8>(y) - 4862*pow<8>(
x)*pow<10>(y) + (6188.0_rt/3.0_rt)*pow<6>(
x)*pow<12>(y) - 340*pow<4>(
x)*pow<14>(y) + 17*pow<2>(
x)*pow<16>(y) - 1.0_rt/9.0_rt*pow<18>(y))
156 + amrex::get<36>(m_c) * (-36*pow<17>(
x)*y + 1632*pow<15>(
x)*pow<3>(y) - 17136*pow<13>(
x)*pow<5>(y) + 63648*pow<11>(
x)*pow<7>(y) - 97240*pow<9>(
x)*pow<9>(y) + 63648*pow<7>(
x)*pow<11>(y) - 17136*pow<5>(
x)*pow<13>(y) + 1632*pow<3>(
x)*pow<15>(y) - 36*
x*pow<17>(y))
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
amrex::TypeMultiplier< amrex::GpuTuple, amrex::Real[37]> MultipoleTuple
Definition: OpenBoundary.H:30
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pow(amrex::Real base)
calculate low integer powers base^exp
Definition: OpenBoundary.H:18
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE MultipoleTuple GetMultipoleCoeffs(amrex::Real s_v, amrex::Real x, amrex::Real y)
get the multipole coefficients for open boundaries, these have to be integrated over all souces
Definition: OpenBoundary.H:61
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real GetFieldMultipole(MultipoleTuple m_c, amrex::Real x_domain, amrex::Real y_domain)
get the solution field using the multipole coefficients
Definition: OpenBoundary.H:112
amrex::TypeMultiplier< amrex::TypeList, amrex::Real[37]> MultipoleReduceTypeList
Definition: OpenBoundary.H:32
amrex::TypeMultiplier< amrex::TypeList, amrex::ReduceOpSum[37]> MultipoleReduceOpList
Definition: OpenBoundary.H:31
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > pow(const GpuComplex< T > &a_z, const T &a_y) noexcept
TypeAt< 0, decltype(detail::TApply< TParam >((TypeList<>{}+...+detail::SingleTypeMultiplier(Types{}))))> TypeMultiplier
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > exp(const GpuComplex< T > &a_z) noexcept