aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver
diff options
context:
space:
mode:
authorGravatar Edoardo Zoni <59625522+EZoni@users.noreply.github.com> 2020-12-23 08:01:37 -0800
committerGravatar GitHub <noreply@github.com> 2020-12-23 08:01:37 -0800
commitc30596fc489939d77da7ba34ed8dd0004a9b812c (patch)
tree892d954126c7fda40b84c4c6079a34c140f01e09 /Source/FieldSolver
parentb4dbc8b72c0ee31ac2b90f63dafa930075d5aa0f (diff)
downloadWarpX-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.cpp60
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H6
-rw-r--r--Source/FieldSolver/WarpXPushFieldsEM.cpp4
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);
}
}