8 #ifndef WARPX_FINITE_DIFFERENCE_ALGORITHM_CYLINDRICAL_YEE_H_
9 #define WARPX_FINITE_DIFFERENCE_ALGORITHM_CYLINDRICAL_YEE_H_
33 using namespace amrex;
35 stencil_coefs_r.resize(1);
37 stencil_coefs_z.resize(1);
47 int const n_rz_azimuthal_modes ) {
48 using namespace amrex::literals;
52 std::array< amrex::Real, 6 >
const multimode_coeffs = {{ 0.2105_rt, 1.0_rt, 3.5234_rt, 8.5104_rt, 15.5059_rt, 24.5037_rt }};
53 const amrex::Real multimode_alpha = (n_rz_azimuthal_modes < 7)?
54 multimode_coeffs[n_rz_azimuthal_modes-1]:
55 (n_rz_azimuthal_modes - 1._rt)*(n_rz_azimuthal_modes - 1._rt) - 0.4_rt;
56 const amrex::Real delta_t = 1._rt / ( std::sqrt(
57 (1._rt + multimode_alpha) / (
dx[0]*
dx[0])
58 + 1._rt / (
dx[1]*
dx[1])
78 amrex::Real
const r, amrex::Real
const dr,
79 amrex::Real
const *
const coefs_r,
int const n_coefs_r,
80 int const i,
int const j,
int const k,
int const comp ) {
82 using namespace amrex;
85 Real
const inv_dr = coefs_r[0];
86 return 1._rt/
r * inv_dr*( (
r+0.5_rt*dr)*F(
i+1,j,k,comp) - (
r-0.5_rt*dr)*F(
i,j,k,comp) );
96 amrex::Real
const r, amrex::Real
const dr,
97 amrex::Real
const *
const coefs_r,
int const n_coefs_r,
98 int const i,
int const j,
int const k,
int const comp ) {
100 using namespace amrex;
103 Real
const inv_dr = coefs_r[0];
104 return 1._rt/
r * inv_dr*( (
r+0.5_rt*dr)*F(
i,j,k,comp) - (
r-0.5_rt*dr)*F(
i-1,j,k,comp) );
112 amrex::Real
const *
const coefs_r,
int const n_coefs_r,
113 int const i,
int const j,
int const k,
int const comp ) {
115 using namespace amrex;
118 Real
const inv_dr = coefs_r[0];
119 return inv_dr*( F(
i+1,j,k,comp) - F(
i,j,k,comp) );
127 amrex::Real
const *
const coefs_r,
int const n_coefs_r,
128 int const i,
int const j,
int const k,
int const comp ) {
130 using namespace amrex;
133 Real
const inv_dr = coefs_r[0];
134 return inv_dr*( F(
i,j,k,comp) - F(
i-1,j,k,comp) );
140 template<
typename T_Field>
144 amrex::Real
const r, amrex::Real
const dr,
145 amrex::Real
const *
const coefs_r,
int const ,
146 int const i,
int const j,
int const k,
int const comp ) {
148 using namespace amrex;
150 Real
const inv_dr2 = coefs_r[0]*coefs_r[0];
151 return 1._rt/
r * inv_dr2*( (
r+0.5_rt*dr)*(F(
i+1,j,k,comp) - F(
i,j,k,comp))
152 - (
r-0.5_rt*dr)*(F(
i,j,k,comp) - F(
i-1,j,k,comp)) );
160 amrex::Real
const *
const coefs_z,
int const n_coefs_z,
161 int const i,
int const j,
int const k,
int const comp ) {
165 amrex::Real
const inv_dz = coefs_z[0];
166 return inv_dz*( F(
i,j+1,k,comp) - F(
i,j,k,comp) );
174 amrex::Real
const *
const coefs_z,
int const n_coefs_z,
175 int const i,
int const j,
int const k,
int const comp ) {
179 amrex::Real
const inv_dz = coefs_z[0];
180 return inv_dz*( F(
i,j,k,comp) - F(
i,j-1,k,comp) );
185 template<
typename T_Field>
189 amrex::Real
const *
const coefs_z,
int const ,
190 int const i,
int const j,
int const k,
int const ncomp=0 ) {
192 using namespace amrex;
193 Real
const inv_dz2 = coefs_z[0]*coefs_z[0];
195 return inv_dz2*( F(
i,j-1,k,ncomp) - 2._rt*F(
i,j,k,ncomp) + F(
i,j+1,k,ncomp) );
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
#define AMREX_D_DECL(a, b, c)
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
i
Definition: check_interp_points_and_weights.py:174
cell_size
Definition: compute_domain.py:37
tuple dx
lab frame
Definition: stencil.py:429
Definition: CylindricalYeeAlgorithm.H:26
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real Dzz(T_Field const &F, amrex::Real const *const coefs_z, int const, int const i, int const j, int const k, int const ncomp=0)
Definition: CylindricalYeeAlgorithm.H:187
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real UpwardDz(amrex::Array4< amrex::Real > const &F, amrex::Real const *const coefs_z, int const n_coefs_z, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:158
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real UpwardDr(amrex::Array4< amrex::Real > const &F, amrex::Real const *const coefs_r, int const n_coefs_r, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:110
static amrex::IntVect GetMaxGuardCell()
Returns maximum number of guard cells required by the field-solve.
Definition: CylindricalYeeAlgorithm.H:66
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real Dr_rDr_over_r(T_Field const &F, amrex::Real const r, amrex::Real const dr, amrex::Real const *const coefs_r, int const, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:142
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real DownwardDr(amrex::Array4< amrex::Real > const &F, amrex::Real const *const coefs_r, int const n_coefs_r, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:125
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real DownwardDrr_over_r(amrex::Array4< amrex::Real > const &F, amrex::Real const r, amrex::Real const dr, amrex::Real const *const coefs_r, int const n_coefs_r, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:94
static amrex::Real ComputeMaxDt(amrex::Real const *const dx, int const n_rz_azimuthal_modes)
Definition: CylindricalYeeAlgorithm.H:46
static void InitializeStencilCoefficients(std::array< amrex::Real, 3 > &cell_size, amrex::Vector< amrex::Real > &stencil_coefs_r, amrex::Vector< amrex::Real > &stencil_coefs_z)
Definition: CylindricalYeeAlgorithm.H:28
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real DownwardDz(amrex::Array4< amrex::Real > const &F, amrex::Real const *const coefs_z, int const n_coefs_z, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:172
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real UpwardDrr_over_r(amrex::Array4< amrex::Real > const &F, amrex::Real const r, amrex::Real const dr, amrex::Real const *const coefs_r, int const n_coefs_r, int const i, int const j, int const k, int const comp)
Definition: CylindricalYeeAlgorithm.H:76