diff options
Diffstat (limited to 'Source/WarpX.cpp')
-rw-r--r-- | Source/WarpX.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index 518d86def..dfc340861 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -88,6 +88,8 @@ Vector<Real> WarpX::B_external_grid(3, 0.0); std::string WarpX::authors = ""; std::string WarpX::B_ext_grid_s = "default"; std::string WarpX::E_ext_grid_s = "default"; +bool WarpX::add_external_E_field = false; +bool WarpX::add_external_B_field = false; // Parser for B_external on the grid std::string WarpX::str_Bx_ext_grid_function; @@ -310,6 +312,10 @@ WarpX::WarpX () Bfield_avg_fp.resize(nlevs_max); } + // Same as Bfield_fp/Efield_fp for reading external field data + Bfield_fp_external.resize(1); + Efield_fp_external.resize(1); + m_edge_lengths.resize(nlevs_max); m_face_areas.resize(nlevs_max); m_distance_to_eb.resize(nlevs_max); @@ -671,6 +677,22 @@ WarpX::ReadParameters () moving_window_v *= PhysConst::c; } + pp_warpx.query("B_ext_grid_init_style", WarpX::B_ext_grid_s); + pp_warpx.query("E_ext_grid_init_style", WarpX::E_ext_grid_s); + + if (WarpX::B_ext_grid_s == "read_from_file") + { + WARPX_ALWAYS_ASSERT_WITH_MESSAGE(max_level == 0, + "External field reading is not implemented for more than one level"); + add_external_B_field = true; + } + if (WarpX::E_ext_grid_s == "read_from_file") + { + WARPX_ALWAYS_ASSERT_WITH_MESSAGE(max_level == 0, + "External field reading is not implemented for more than one level"); + add_external_E_field = true; + } + 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) { @@ -2074,6 +2096,18 @@ WarpX::AllocLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm AllocInitMultiFab(current_fp[lev][1], amrex::convert(ba, jy_nodal_flag), dm, ncomps, ngJ, tag("current_fp[y]"), 0.0_rt); AllocInitMultiFab(current_fp[lev][2], amrex::convert(ba, jz_nodal_flag), dm, ncomps, ngJ, tag("current_fp[z]"), 0.0_rt); + // Match external field MultiFabs to fine patch + if (add_external_B_field) { + AllocInitMultiFab(Bfield_fp_external[lev][0], amrex::convert(ba, Bx_nodal_flag), dm, ncomps, ngEB, tag("Bfield_fp_external[x]")); + AllocInitMultiFab(Bfield_fp_external[lev][1], amrex::convert(ba, By_nodal_flag), dm, ncomps, ngEB, tag("Bfield_fp_external[y]")); + AllocInitMultiFab(Bfield_fp_external[lev][2], amrex::convert(ba, Bz_nodal_flag), dm, ncomps, ngEB, tag("Bfield_fp_external[z]")); + } + if (add_external_E_field) { + AllocInitMultiFab(Efield_fp_external[lev][0], amrex::convert(ba, Ex_nodal_flag), dm, ncomps, ngEB, tag("Efield_fp_external[x]")); + AllocInitMultiFab(Efield_fp_external[lev][1], amrex::convert(ba, Ey_nodal_flag), dm, ncomps, ngEB, tag("Efield_fp_external[y]")); + AllocInitMultiFab(Efield_fp_external[lev][2], amrex::convert(ba, Ez_nodal_flag), dm, ncomps, ngEB, tag("Efield_fp_external[z]")); + } + if (do_current_centering) { amrex::BoxArray const& nodal_ba = amrex::convert(ba, amrex::IntVect::TheNodeVector()); |