aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp
diff options
context:
space:
mode:
authorGravatar Lorenzo Giacomel <47607756+lgiacome@users.noreply.github.com> 2021-12-23 16:04:44 +0100
committerGravatar GitHub <noreply@github.com> 2021-12-23 07:04:44 -0800
commit549d8a0a89f6d9c40444acdc7d11f16d5a87858f (patch)
treeda0e58bd6e31e1bf3c89c2b996c165eb6c3126c4 /Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp
parent2001f9c161ac8403fa4ce75455cefab46eef4711 (diff)
downloadWarpX-549d8a0a89f6d9c40444acdc7d11f16d5a87858f.tar.gz
WarpX-549d8a0a89f6d9c40444acdc7d11f16d5a87858f.tar.zst
WarpX-549d8a0a89f6d9c40444acdc7d11f16d5a87858f.zip
Adding staircased EB in the PMLs (#2693)
* Adding EB to PMLs * Fix to guard cells * Initializing EB data only if AMREX_USE_EB * Not compiling at all EB initialization when EB is off * Bug fix (wrong order of PML init arguments)
Diffstat (limited to 'Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp')
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp b/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp
index 5b182812a..f2eb555e1 100644
--- a/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp
+++ b/Source/FieldSolver/FiniteDifferenceSolver/EvolveBPML.cpp
@@ -42,26 +42,27 @@ using namespace amrex;
void FiniteDifferenceSolver::EvolveBPML (
std::array< amrex::MultiFab*, 3 > Bfield,
std::array< amrex::MultiFab*, 3 > const Efield,
+ std::array< amrex::MultiFab*, 3 > const face_areas,
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)
#ifdef WARPX_DIM_RZ
- amrex::ignore_unused(Bfield, Efield, dt, dive_cleaning);
+ amrex::ignore_unused(Bfield, Efield, dt, dive_cleaning, face_areas);
amrex::Abort("PML are not implemented in cylindrical geometry.");
#else
if (m_do_nodal) {
- EvolveBPMLCartesian <CartesianNodalAlgorithm> (Bfield, Efield, dt, dive_cleaning);
+ EvolveBPMLCartesian <CartesianNodalAlgorithm> (Bfield, Efield, face_areas, dt, dive_cleaning);
} else if (m_fdtd_algo == MaxwellSolverAlgo::Yee || m_fdtd_algo == MaxwellSolverAlgo::ECT) {
- EvolveBPMLCartesian <CartesianYeeAlgorithm> (Bfield, Efield, dt, dive_cleaning);
+ EvolveBPMLCartesian <CartesianYeeAlgorithm> (Bfield, Efield, face_areas, dt, dive_cleaning);
} else if (m_fdtd_algo == MaxwellSolverAlgo::CKC) {
- EvolveBPMLCartesian <CartesianCKCAlgorithm> (Bfield, Efield, dt, dive_cleaning);
+ EvolveBPMLCartesian <CartesianCKCAlgorithm> (Bfield, Efield, face_areas, dt, dive_cleaning);
} else {
amrex::Abort("EvolveBPML: Unknown algorithm");
@@ -76,6 +77,7 @@ template<typename T_Algo>
void FiniteDifferenceSolver::EvolveBPMLCartesian (
std::array< amrex::MultiFab*, 3 > Bfield,
std::array< amrex::MultiFab*, 3 > const Efield,
+ std::array< amrex::MultiFab*, 3 > const face_areas,
amrex::Real const dt,
const bool dive_cleaning) {
@@ -93,6 +95,12 @@ void FiniteDifferenceSolver::EvolveBPMLCartesian (
Array4<Real> const& Ey = Efield[1]->array(mfi);
Array4<Real> const& Ez = Efield[2]->array(mfi);
+#ifdef AMREX_USE_EB
+ Array4<Real> const& Sx = face_areas[0]->array(mfi);
+ Array4<Real> const& Sy = face_areas[1]->array(mfi);
+ Array4<Real> const& Sz = face_areas[2]->array(mfi);
+#endif
+
// Extract stencil coefficients
Real const * const AMREX_RESTRICT coefs_x = m_stencil_coefs_x.dataPtr();
int const n_coefs_x = m_stencil_coefs_x.size();
@@ -110,6 +118,9 @@ void FiniteDifferenceSolver::EvolveBPMLCartesian (
amrex::ParallelFor(tbx, tby, tbz,
[=] AMREX_GPU_DEVICE (int i, int j, int k){
+#ifdef AMREX_USE_EB
+ if(Sx(i, j, k) <= 0) return;
+#endif
amrex::Real UpwardDz_Ey_yy = 0._rt;
amrex::Real UpwardDy_Ez_zz = 0._rt;
@@ -131,6 +142,9 @@ void FiniteDifferenceSolver::EvolveBPMLCartesian (
},
[=] AMREX_GPU_DEVICE (int i, int j, int k){
+#ifdef AMREX_USE_EB
+ if(Sy(i, j, k) <= 0) return;
+#endif
amrex::Real UpwardDx_Ez_zz = 0._rt;
amrex::Real UpwardDz_Ex_xx = 0._rt;
@@ -152,6 +166,9 @@ void FiniteDifferenceSolver::EvolveBPMLCartesian (
},
[=] AMREX_GPU_DEVICE (int i, int j, int k){
+#ifdef AMREX_USE_EB
+ if(Sz(i, j, k) <= 0) return;
+#endif
amrex::Real UpwardDy_Ex_xx = 0._rt;
amrex::Real UpwardDx_Ey_yy = 0._rt;
@@ -176,6 +193,10 @@ void FiniteDifferenceSolver::EvolveBPMLCartesian (
}
+#ifndef AMREX_USE_EB
+ amrex::ignore_unused(face_areas);
+#endif
+
}
#endif // corresponds to ifndef WARPX_DIM_RZ