aboutsummaryrefslogtreecommitdiff
path: root/Source/WarpX.cpp
diff options
context:
space:
mode:
authorGravatar Remi Lehe <remi.lehe@normalesup.org> 2021-06-28 16:09:04 -0700
committerGravatar GitHub <noreply@github.com> 2021-06-28 16:09:04 -0700
commit16d1ca457abaa8d057018b69adaa1c3b54d6f995 (patch)
tree29618ee601b824210035e022c1c38a76bed1c0be /Source/WarpX.cpp
parenta0ee8d81410833fe6480d3303eaa889708659bf7 (diff)
downloadWarpX-16d1ca457abaa8d057018b69adaa1c3b54d6f995.tar.gz
WarpX-16d1ca457abaa8d057018b69adaa1c3b54d6f995.tar.zst
WarpX-16d1ca457abaa8d057018b69adaa1c3b54d6f995.zip
Multi-J scheme (#1828)
* Introduce new option skip_deposition * Properly implement the option to skip deposition * Skip deposition for electrostatic solver * Correct typo * Add Index Enumerator and Equations for F/G Without Averaging * Define new functions for current deposition and charge deposition * Disable interpolation between levels * Correct compilation error in RZ mode * Add argument for relative time * Add Index Enumerator and Equations for F/G With Averaging * [skip ci] Add new OneStep function * Fix compilation errors * Correct more compilation errors * [skip ci] Fix compilation * Split the PSATD push into separate functions * Add guards for rho field * [skip ci] Use new functions in OneStep * [skip ci] Separate the inverse transform of E_avg, B_avg * Add deposition of rho * [skip ci] Prevent deposition of rho if unallocated * Fix error in deposition function * Add subcycling of current deposition * [skip ci] Add inverse transform of averaged fields * [skip ci] Move component of rho * Add function to copy J * Temporarily deactivate contribution from F * [skip ci] Implement call to linear in J * Add psatd time averaging for multiJ * [skip ci] Fix implementation of averaging * [skip ci] Implement divE cleaning * Fix Bug for RZ Builds * Fix Bug for RZ Builds * Fix Bug in Init of PML Spectral Solvers * Cleaning * Cleaning * Add div(B) Cleaning (G Equation) * Multi-J Not Implemented with Galilean PSATD or PMLs * Add 2D CI Test Using Multi-J Scheme * Add More Inline Comments * Add More Inline Comments & Doxygen * Add Doxygen for Constructor of SpectralSolver * More Doxygen in Class SpectralSolver * Add Doxygen for New Functions in WarpXPushFieldsEM.cpp * Add Doxygen for New Functions in WarpX/MultiParticleContainer * do_dive/b_cleaning Must Be True With linear_in_J Option * Cast multij_n_depose to Real in Divisions * New Input Syntax * Add const where Possible, Fix Warnings * Docs for New Input Syntax, Fix Abort Messages * Consistent Use of Idx, IdxAvg, IdxLin * Improve Documentation of psatd.J_linear_in_time * Use const Type Qualifier whenever Possible * Simplify Initialization of Pointer ion_lev * Improve Doxygen * Update documentation * Add Note on NCI to Docs * Make warpx.do_multi_J_n_depositions Not Optional * Simplify Logic in getRequiredNumberOfFields * Use More const Type Qualifiers Co-authored-by: Edoardo Zoni <ezoni@lbl.gov>
Diffstat (limited to '')
-rw-r--r--Source/WarpX.cpp47
1 files changed, 42 insertions, 5 deletions
diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp
index d4f9b5de1..a31c0c1e3 100644
--- a/Source/WarpX.cpp
+++ b/Source/WarpX.cpp
@@ -171,6 +171,9 @@ Real WarpX::self_fields_required_precision = 1.e-11_rt;
int WarpX::self_fields_max_iters = 200;
int WarpX::do_subcycling = 0;
+int WarpX::do_multi_J = 0;
+int WarpX::do_multi_J_n_depositions;
+int WarpX::J_linear_in_time = 0;
bool WarpX::safe_guard_cells = 0;
IntVect WarpX::filter_npass_each_dir(1);
@@ -447,6 +450,11 @@ WarpX::ReadParameters ()
pp_warpx.query("verbose", verbose);
pp_warpx.query("regrid_int", regrid_int);
pp_warpx.query("do_subcycling", do_subcycling);
+ pp_warpx.query("do_multi_J", do_multi_J);
+ if (do_multi_J)
+ {
+ pp_warpx.get("do_multi_J_n_depositions", do_multi_J_n_depositions);
+ }
pp_warpx.query("use_hybrid_QED", use_hybrid_QED);
pp_warpx.query("safe_guard_cells", safe_guard_cells);
std::vector<std::string> override_sync_intervals_string_vec = {"1"};
@@ -616,12 +624,18 @@ WarpX::ReadParameters ()
pp_warpx.query("do_pml_j_damping", do_pml_j_damping);
pp_warpx.query("do_pml_in_domain", do_pml_in_domain);
+ if (do_multi_J && do_pml)
+ {
+ amrex::Abort("Multi-J algorithm not implemented with PMLs");
+ }
+
// div(E) cleaning not implemented for PSATD solver
if (maxwell_solver_id == MaxwellSolverAlgo::PSATD)
{
- AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
- do_dive_cleaning == 0,
- "warpx.do_dive_cleaning = 1 not implemented for PSATD solver");
+ if (do_multi_J == 0 && do_dive_cleaning == 1)
+ {
+ amrex::Abort("warpx.do_dive_cleaning = 1 not implemented for PSATD solver");
+ }
}
// Default values of WarpX::do_pml_dive_cleaning and WarpX::do_pml_divb_cleaning:
@@ -958,6 +972,7 @@ WarpX::ReadParameters ()
pp_psatd.query("current_correction", current_correction);
pp_psatd.query("v_comoving", m_v_comoving);
pp_psatd.query("do_time_averaging", fft_do_time_averaging);
+ pp_psatd.query("J_linear_in_time", J_linear_in_time);
if (!fft_periodic_single_box && current_correction)
amrex::Abort(
@@ -1021,6 +1036,24 @@ WarpX::ReadParameters ()
"psatd.update_with_rho must be equal to 1 for comoving PSATD");
}
+ if (do_multi_J)
+ {
+ if (m_v_galilean[0] != 0. || m_v_galilean[1] != 0. || m_v_galilean[2] != 0.)
+ {
+ amrex::Abort("Multi-J algorithm not implemented with Galilean PSATD");
+ }
+ }
+
+ if (J_linear_in_time)
+ {
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(update_with_rho,
+ "psatd.update_with_rho must be set to 1 when psatd.J_linear_in_time = 1");
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(do_dive_cleaning,
+ "warpx.do_dive_cleaning must be set to 1 when psatd.J_linear_in_time = 1");
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(do_divb_cleaning,
+ "warpx.do_divb_cleaning must be set to 1 when psatd.J_linear_in_time = 1");
+ }
+
constexpr int zdir = AMREX_SPACEDIM - 1;
if (WarpX::field_boundary_lo[zdir] == FieldBoundaryType::Damped ||
WarpX::field_boundary_hi[zdir] == FieldBoundaryType::Damped ) {
@@ -1776,6 +1809,9 @@ void WarpX::AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolv
RealVect dx_vect(dx[0], dx[2]);
#endif
+ amrex::Real solver_dt = dt[lev];
+ if (WarpX::do_multi_J) solver_dt /= static_cast<amrex::Real>(WarpX::do_multi_J_n_depositions);
+
auto pss = std::make_unique<SpectralSolver>(lev,
realspace_ba,
dm,
@@ -1786,11 +1822,12 @@ void WarpX::AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolv
m_v_galilean,
m_v_comoving,
dx_vect,
- dt[lev],
+ solver_dt,
pml_flag,
fft_periodic_single_box,
update_with_rho,
- fft_do_time_averaging);
+ fft_do_time_averaging,
+ J_linear_in_time);
spectral_solver[lev] = std::move(pss);
}
# endif