diff options
author | 2021-12-13 12:54:52 -0800 | |
---|---|---|
committer | 2021-12-13 12:54:52 -0800 | |
commit | efcf0d46ef79cf29dcc090423c7c65e1fc347a8f (patch) | |
tree | 21192881070fca6ffe067fe10db514ca83862ba8 /Source/Evolve/WarpXEvolve.cpp | |
parent | 9001fe902b4c3ce746be14a5c17ea8a8f30de095 (diff) | |
download | WarpX-efcf0d46ef79cf29dcc090423c7c65e1fc347a8f.tar.gz WarpX-efcf0d46ef79cf29dcc090423c7c65e1fc347a8f.tar.zst WarpX-efcf0d46ef79cf29dcc090423c7c65e1fc347a8f.zip |
Add PML Support for multi-J Algorithm (#2603)
* Add PML Support for multi-J Algorithm
* Add CI Test
Diffstat (limited to 'Source/Evolve/WarpXEvolve.cpp')
-rw-r--r-- | Source/Evolve/WarpXEvolve.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Source/Evolve/WarpXEvolve.cpp b/Source/Evolve/WarpXEvolve.cpp index b3b2462b1..1a6932696 100644 --- a/Source/Evolve/WarpXEvolve.cpp +++ b/Source/Evolve/WarpXEvolve.cpp @@ -10,6 +10,7 @@ */ #include "WarpX.H" +#include "BoundaryConditions/PML.H" #include "Diagnostics/BackTransformedDiagnostic.H" #include "Diagnostics/MultiDiagnostics.H" #include "Diagnostics/ReducedDiags/MultiReducedDiags.H" @@ -610,23 +611,50 @@ WarpX::OneStep_multiJ (const amrex::Real cur_time) } } - // Transform fields back to real space and exchange guard cells + // Transform fields back to real space if (WarpX::fft_do_time_averaging) { // We summed the integral of the field over 2*dt PSATDScaleAverageFields(1._rt / (2._rt*dt[0])); PSATDBackwardTransformEBavg(); } + + // Evolve fields in PML + for (int lev = 0; lev <= finest_level; ++lev) + { + if (do_pml && pml[lev]->ok()) + { + pml[lev]->PushPSATD(lev); + } + ApplyEfieldBoundary(lev, PatchType::fine); + if (lev > 0) ApplyEfieldBoundary(lev, PatchType::coarse); + ApplyBfieldBoundary(lev, PatchType::fine, DtType::FirstHalf); + if (lev > 0) ApplyBfieldBoundary(lev, PatchType::coarse, DtType::FirstHalf); + } + + // Damp fields in PML before exchanging guard cells + if (do_pml) + { + DampPML(); + } + + // Exchange guard cells FillBoundaryE(guard_cells.ng_alloc_EB); FillBoundaryB(guard_cells.ng_alloc_EB); - if (WarpX::do_dive_cleaning) FillBoundaryF(guard_cells.ng_alloc_F); - if (WarpX::do_divb_cleaning) FillBoundaryG(guard_cells.ng_alloc_G); + if (WarpX::do_dive_cleaning || WarpX::do_pml_dive_cleaning) FillBoundaryF(guard_cells.ng_alloc_F); + if (WarpX::do_divb_cleaning || WarpX::do_pml_divb_cleaning) FillBoundaryG(guard_cells.ng_alloc_G); // Synchronize E, B, F, G fields on nodal points NodalSync(Efield_fp, Efield_cp); NodalSync(Bfield_fp, Bfield_cp); if (WarpX::do_dive_cleaning) NodalSync(F_fp, F_cp); if (WarpX::do_divb_cleaning) NodalSync(G_fp, G_cp); + + // Synchronize fields on nodal points in PML + if (do_pml) + { + NodalSyncPML(); + } } else { |