diff options
author | 2022-11-07 20:30:31 -0800 | |
---|---|---|
committer | 2022-11-07 20:30:31 -0800 | |
commit | bf535730cb6c170394da8375887b3ae57ad6ecf5 (patch) | |
tree | de7b2122acbc7e40d5f97c11afa779be689985c9 /Source/WarpX.cpp | |
parent | ada6fc49cf16f40d1764d3a95c8338126360f329 (diff) | |
download | WarpX-bf535730cb6c170394da8375887b3ae57ad6ecf5.tar.gz WarpX-bf535730cb6c170394da8375887b3ae57ad6ecf5.tar.zst WarpX-bf535730cb6c170394da8375887b3ae57ad6ecf5.zip |
Allow `None` for Maxwell solver (#3504)
* Add "None" as an option for the Maxwell solver
* fixed some of the reasons for failing CI tests
* no longer pass `do_electrostatic` to `GuardCellManager`
* renamed `MaxwellSolverAlgo` to `ElectromagneticSolverAlgo`
* rename `do_electrostatic` to `electrostatic_solver_id`
* rename `maxwell_solver_id` to `electromagnetic_solver_id`
* changes requested during PR review
* remove `do_no_deposit` from tests without field evolution
* Fix doc-string in `GuardCellManager.H`
Co-authored-by: Edoardo Zoni <59625522+EZoni@users.noreply.github.com>
Co-authored-by: Edoardo Zoni <59625522+EZoni@users.noreply.github.com>
Diffstat (limited to 'Source/WarpX.cpp')
-rw-r--r-- | Source/WarpX.cpp | 86 |
1 files changed, 44 insertions, 42 deletions
diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index 7f697f668..2e0fe7c3e 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -120,7 +120,7 @@ short WarpX::current_deposition_algo; short WarpX::charge_deposition_algo; short WarpX::field_gathering_algo; short WarpX::particle_pusher_algo; -short WarpX::maxwell_solver_id; +short WarpX::electromagnetic_solver_id; short WarpX::J_in_time; short WarpX::rho_in_time; short WarpX::load_balance_costs_update_algo; @@ -182,7 +182,7 @@ Real WarpX::particle_slice_width_lab = 0.0_rt; bool WarpX::do_dynamic_scheduling = true; -int WarpX::do_electrostatic; +int WarpX::electrostatic_solver_id; Real WarpX::self_fields_required_precision = 1.e-11_rt; Real WarpX::self_fields_absolute_tolerance = 0.0_rt; int WarpX::self_fields_max_iters = 200; @@ -367,7 +367,7 @@ WarpX::WarpX () && WarpX::load_balance_costs_update_algo==LoadBalanceCostsUpdateAlgo::Heuristic) { #ifdef AMREX_USE_GPU - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { switch (WarpX::nox) { case 1: @@ -408,12 +408,12 @@ WarpX::WarpX () // Allocate field solver objects #ifdef WARPX_USE_PSATD - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { spectral_solver_fp.resize(nlevs_max); spectral_solver_cp.resize(nlevs_max); } #endif - if (WarpX::maxwell_solver_id != MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD) { m_fdtd_solver_fp.resize(nlevs_max); m_fdtd_solver_cp.resize(nlevs_max); } @@ -426,7 +426,7 @@ WarpX::WarpX () // Sanity checks. Must be done after calling the MultiParticleContainer // constructor, as it reads additional parameters // (e.g., use_fdtd_nci_corr) - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { AMREX_ALWAYS_ASSERT(use_fdtd_nci_corr == 0); AMREX_ALWAYS_ASSERT(do_subcycling == 0); } @@ -467,7 +467,7 @@ WarpX::ReadParameters () { ParmParse pp_algo("algo"); - maxwell_solver_id = GetAlgorithmInteger(pp_algo, "maxwell_solver"); + electromagnetic_solver_id = GetAlgorithmInteger(pp_algo, "maxwell_solver"); } { @@ -687,14 +687,19 @@ WarpX::ReadParameters () "The boosted frame diagnostic currently only works if the moving window is in the z direction."); } - do_electrostatic = GetAlgorithmInteger(pp_warpx, "do_electrostatic"); + electrostatic_solver_id = GetAlgorithmInteger(pp_warpx, "do_electrostatic"); + // if an electrostatic solver is used, set the Maxwell solver to None + if (electrostatic_solver_id != ElectrostaticSolverAlgo::None) { + electromagnetic_solver_id = ElectromagneticSolverAlgo::None; + } #if defined(AMREX_USE_EB) && defined(WARPX_DIM_RZ) - WARPX_ALWAYS_ASSERT_WITH_MESSAGE(do_electrostatic!=ElectrostaticSolverAlgo::None, - "Currently, the embedded boundary in RZ only works for electrostatic solvers."); + WARPX_ALWAYS_ASSERT_WITH_MESSAGE( + electromagnetic_solver_id==ElectromagneticSolverAlgo::None, + "Currently, the embedded boundary in RZ only works for electrostatic solvers (or no solver)."); #endif - if (do_electrostatic == ElectrostaticSolverAlgo::LabFrame) { + if (electrostatic_solver_id == ElectrostaticSolverAlgo::LabFrame) { // Note that with the relativistic version, these parameters would be // input for each species. utils::parser::queryWithParser( @@ -721,7 +726,7 @@ WarpX::ReadParameters () // Filter currently not working with FDTD solver in RZ geometry: turn OFF by default // (see https://github.com/ECP-WarpX/WarpX/issues/1943) #ifdef WARPX_DIM_RZ - if (WarpX::maxwell_solver_id != MaxwellSolverAlgo::PSATD) WarpX::use_filter = false; + if (WarpX::electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD) WarpX::use_filter = false; #endif // Read filter and fill IntVect filter_npass_each_dir with @@ -742,7 +747,7 @@ WarpX::ReadParameters () // TODO When k-space filtering will be implemented also for Cartesian geometries, // this code block will have to be applied in all cases (remove #ifdef condition) #ifdef WARPX_DIM_RZ - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { // With RZ spectral, only use k-space filtering use_kspace_filter = use_filter; use_filter = false; @@ -814,7 +819,7 @@ WarpX::ReadParameters () { // SilverMueller is implemented for Yee WARPX_ALWAYS_ASSERT_WITH_MESSAGE( - maxwell_solver_id == MaxwellSolverAlgo::Yee, + electromagnetic_solver_id == ElectromagneticSolverAlgo::Yee, "The Silver-Mueller boundary condition can only be used with the Yee solver."); } } @@ -835,7 +840,7 @@ WarpX::ReadParameters () // Default values of WarpX::do_pml_dive_cleaning and WarpX::do_pml_divb_cleaning: // false for FDTD solver, true for PSATD solver. - if (maxwell_solver_id != MaxwellSolverAlgo::PSATD) + if (electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD) { do_pml_dive_cleaning = false; do_pml_divb_cleaning = false; @@ -853,14 +858,14 @@ WarpX::ReadParameters () // If WarpX::do_divb_cleaning = true, set also WarpX::do_pml_divb_cleaning = true // (possibly overwritten by users in the input file, see query below) // TODO Implement div(B) cleaning in PML with FDTD and remove second if condition - if (do_divb_cleaning && maxwell_solver_id == MaxwellSolverAlgo::PSATD) do_pml_divb_cleaning = true; + if (do_divb_cleaning && electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) do_pml_divb_cleaning = true; // Query input parameters to use div(E) and div(B) cleaning in PMLs pp_warpx.query("do_pml_dive_cleaning", do_pml_dive_cleaning); pp_warpx.query("do_pml_divb_cleaning", do_pml_divb_cleaning); // TODO Implement div(B) cleaning in PML with FDTD and remove ASSERT - if (maxwell_solver_id != MaxwellSolverAlgo::PSATD) + if (electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD) { WARPX_ALWAYS_ASSERT_WITH_MESSAGE( do_pml_divb_cleaning == false, @@ -869,7 +874,7 @@ WarpX::ReadParameters () // Divergence cleaning in PMLs for PSATD solver implemented only // for both div(E) and div(B) cleaning - if (maxwell_solver_id == MaxwellSolverAlgo::PSATD) + if (electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { WARPX_ALWAYS_ASSERT_WITH_MESSAGE( do_pml_dive_cleaning == do_pml_divb_cleaning, @@ -883,7 +888,7 @@ WarpX::ReadParameters () } #ifdef WARPX_DIM_RZ - WARPX_ALWAYS_ASSERT_WITH_MESSAGE( isAnyBoundaryPML() == false || maxwell_solver_id == MaxwellSolverAlgo::PSATD, + WARPX_ALWAYS_ASSERT_WITH_MESSAGE( isAnyBoundaryPML() == false || electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD, "PML are not implemented in RZ geometry with FDTD; please set a different boundary condition using boundary.field_lo and boundary.field_hi."); WARPX_ALWAYS_ASSERT_WITH_MESSAGE( field_boundary_lo[1] != FieldBoundaryType::PML && field_boundary_hi[1] != FieldBoundaryType::PML, "PML are not implemented in RZ geometry along z; please set a different boundary condition using boundary.field_lo and boundary.field_hi."); @@ -956,11 +961,11 @@ WarpX::ReadParameters () { ParmParse pp_algo("algo"); #ifdef WARPX_DIM_RZ - WARPX_ALWAYS_ASSERT_WITH_MESSAGE( maxwell_solver_id != MaxwellSolverAlgo::CKC, + WARPX_ALWAYS_ASSERT_WITH_MESSAGE( electromagnetic_solver_id != ElectromagneticSolverAlgo::CKC, "algo.maxwell_solver = ckc is not (yet) available for RZ geometry"); #endif #ifndef WARPX_USE_PSATD - WARPX_ALWAYS_ASSERT_WITH_MESSAGE( maxwell_solver_id != MaxwellSolverAlgo::PSATD, + WARPX_ALWAYS_ASSERT_WITH_MESSAGE( electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD, "algo.maxwell_solver = psatd is not supported because WarpX was built without spectral solvers"); #endif @@ -975,7 +980,7 @@ WarpX::ReadParameters () "Error : Field boundary at r=0 must be ``none``. \n"); } - if (maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { // Force do_nodal=true (that is, not staggered) and // use same shape factors in all directions, for gathering do_nodal = true; @@ -1155,7 +1160,7 @@ WarpX::ReadParameters () } } - if (maxwell_solver_id == MaxwellSolverAlgo::PSATD) + if (electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { ParmParse pp_psatd("psatd"); pp_psatd.query("periodic_single_box_fft", fft_periodic_single_box); @@ -1408,7 +1413,7 @@ WarpX::ReadParameters () } } - if (maxwell_solver_id != MaxwellSolverAlgo::PSATD ) { + if (electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD ) { for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { WARPX_ALWAYS_ASSERT_WITH_MESSAGE( (WarpX::field_boundary_lo[idim] != FieldBoundaryType::Damped) && @@ -1670,7 +1675,7 @@ WarpX::ClearLevel (int lev) rho_cp[lev].reset(); #ifdef WARPX_USE_PSATD - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { spectral_solver_fp[lev].reset(); spectral_solver_cp[lev].reset(); } @@ -1711,12 +1716,11 @@ WarpX::AllocLevelData (int lev, const BoxArray& ba, const DistributionMapping& d WarpX::nox, nox_fft, noy_fft, noz_fft, NCIGodfreyFilter::m_stencil_width, - maxwell_solver_id, + electromagnetic_solver_id, maxLevel(), WarpX::m_v_galilean, WarpX::m_v_comoving, safe_guard_cells, - WarpX::do_electrostatic, WarpX::do_multi_J, WarpX::fft_do_time_averaging, WarpX::isAnyBoundaryPML(), @@ -1824,7 +1828,7 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm G_nodal_flag = amrex::IntVect::TheNodeVector(); } #ifdef WARPX_DIM_RZ - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { // Force cell-centered IndexType in r and z Ex_nodal_flag = IntVect::TheCellVector(); Ey_nodal_flag = IntVect::TheCellVector(); @@ -1911,9 +1915,7 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm // EB info are needed only at the finest level if (lev == maxLevel()) { - if(WarpX::maxwell_solver_id == MaxwellSolverAlgo::Yee - || WarpX::maxwell_solver_id == MaxwellSolverAlgo::CKC - || WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT) { + if (WarpX::electromagnetic_solver_id != ElectromagneticSolverAlgo::PSATD) { m_edge_lengths[lev][0] = std::make_unique<MultiFab>(amrex::convert(ba, Ex_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_edge_lengths[x]")); m_edge_lengths[lev][1] = std::make_unique<MultiFab>(amrex::convert(ba, Ey_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_edge_lengths[y]")); m_edge_lengths[lev][2] = std::make_unique<MultiFab>(amrex::convert(ba, Ez_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_edge_lengths[z]")); @@ -1921,7 +1923,7 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm m_face_areas[lev][1] = std::make_unique<MultiFab>(amrex::convert(ba, By_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_face_areas[y]")); m_face_areas[lev][2] = std::make_unique<MultiFab>(amrex::convert(ba, Bz_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_face_areas[z]")); } - if(WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT) { + if(WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::ECT) { m_edge_lengths[lev][0] = std::make_unique<MultiFab>(amrex::convert(ba, Ex_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_edge_lengths[x]")); m_edge_lengths[lev][1] = std::make_unique<MultiFab>(amrex::convert(ba, Ey_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_edge_lengths[y]")); m_edge_lengths[lev][2] = std::make_unique<MultiFab>(amrex::convert(ba, Ez_nodal_flag), dm, ncomps, guard_cells.ng_FieldSolver, tag("m_edge_lengths[z]")); @@ -1954,8 +1956,8 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm } #endif - bool deposit_charge = do_dive_cleaning || (do_electrostatic == ElectrostaticSolverAlgo::LabFrame); - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { + bool deposit_charge = do_dive_cleaning || (electrostatic_solver_id == ElectrostaticSolverAlgo::LabFrame); + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { deposit_charge = do_dive_cleaning || update_with_rho || current_correction; } if (deposit_charge) @@ -1965,7 +1967,7 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm rho_fp[lev] = std::make_unique<MultiFab>(amrex::convert(ba,rho_nodal_flag),dm,rho_ncomps,ngRho,tag("rho_fp")); } - if (do_electrostatic == ElectrostaticSolverAlgo::LabFrame) + if (electrostatic_solver_id == ElectrostaticSolverAlgo::LabFrame) { IntVect ngPhi = IntVect( AMREX_D_DECL(1,1,1) ); phi_fp[lev] = std::make_unique<MultiFab>(amrex::convert(ba,phi_nodal_flag),dm,ncomps,ngPhi,tag("phi_fp")); @@ -1989,7 +1991,7 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm G_fp[lev] = std::make_unique<MultiFab>(amrex::convert(ba, G_nodal_flag), dm, ncomps, ngG, tag("G_fp")); } - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { // Allocate and initialize the spectral solver #ifndef WARPX_USE_PSATD @@ -2042,9 +2044,9 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm pml_flag_false); # endif #endif - } // MaxwellSolverAlgo::PSATD + } // ElectromagneticSolverAlgo::PSATD else { - m_fdtd_solver_fp[lev] = std::make_unique<FiniteDifferenceSolver>(maxwell_solver_id, dx, do_nodal); + m_fdtd_solver_fp[lev] = std::make_unique<FiniteDifferenceSolver>(electromagnetic_solver_id, dx, do_nodal); } // @@ -2151,7 +2153,7 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm } } - if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) + if (WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD) { // Allocate and initialize the spectral solver #ifndef WARPX_USE_PSATD @@ -2186,9 +2188,9 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm pml_flag_false); # endif #endif - } // MaxwellSolverAlgo::PSATD + } // ElectromagneticSolverAlgo::PSATD else { - m_fdtd_solver_cp[lev] = std::make_unique<FiniteDifferenceSolver>(maxwell_solver_id, cdx, + m_fdtd_solver_cp[lev] = std::make_unique<FiniteDifferenceSolver>(electromagnetic_solver_id, cdx, do_nodal); } } @@ -2505,7 +2507,7 @@ WarpX::ComputeDivB (amrex::MultiFab& divB, int const dcomp, void WarpX::ComputeDivE(amrex::MultiFab& divE, const int lev) { - if ( WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD ) { + if ( WarpX::electromagnetic_solver_id == ElectromagneticSolverAlgo::PSATD ) { #ifdef WARPX_USE_PSATD spectral_solver_fp[lev]->ComputeSpectralDivE( lev, Efield_aux[lev], divE ); #else |