diff options
author | 2020-12-23 08:01:37 -0800 | |
---|---|---|
committer | 2020-12-23 08:01:37 -0800 | |
commit | c30596fc489939d77da7ba34ed8dd0004a9b812c (patch) | |
tree | 892d954126c7fda40b84c4c6079a34c140f01e09 /Source/FieldSolver | |
parent | b4dbc8b72c0ee31ac2b90f63dafa930075d5aa0f (diff) | |
download | WarpX-c30596fc489939d77da7ba34ed8dd0004a9b812c.tar.gz WarpX-c30596fc489939d77da7ba34ed8dd0004a9b812c.tar.zst WarpX-c30596fc489939d77da7ba34ed8dd0004a9b812c.zip |
Use PML diagonal components only with div cleaning (#1592)
* Use PML diagonal components only with div cleaning
* Apply @RemiLehe's suggestions and simplify allocations
Diffstat (limited to 'Source/FieldSolver')
-rw-r--r-- | Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp | 60 | ||||
-rw-r--r-- | Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H | 6 | ||||
-rw-r--r-- | Source/FieldSolver/WarpXPushFieldsEM.cpp | 4 |
3 files changed, 52 insertions, 18 deletions
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp b/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp index 8346eb067..6fc157653 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp +++ b/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp @@ -26,7 +26,8 @@ using namespace amrex; void FiniteDifferenceSolver::EvolveBPML ( std::array< amrex::MultiFab*, 3 > Bfield, std::array< amrex::MultiFab*, 3 > const Efield, - amrex::Real const dt ) { + amrex::Real const dt, + const bool dive_cleaning) { // Select algorithm (The choice of algorithm is a runtime option, // but we compile code for each algorithm, using templates) @@ -36,15 +37,15 @@ void FiniteDifferenceSolver::EvolveBPML ( #else if (m_do_nodal) { - EvolveBPMLCartesian <CartesianNodalAlgorithm> ( Bfield, Efield, dt ); + EvolveBPMLCartesian <CartesianNodalAlgorithm> (Bfield, Efield, dt, dive_cleaning); } else if (m_fdtd_algo == MaxwellSolverAlgo::Yee) { - EvolveBPMLCartesian <CartesianYeeAlgorithm> ( Bfield, Efield, dt ); + EvolveBPMLCartesian <CartesianYeeAlgorithm> (Bfield, Efield, dt, dive_cleaning); } else if (m_fdtd_algo == MaxwellSolverAlgo::CKC) { - EvolveBPMLCartesian <CartesianCKCAlgorithm> ( Bfield, Efield, dt ); + EvolveBPMLCartesian <CartesianCKCAlgorithm> (Bfield, Efield, dt, dive_cleaning); } else { amrex::Abort("EvolveBPML: Unknown algorithm"); @@ -59,7 +60,8 @@ template<typename T_Algo> void FiniteDifferenceSolver::EvolveBPMLCartesian ( std::array< amrex::MultiFab*, 3 > Bfield, std::array< amrex::MultiFab*, 3 > const Efield, - amrex::Real const dt ) { + amrex::Real const dt, + const bool dive_cleaning) { // Loop through the grids, and over the tiles within each grid #ifdef _OPENMP @@ -92,36 +94,66 @@ void FiniteDifferenceSolver::EvolveBPMLCartesian ( amrex::ParallelFor(tbx, tby, tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k){ + + amrex::Real UpwardDz_Ey_yy = 0._rt; + amrex::Real UpwardDy_Ez_zz = 0._rt; + if (dive_cleaning) + { + UpwardDz_Ey_yy = T_Algo::UpwardDz(Ey, coefs_z, n_coefs_z, i, j, k, PMLComp::yy); + UpwardDy_Ez_zz = T_Algo::UpwardDy(Ez, coefs_y, n_coefs_y, i, j, k, PMLComp::zz); + } + Bx(i, j, k, PMLComp::xz) += dt * ( T_Algo::UpwardDz(Ey, coefs_z, n_coefs_z, i, j, k, PMLComp::yx) - + T_Algo::UpwardDz(Ey, coefs_z, n_coefs_z, i, j, k, PMLComp::yy) - + T_Algo::UpwardDz(Ey, coefs_z, n_coefs_z, i, j, k, PMLComp::yz) ); + + T_Algo::UpwardDz(Ey, coefs_z, n_coefs_z, i, j, k, PMLComp::yz) + + UpwardDz_Ey_yy); + Bx(i, j, k, PMLComp::xy) -= dt * ( T_Algo::UpwardDy(Ez, coefs_y, n_coefs_y, i, j, k, PMLComp::zx) + T_Algo::UpwardDy(Ez, coefs_y, n_coefs_y, i, j, k, PMLComp::zy) - + T_Algo::UpwardDy(Ez, coefs_y, n_coefs_y, i, j, k, PMLComp::zz) ); + + UpwardDy_Ez_zz); }, [=] AMREX_GPU_DEVICE (int i, int j, int k){ + + amrex::Real UpwardDx_Ez_zz = 0._rt; + amrex::Real UpwardDz_Ex_xx = 0._rt; + if (dive_cleaning) + { + UpwardDx_Ez_zz = T_Algo::UpwardDx(Ez, coefs_x, n_coefs_x, i, j, k, PMLComp::zz); + UpwardDz_Ex_xx = T_Algo::UpwardDz(Ex, coefs_z, n_coefs_z, i, j, k, PMLComp::xx); + } + By(i, j, k, PMLComp::yx) += dt * ( T_Algo::UpwardDx(Ez, coefs_x, n_coefs_x, i, j, k, PMLComp::zx) + T_Algo::UpwardDx(Ez, coefs_x, n_coefs_x, i, j, k, PMLComp::zy) - + T_Algo::UpwardDx(Ez, coefs_x, n_coefs_x, i, j, k, PMLComp::zz) ); + + UpwardDx_Ez_zz); + By(i, j, k, PMLComp::yz) -= dt * ( - T_Algo::UpwardDz(Ex, coefs_z, n_coefs_z, i, j, k, PMLComp::xx) + UpwardDz_Ex_xx + T_Algo::UpwardDz(Ex, coefs_z, n_coefs_z, i, j, k, PMLComp::xy) - + T_Algo::UpwardDz(Ex, coefs_z, n_coefs_z, i, j, k, PMLComp::xz) ); + + T_Algo::UpwardDz(Ex, coefs_z, n_coefs_z, i, j, k, PMLComp::xz)); }, [=] AMREX_GPU_DEVICE (int i, int j, int k){ + + amrex::Real UpwardDy_Ex_xx = 0._rt; + amrex::Real UpwardDx_Ey_yy = 0._rt; + if (dive_cleaning) + { + UpwardDy_Ex_xx = T_Algo::UpwardDy(Ex, coefs_y, n_coefs_y, i, j, k, PMLComp::xx); + UpwardDx_Ey_yy = T_Algo::UpwardDx(Ey, coefs_x, n_coefs_x, i, j, k, PMLComp::yy); + } + Bz(i, j, k, PMLComp::zy) += dt * ( - T_Algo::UpwardDy(Ex, coefs_y, n_coefs_y, i, j, k, PMLComp::xx) + UpwardDy_Ex_xx + T_Algo::UpwardDy(Ex, coefs_y, n_coefs_y, i, j, k, PMLComp::xy) + T_Algo::UpwardDy(Ex, coefs_y, n_coefs_y, i, j, k, PMLComp::xz) ); + Bz(i, j, k, PMLComp::zx) -= dt * ( T_Algo::UpwardDx(Ey, coefs_x, n_coefs_x, i, j, k, PMLComp::yx) - + T_Algo::UpwardDx(Ey, coefs_x, n_coefs_x, i, j, k, PMLComp::yy) - + T_Algo::UpwardDx(Ey, coefs_x, n_coefs_x, i, j, k, PMLComp::yz) ); + + T_Algo::UpwardDx(Ey, coefs_x, n_coefs_x, i, j, k, PMLComp::yz) + + UpwardDx_Ey_yy); } ); diff --git a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H index a311bb2bc..bb96dee45 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H +++ b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H @@ -75,7 +75,8 @@ class FiniteDifferenceSolver void EvolveBPML ( std::array< amrex::MultiFab*, 3 > Bfield, std::array< amrex::MultiFab*, 3 > const Efield, - amrex::Real const dt ); + amrex::Real const dt, + const bool dive_cleaning); void EvolveEPML ( std::array< amrex::MultiFab*, 3 > Efield, std::array< amrex::MultiFab*, 3 > const Bfield, @@ -176,7 +177,8 @@ class FiniteDifferenceSolver void EvolveBPMLCartesian ( std::array< amrex::MultiFab*, 3 > Bfield, std::array< amrex::MultiFab*, 3 > const Efield, - amrex::Real const dt ); + amrex::Real const dt, + const bool dive_cleaning); template< typename T_Algo > void EvolveEPMLCartesian ( diff --git a/Source/FieldSolver/WarpXPushFieldsEM.cpp b/Source/FieldSolver/WarpXPushFieldsEM.cpp index 45b7b3b99..63d519eee 100644 --- a/Source/FieldSolver/WarpXPushFieldsEM.cpp +++ b/Source/FieldSolver/WarpXPushFieldsEM.cpp @@ -192,10 +192,10 @@ WarpX::EvolveB (int lev, PatchType patch_type, amrex::Real a_dt) if (do_pml && pml[lev]->ok()) { if (patch_type == PatchType::fine) { m_fdtd_solver_fp[lev]->EvolveBPML( - pml[lev]->GetB_fp(), pml[lev]->GetE_fp(), a_dt ); + pml[lev]->GetB_fp(), pml[lev]->GetE_fp(), a_dt, WarpX::do_dive_cleaning); } else { m_fdtd_solver_cp[lev]->EvolveBPML( - pml[lev]->GetB_cp(), pml[lev]->GetE_cp(), a_dt ); + pml[lev]->GetB_cp(), pml[lev]->GetE_cp(), a_dt, WarpX::do_dive_cleaning); } } |