diff options
Diffstat (limited to 'Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms')
-rw-r--r-- | Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CylindricalYeeAlgorithm.H | 96 |
1 files changed, 38 insertions, 58 deletions
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CylindricalYeeAlgorithm.H b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CylindricalYeeAlgorithm.H index 3f408479c..9258fdff4 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CylindricalYeeAlgorithm.H +++ b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CylindricalYeeAlgorithm.H @@ -5,97 +5,77 @@ #include <AMReX_Array4.H> #include <AMReX_Gpu.H> -struct YeeAlgorithm { +struct CylindricalYeeAlgorithm { static void InitializeStencilCoefficients( std::array<amrex::Real,3>& cell_size, - amrex::Gpu::ManagedVector<amrex::Real>& stencil_coefs_x, - amrex::Gpu::ManagedVector<amrex::Real>& stencil_coefs_y, + amrex::Gpu::ManagedVector<amrex::Real>& stencil_coefs_r, amrex::Gpu::ManagedVector<amrex::Real>& stencil_coefs_z ) { // Store the inverse cell size along each direction in the coefficients - stencil_coefs_x.resize(1); - stencil_coefs_x[0] = 1./cell_size[0]; - stencil_coefs_y.resize(1); - stencil_coefs_y[0] = 1./cell_size[1]; + stencil_coefs_r.resize(1); + stencil_coefs_r[0] = 1./cell_size[0]; // 1./dr stencil_coefs_z.resize(1); - stencil_coefs_z[0] = 1./cell_size[2]; + stencil_coefs_z[0] = 1./cell_size[2]; // 1./dz } AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE - static amrex::Real UpwardDx( + static amrex::Real UpwardDr( amrex::Array4<amrex::Real> const& F, - amrex::Real const* coefs_x, int const n_coefs_x, - int const i, int const j, int const k ) { + amrex::Real const* coefs_r, int const n_coefs_r, + int const i, int const j, int const k, int const comp ) { - amrex::Real inv_dx = coefs_x[0]; - return inv_dx*( F(i+1,j,k) - F(i,j,k) ); + amrex::Real inv_dr = coefs_r[0]; + return inv_dr*( F(i+1,j,k,comp) - F(i,j,k,comp) ); }; AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE - static amrex::Real DownwardDx( + static amrex::Real DownwardDr( amrex::Array4<amrex::Real> const& F, - amrex::Real const* coefs_x, int const n_coefs_x, - int const i, int const j, int const k ) { + amrex::Real const* coefs_r, int const n_coefs_r, + int const i, int const j, int const k, int const comp ) { - amrex::Real inv_dx = coefs_x[0]; - return inv_dx*( F(i,j,k) - F(i-1,j,k) ); - }; - - AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE - static amrex::Real UpwardDy( - amrex::Array4<amrex::Real> const& F, - amrex::Real const* coefs_y, int const n_coefs_y, - int const i, int const j, int const k ) { - - #if defined WARPX_DIM_3D - amrex::Real inv_dy = coefs_y[0]; - return inv_dy*( F(i,j+1,k) - F(i,j,k) ); - #elif (defined WARPX_DIM_XZ) - return 0; // 2D Cartesian: derivative along y is 0 - #endif - }; - - AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE - static amrex::Real DownwardDy( - amrex::Array4<amrex::Real> const& F, - amrex::Real const* coefs_y, int const n_coefs_y, - int const i, int const j, int const k ) { - - #if defined WARPX_DIM_3D - amrex::Real inv_dy = coefs_y[0]; - return inv_dy*( F(i,j,k) - F(i,j-1,k) ); - #elif (defined WARPX_DIM_XZ) - return 0; // 2D Cartesian: derivative along y is 0 - #endif + amrex::Real inv_dr = coefs_r[0]; + return inv_dr*( F(i,j,k,comp) - F(i-1,j,k,comp) ); }; AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE static amrex::Real UpwardDz( amrex::Array4<amrex::Real> const& F, amrex::Real const* coefs_z, int const n_coefs_z, - int const i, int const j, int const k ) { + int const i, int const j, int const k, int const comp ) { amrex::Real inv_dz = coefs_z[0]; - #if defined WARPX_DIM_3D - return inv_dz*( F(i,j,k+1) - F(i,j,k) ); - #elif (defined WARPX_DIM_XZ) - return inv_dz*( F(i,j+1,k) - F(i,j,k) ); - #endif + return inv_dz*( F(i,j+1,k,comp) - F(i,j,k,comp) ); }; AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE static amrex::Real DownwardDz( amrex::Array4<amrex::Real> const& F, amrex::Real const* coefs_z, int const n_coefs_z, - int const i, int const j, int const k ) { + int const i, int const j, int const k, int const comp ) { amrex::Real inv_dz = coefs_z[0]; - #if defined WARPX_DIM_3D - return inv_dz*( F(i,j,k) - F(i,j,k-1) ); - #elif (defined WARPX_DIM_XZ) - return inv_dz*( F(i,j,k) - F(i,j-1,k) ); - #endif + return inv_dz*( F(i,j,k,comp) - F(i,j-1,k,comp) ); + }; + + AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE + static amrex::Real DivideByR( + amrex::Array4<amrex::Real> const& F, + amrex::Real const r, int const dr, int const m, + int const i, int const j, int const k, int const comp) { + + if (r != 0) { + return F(i,j,k,comp)/r; + } else { // r==0 ; singularity when dividing by r + if (m==1) { + // For m==1, F is linear in r, for small r + // Therefore, the formula below regularizes the singularity + return F(i+1,j,k,comp)/dr; + } else { + return 0; + } + } }; }; |