14 #ifdef WARPX_USE_PSATD
20 #include <AMReX_Config.H>
81 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb)
93 const
amrex::FabInfo& ,
int ) const final
117 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb);
134 amrex::Real
dt,
int nox_fft,
int noy_fft,
int noz_fft,
short grid_type,
135 int do_moving_window,
int pml_has_particles,
int do_pml_in_domain,
136 const int psatd_solution_type,
const int J_in_time,
const int rho_in_time,
137 const bool do_pml_dive_cleaning,
const bool do_pml_divb_cleaning,
140 int max_guard_EB, amrex::Real v_sigma_sb,
146 std::array<amrex::MultiFab*,3>
GetE_fp ();
147 std::array<amrex::MultiFab*,3>
GetPEC_fp ();
148 std::array<amrex::MultiFab*,3>
GetB_fp ();
149 std::array<amrex::MultiFab*,3>
Getj_fp ();
150 std::array<amrex::MultiFab*,3>
GetE_cp ();
151 std::array<amrex::MultiFab*,3>
GetB_cp ();
152 std::array<amrex::MultiFab*,3>
Getj_cp ();
156 std::array<amrex::MultiFab*,3> GetH_fp ();
157 std::array<amrex::MultiFab*,3> GetH_cp ();
187 #ifdef WARPX_USE_PSATD
191 void CopyJtoPMLs (
const std::array<amrex::MultiFab*,3>& j_fp,
192 const std::array<amrex::MultiFab*,3>& j_cp);
194 void Exchange (
const std::array<amrex::MultiFab*,3>& mf_pml,
195 const std::array<amrex::MultiFab*,3>& mf,
197 const int do_pml_in_domain);
200 const std::array<amrex::MultiFab*,3>& jp);
206 void ExchangeH (
const std::array<amrex::MultiFab*,3>& H_fp,
207 const std::array<amrex::MultiFab*,3>& H_cp,
int do_pml_in_domain);
209 const std::array<amrex::MultiFab*,3>& Hp,
int do_pml_in_domain);
215 void FillBoundaryE ();
216 void FillBoundaryB ();
217 void FillBoundaryF ();
218 void FillBoundaryG ();
219 void FillBoundaryE (
PatchType patch_type);
220 void FillBoundaryB (
PatchType patch_type);
221 void FillBoundaryF (
PatchType patch_type);
223 void FillBoundaryH ();
224 void FillBoundaryH (
PatchType patch_type);
226 void FillBoundaryG (
PatchType patch_type);
228 bool ok ()
const {
return m_ok; }
230 void CheckPoint (
const std::string& dir)
const;
231 void Restart (
const std::string& dir);
249 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_fp;
250 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_fp;
251 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_fp;
257 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_cp;
258 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_cp;
259 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_cp;
266 std::array<std::unique_ptr<amrex::MultiFab>,3> pml_H_fp;
267 std::array<std::unique_ptr<amrex::MultiFab>,3> pml_H_cp;
284 #ifdef WARPX_USE_PSATD
293 return *pml_field_factory;
306 int do_pml_in_domain,
319 int do_pml_in_domain,
326 #ifdef WARPX_USE_PSATD
329 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_E,
330 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_B,
331 std::unique_ptr<amrex::MultiFab>& pml_F,
332 std::unique_ptr<amrex::MultiFab>& pml_G,
void PushPMLPSATDSinglePatch(const 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:1689
PatchType
Definition: WarpX.H:74
amrex::Real dt_E
Definition: PML.H:122
void ComputePMLFactorsE(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:533
void ComputePMLFactorsB(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:517
amrex::Real dt_B
Definition: PML.H:121
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, const amrex::Real v_sigma_sb)
Definition: PML.cpp:508
amrex::MultiFab * Getmu_fp()
Definition: PML.cpp:1244
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition: PML.H:181
amrex::MultiFab * Getsigma_fp()
Definition: PML.cpp:1250
const amrex::Geometry * m_geom
Definition: PML.H:246
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_edge_lengths
Definition: PML.H:255
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_PEC_fp
Definition: PML.H:253
std::unique_ptr< amrex::MultiFab > pml_eps_cp
Definition: PML.H:274
void ComputePMLFactors(amrex::Real dt)
Definition: PML.cpp:1135
amrex::MultiFab * GetG_cp()
Definition: PML.cpp:1280
std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > pml_field_factory
Definition: PML.H:290
std::unique_ptr< amrex::MultiFab > pml_F_fp
Definition: PML.H:262
const amrex::IntVect m_fill_guards_fields
Definition: PML.H:243
std::array< amrex::MultiFab *, 3 > GetE_fp()
Definition: PML.cpp:1148
std::array< amrex::MultiFab *, 3 > Getj_cp()
Definition: PML.cpp:1212
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_fp
Definition: PML.H:250
amrex::MultiFab * GetF_fp()
Definition: PML.cpp:1225
std::array< amrex::MultiFab *, 3 > GetPEC_fp()
Definition: PML.cpp:1160
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition: PML.H:281
const amrex::Geometry * m_cgeom
Definition: PML.H:247
bool ok() const
Definition: PML.H:228
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_fp
Definition: PML.H:251
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory() const noexcept
Definition: PML.H:292
amrex::MultiFab * Geteps_cp()
Definition: PML.cpp:1256
std::unique_ptr< amrex::MultiFab > pml_mu_fp
Definition: PML.H:272
bool m_divb_cleaning
Definition: PML.H:241
amrex::MultiFab * Geteps_fp()
Definition: PML.cpp:1238
bool m_ok
Definition: PML.H:238
std::array< amrex::MultiFab *, 3 > Getj_fp()
Definition: PML.cpp:1186
std::unique_ptr< amrex::MultiFab > pml_eps_fp
Definition: PML.H:271
PML(const int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, 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, const int psatd_solution_type, const int J_in_time, const int rho_in_time, const bool do_pml_dive_cleaning, const 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, const amrex::IntVect do_pml_Lo=amrex::IntVect::TheUnitVector(), const amrex::IntVect do_pml_Hi=amrex::IntVect::TheUnitVector())
Definition: PML.cpp:548
std::array< amrex::MultiFab *, 3 > Get_edge_lengths()
Definition: PML.cpp:1218
bool m_dive_cleaning
Definition: PML.H:240
void PushPSATD(const int lev)
Definition: PML.cpp:1679
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_cp
Definition: PML.H:258
amrex::MultiFab * GetF_cp()
Definition: PML.cpp:1231
amrex::MultiFab * Getsigma_cp()
Definition: PML.cpp:1268
amrex::MultiFab * GetG_fp()
Definition: PML.cpp:1274
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition: PML.H:184
std::unique_ptr< amrex::MultiFab > pml_sigma_cp
Definition: PML.H:276
const amrex::IntVect m_fill_guards_current
Definition: PML.H:244
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_cp
Definition: PML.H:257
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_cp
Definition: PML.H:259
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition: PML.H:282
std::array< amrex::MultiFab *, 3 > GetE_cp()
Definition: PML.cpp:1192
std::unique_ptr< amrex::MultiFab > pml_mu_cp
Definition: PML.H:275
amrex::MultiFab * Getmu_cp()
Definition: PML.cpp:1262
std::unique_ptr< amrex::MultiFab > pml_F_cp
Definition: PML.H:263
std::array< amrex::MultiFab *, 3 > Get_face_areas()
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:286
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_fp
Definition: PML.H:249
void Exchange(const std::array< amrex::MultiFab *, 3 > &mf_pml, const std::array< amrex::MultiFab *, 3 > &mf, const PatchType &patch_type, const int do_pml_in_domain)
Definition: PML.cpp:1285
std::unique_ptr< amrex::MultiFab > pml_sigma_fp
Definition: PML.H:273
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:285
std::array< amrex::MultiFab *, 3 > GetB_fp()
Definition: PML.cpp:1172
std::array< amrex::MultiFab *, 3 > GetB_cp()
Definition: PML.cpp:1198
void CopyJtoPMLs(const std::array< amrex::MultiFab *, 3 > &j_fp, const std::array< amrex::MultiFab *, 3 > &j_cp)
Definition: PML.cpp:1346
std::unique_ptr< amrex::MultiFab > pml_G_fp
Definition: PML.H:278
std::unique_ptr< amrex::MultiFab > pml_G_cp
Definition: PML.H:279
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:79
virtual SigmaBoxFactory * clone() const final
Definition: PML.H:98
amrex::IntVect m_delta
Definition: PML.H:105
SigmaBoxFactory(SigmaBoxFactory &&) noexcept=default
amrex::IntVect m_ncell
Definition: PML.H:104
amrex::Box m_regdomain
Definition: PML.H:106
SigmaBoxFactory(const SigmaBoxFactory &)=default
virtual void destroy(SigmaBox *fab) const final
Definition: PML.H:95
amrex::Real m_v_sigma_sb
Definition: PML.H:107
virtual ~SigmaBoxFactory()=default
const amrex::BoxArray & m_grids
Definition: PML.H:102
virtual SigmaBox * create(const amrex::Box &box, int, const amrex::FabInfo &, int) const final
Definition: PML.H:92
const amrex::Real * m_dx
Definition: PML.H:103
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE constexpr IntVectND< dim > TheUnitVector() noexcept
void FillBoundary(amrex::MultiFab &mf, amrex::IntVect ng, bool do_single_precision_comms, const amrex::Periodicity &period, std::optional< bool > nodal_sync)
Definition: Communication.cpp:65
default
Definition: run_alltests.py:113
int dx
Definition: stencil.py:436
int dt
Definition: stencil.py:440
SigmaVect sigma_star_cumsum_fac
Definition: PML.H:70
SigmaVect sigma_star
Definition: PML.H:65
std::array< Sigma, AMREX_SPACEDIM > SigmaVect
Definition: PML.H:59
SigmaVect sigma_star_fac
Definition: PML.H:69
SigmaVect sigma_cumsum
Definition: PML.H:64
SigmaVect sigma_star_cumsum
Definition: PML.H:66
void ComputePMLFactorsB(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:441
void value_type
Definition: PML.H:61
SigmaVect sigma_cumsum_fac
Definition: PML.H:68
SigmaVect sigma_fac
Definition: PML.H:67
void define_multiple(const amrex::Box &box, const amrex::BoxArray &grids, const amrex::IntVect &ncell, const amrex::Array< amrex::Real, AMREX_SPACEDIM > &fac, const amrex::Real v_sigma)
Definition: PML.cpp:240
void ComputePMLFactorsE(const amrex::Real *dx, amrex::Real dt)
Definition: PML.cpp:475
SigmaVect sigma
Definition: PML.H:63
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, const amrex::Real v_sigma)
Definition: PML.cpp:147
void define_single(const amrex::Box ®domain, const amrex::IntVect &ncell, const amrex::Array< amrex::Real, AMREX_SPACEDIM > &fac, const amrex::Real v_sigma)
Definition: PML.cpp:197
amrex::Real v_sigma
Definition: PML.H:71
int m_lo
Definition: PML.H:39
int lo() const
Definition: PML.H:37
int hi() const
Definition: PML.H:38
int m_hi
Definition: PML.H:39