16 #ifdef WARPX_USE_PSATD
22 #include <AMReX_Config.H>
40 [[nodiscard]]
int lo()
const {
return m_lo; }
41 [[nodiscard]]
int hi()
const {
return m_hi; }
84 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb)
96 const
amrex::FabInfo& ,
int ) const final
128 const amrex::Box& regular_domain, amrex::Real v_sigma_sb);
143 amrex::Real
dt,
int nox_fft,
int noy_fft,
int noz_fft,
short grid_type,
144 int do_moving_window,
int pml_has_particles,
int do_pml_in_domain,
145 int psatd_solution_type,
int J_in_time,
int rho_in_time,
146 bool do_pml_dive_cleaning,
bool do_pml_divb_cleaning,
149 int max_guard_EB, amrex::Real v_sigma_sb,
155 std::array<amrex::MultiFab*,3>
GetE_fp ();
156 std::array<amrex::MultiFab*,3>
GetB_fp ();
157 std::array<amrex::MultiFab*,3>
Getj_fp ();
158 std::array<amrex::MultiFab*,3>
GetE_cp ();
159 std::array<amrex::MultiFab*,3>
GetB_cp ();
160 std::array<amrex::MultiFab*,3>
Getj_cp ();
182 #ifdef WARPX_USE_PSATD
186 void CopyJtoPMLs (
const std::array<amrex::MultiFab*,3>& j_fp,
187 const std::array<amrex::MultiFab*,3>& j_cp);
189 void Exchange (
const std::array<amrex::MultiFab*,3>& mf_pml,
190 const std::array<amrex::MultiFab*,3>& mf,
192 int do_pml_in_domain);
195 const std::array<amrex::MultiFab*,3>& jp);
208 [[nodiscard]]
bool ok ()
const {
return m_ok; }
210 void CheckPoint (
const std::string& dir)
const;
211 void Restart (
const std::string& dir);
227 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_fp;
228 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_fp;
229 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_fp;
233 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_cp;
234 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_cp;
235 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_cp;
248 #ifdef WARPX_USE_PSATD
272 int do_pml_in_domain,
285 int do_pml_in_domain,
292 #ifdef WARPX_USE_PSATD
295 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_E,
296 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_B,
297 std::unique_ptr<amrex::MultiFab>& pml_F,
298 std::unique_ptr<amrex::MultiFab>& pml_G,
void PushPMLPSATDSinglePatch(int lev, SpectralSolver &solver, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &pml_E, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &pml_B, std::unique_ptr< amrex::MultiFab > &pml_F, std::unique_ptr< amrex::MultiFab > &pml_G, const amrex::IntVect &fill_guards)
Definition: PML.cpp:1382
PatchType
Definition: WarpXAlgorithmSelection.H:59
amrex::Real dt_E
Definition: PML.H:133
void ComputePMLFactorsE(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:532
void ComputePMLFactorsB(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:516
amrex::Real dt_B
Definition: PML.H:132
MultiSigmaBox(const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, const amrex::BoxArray &grid_ba, const amrex::Real *dx, const amrex::IntVect &ncell, const amrex::IntVect &delta, const amrex::Box ®ular_domain, amrex::Real v_sigma_sb)
Definition: PML.cpp:507
static amrex::BoxArray MakeBoxArray(bool single_box_domain, const amrex::Box ®ular_domain, const amrex::Geometry &geom, const amrex::BoxArray &grid_ba, const amrex::IntVect &ncell, int do_pml_in_domain, const amrex::IntVect &do_pml_Lo, const amrex::IntVect &do_pml_Hi)
Definition: PML.cpp:887
PML(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, bool do_similar_dm_pml, const amrex::Geometry *geom, const amrex::Geometry *cgeom, int ncell, int delta, amrex::IntVect ref_ratio, amrex::Real dt, int nox_fft, int noy_fft, int noz_fft, short grid_type, int do_moving_window, int pml_has_particles, int do_pml_in_domain, int psatd_solution_type, int J_in_time, int rho_in_time, bool do_pml_dive_cleaning, bool do_pml_divb_cleaning, const amrex::IntVect &fill_guards_fields, const amrex::IntVect &fill_guards_current, int max_guard_EB, amrex::Real v_sigma_sb, amrex::IntVect do_pml_Lo=amrex::IntVect::TheUnitVector(), amrex::IntVect do_pml_Hi=amrex::IntVect::TheUnitVector())
Definition: PML.cpp:547
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition: PML.H:172
const amrex::Geometry * m_geom
Definition: PML.H:224
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_edge_lengths
Definition: PML.H:231
void ComputePMLFactors(amrex::Real dt)
Definition: PML.cpp:1017
amrex::MultiFab * GetG_cp()
Definition: PML.cpp:1091
void ExchangeF(amrex::MultiFab *F_fp, amrex::MultiFab *F_cp, int do_pml_in_domain)
Definition: PML.cpp:1134
std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > pml_field_factory
Definition: PML.H:254
std::unique_ptr< amrex::MultiFab > pml_F_fp
Definition: PML.H:238
const amrex::IntVect m_fill_guards_fields
Definition: PML.H:221
void PushPSATD(int lev)
Definition: PML.cpp:1372
std::array< amrex::MultiFab *, 3 > GetE_fp()
Definition: PML.cpp:1030
std::array< amrex::MultiFab *, 3 > Getj_cp()
Definition: PML.cpp:1060
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_fp
Definition: PML.H:228
amrex::MultiFab * GetF_fp()
Definition: PML.cpp:1073
void CheckPoint(const std::string &dir) const
Definition: PML.cpp:1323
static void CopyToPML(amrex::MultiFab &pml, amrex::MultiFab ®, const amrex::Geometry &geom)
Definition: PML.cpp:1249
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition: PML.H:245
void FillBoundaryG(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1308
const amrex::Geometry * m_cgeom
Definition: PML.H:225
bool ok() const
Definition: PML.H:208
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_fp
Definition: PML.H:229
void FillBoundaryB(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1276
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory() const noexcept
Definition: PML.H:256
void Exchange(const std::array< amrex::MultiFab *, 3 > &mf_pml, const std::array< amrex::MultiFab *, 3 > &mf, const PatchType &patch_type, int do_pml_in_domain)
Definition: PML.cpp:1096
bool m_divb_cleaning
Definition: PML.H:219
void FillBoundaryE(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1259
bool m_ok
Definition: PML.H:216
std::array< amrex::MultiFab *, 3 > Getj_fp()
Definition: PML.cpp:1042
std::array< amrex::MultiFab *, 3 > Get_edge_lengths()
Definition: PML.cpp:1066
bool m_dive_cleaning
Definition: PML.H:218
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_cp
Definition: PML.H:234
amrex::MultiFab * GetF_cp()
Definition: PML.cpp:1079
amrex::MultiFab * GetG_fp()
Definition: PML.cpp:1085
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition: PML.H:177
static amrex::BoxArray MakeBoxArray_single(const amrex::Box ®ular_domain, const amrex::BoxArray &grid_ba, const amrex::IntVect &ncell, const amrex::IntVect &do_pml_Lo, const amrex::IntVect &do_pml_Hi)
Definition: PML.cpp:900
const amrex::IntVect m_fill_guards_current
Definition: PML.H:222
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_cp
Definition: PML.H:233
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_cp
Definition: PML.H:235
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition: PML.H:246
std::array< amrex::MultiFab *, 3 > GetE_cp()
Definition: PML.cpp:1048
static amrex::BoxArray MakeBoxArray_multiple(const amrex::Geometry &geom, const amrex::BoxArray &grid_ba, const amrex::IntVect &ncell, int do_pml_in_domain, const amrex::IntVect &do_pml_Lo, const amrex::IntVect &do_pml_Hi)
Definition: PML.cpp:941
std::unique_ptr< amrex::MultiFab > pml_F_cp
Definition: PML.H:239
std::array< amrex::MultiFab *, 3 > Get_face_areas()
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:250
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_fp
Definition: PML.H:227
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:249
void Restart(const std::string &dir)
Definition: PML.cpp:1347
std::array< amrex::MultiFab *, 3 > GetB_fp()
Definition: PML.cpp:1036
std::array< amrex::MultiFab *, 3 > GetB_cp()
Definition: PML.cpp:1054
void ExchangeG(amrex::MultiFab *G_fp, amrex::MultiFab *G_cp, int do_pml_in_domain)
Definition: PML.cpp:1150
void CopyJtoPMLs(const std::array< amrex::MultiFab *, 3 > &j_fp, const std::array< amrex::MultiFab *, 3 > &j_cp)
Definition: PML.cpp:1126
std::unique_ptr< amrex::MultiFab > pml_G_fp
Definition: PML.H:242
std::unique_ptr< amrex::MultiFab > pml_G_cp
Definition: PML.H:243
void FillBoundaryF(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1293
SigmaBoxFactory(const amrex::BoxArray &grid_ba, const amrex::Real *dx, const amrex::IntVect &ncell, const amrex::IntVect &delta, const amrex::Box ®ular_domain, const amrex::Real v_sigma_sb)
Definition: PML.H:82
amrex::IntVect m_delta
Definition: PML.H:116
SigmaBoxFactory(SigmaBoxFactory &&) noexcept=default
amrex::IntVect m_ncell
Definition: PML.H:115
amrex::Box m_regdomain
Definition: PML.H:117
SigmaBoxFactory(const SigmaBoxFactory &)=default
SigmaBoxFactory * clone() const final
Definition: PML.H:107
amrex::Real m_v_sigma_sb
Definition: PML.H:118
void destroy(SigmaBox *fab) const final
Definition: PML.H:101
SigmaBox * create(const amrex::Box &box, int, const amrex::FabInfo &, int) const final
Definition: PML.H:95
const amrex::BoxArray & m_grids
Definition: PML.H:113
~SigmaBoxFactory() override=default
const amrex::Real * m_dx
Definition: PML.H:114
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
AMREX_GPU_HOST_DEVICE static constexpr AMREX_FORCE_INLINE IntVect TheUnitVector() noexcept
default
Definition: run_alltests.py:113
float dt
Definition: stencil.py:442
tuple dx
lab frame
Definition: stencil.py:429
SigmaVect sigma_star_cumsum_fac
Definition: PML.H:73
void define_multiple(const amrex::Box &box, const amrex::BoxArray &grids, const amrex::IntVect &ncell, const amrex::Array< amrex::Real, AMREX_SPACEDIM > &fac, amrex::Real v_sigma)
Definition: PML.cpp:240
SigmaVect sigma_star
Definition: PML.H:68
std::array< Sigma, AMREX_SPACEDIM > SigmaVect
Definition: PML.H:62
SigmaVect sigma_star_fac
Definition: PML.H:72
SigmaVect sigma_cumsum
Definition: PML.H:67
SigmaVect sigma_star_cumsum
Definition: PML.H:69
void ComputePMLFactorsB(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:440
void value_type
Definition: PML.H:64
SigmaVect sigma_cumsum_fac
Definition: PML.H:71
SigmaVect sigma_fac
Definition: PML.H:70
SigmaBox(const amrex::Box &box, const amrex::BoxArray &grids, const amrex::Real *dx, const amrex::IntVect &ncell, const amrex::IntVect &delta, const amrex::Box ®domain, amrex::Real v_sigma)
Definition: PML.cpp:147
void ComputePMLFactorsE(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:474
void define_single(const amrex::Box ®domain, const amrex::IntVect &ncell, const amrex::Array< amrex::Real, AMREX_SPACEDIM > &fac, amrex::Real v_sigma)
Definition: PML.cpp:197
SigmaVect sigma
Definition: PML.H:66
amrex::Real v_sigma
Definition: PML.H:74
int m_lo
Definition: PML.H:42
int lo() const
Definition: PML.H:40
int hi() const
Definition: PML.H:41
int m_hi
Definition: PML.H:42