From f418ee4d2757364d2b666aad26bac94548f30f83 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Mon, 27 Jan 2020 12:11:44 -0800 Subject: Implement cylindrical Yee algorithm --- .../CylindricalYeeAlgorithm.H | 96 +++++++++------------- 1 file changed, 38 insertions(+), 58 deletions(-) (limited to 'Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CylindricalYeeAlgorithm.H') 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 #include -struct YeeAlgorithm { +struct CylindricalYeeAlgorithm { static void InitializeStencilCoefficients( std::array& cell_size, - amrex::Gpu::ManagedVector& stencil_coefs_x, - amrex::Gpu::ManagedVector& stencil_coefs_y, + amrex::Gpu::ManagedVector& stencil_coefs_r, amrex::Gpu::ManagedVector& 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 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 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 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 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 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 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 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; + } + } }; }; -- cgit v1.2.3