14 #ifdef WARPX_USE_PSATD 20 #include <AMReX_Config.H> 46 const amrex::Box& regdomain,
const amrex::Real v_sigma);
50 const amrex::Real v_sigma);
54 const amrex::Real v_sigma);
56 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real
dt);
57 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
79 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb)
80 : m_grids(grid_ba), m_dx(dx), m_ncell(ncell), m_delta(delta), m_regdomain(regular_domain), m_v_sigma_sb(v_sigma_sb) {}
92 {
return new SigmaBox(box, m_grids, m_dx, m_ncell, m_delta, m_regdomain, m_v_sigma_sb); }
115 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb);
116 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real
dt);
117 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
119 amrex::Real dt_B = -1.e10;
120 amrex::Real dt_E = -1.e10;
132 amrex::Real
dt,
int nox_fft,
int noy_fft,
int noz_fft,
bool do_nodal,
133 int do_moving_window,
int pml_has_particles,
int do_pml_in_domain,
134 const int J_in_time,
const int rho_in_time,
135 const bool do_pml_dive_cleaning,
const bool do_pml_divb_cleaning,
138 int max_guard_EB, amrex::Real v_sigma_sb,
142 void ComputePMLFactors (amrex::Real dt);
144 std::array<amrex::MultiFab*,3> GetE_fp ();
145 std::array<amrex::MultiFab*,3> GetB_fp ();
146 std::array<amrex::MultiFab*,3> Getj_fp ();
147 std::array<amrex::MultiFab*,3> GetE_cp ();
148 std::array<amrex::MultiFab*,3> GetB_cp ();
149 std::array<amrex::MultiFab*,3> Getj_cp ();
150 std::array<amrex::MultiFab*,3> Get_edge_lengths ();
151 std::array<amrex::MultiFab*,3> Get_face_areas ();
162 {
return *sigba_fp; }
165 {
return *sigba_cp; }
167 #ifdef WARPX_USE_PSATD 168 void PushPSATD (
const int lev);
171 void CopyJtoPMLs (
const std::array<amrex::MultiFab*,3>& j_fp,
172 const std::array<amrex::MultiFab*,3>& j_cp);
174 void Exchange (
const std::array<amrex::MultiFab*,3>& mf_pml,
175 const std::array<amrex::MultiFab*,3>& mf,
177 const int do_pml_in_domain);
180 const std::array<amrex::MultiFab*,3>& jp);
189 void FillBoundaryE ();
190 void FillBoundaryB ();
191 void FillBoundaryF ();
192 void FillBoundaryG ();
193 void FillBoundaryE (
PatchType patch_type);
194 void FillBoundaryB (
PatchType patch_type);
195 void FillBoundaryF (
PatchType patch_type);
196 void FillBoundaryG (
PatchType patch_type);
198 bool ok ()
const {
return m_ok; }
200 void CheckPoint (
const std::string&
dir)
const;
201 void Restart (
const std::string& dir);
219 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_fp;
220 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_fp;
221 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_fp;
225 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_cp;
226 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_cp;
227 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_cp;
240 #ifdef WARPX_USE_PSATD 249 return *pml_field_factory;
262 int do_pml_in_domain,
275 int do_pml_in_domain,
282 #ifdef WARPX_USE_PSATD 285 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_E,
286 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_B,
287 std::unique_ptr<amrex::MultiFab>& pml_F,
288 std::unique_ptr<amrex::MultiFab>& pml_G,
amrex::Real m_v_sigma_sb
Definition: PML.H:105
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:1418
const amrex::Geometry * m_geom
Definition: PML.H:216
int lo() const
Definition: PML.H:37
bool m_dive_cleaning
Definition: PML.H:210
SigmaVect sigma_star_cumsum
Definition: PML.H:64
SigmaVect sigma_fac
Definition: PML.H:65
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:242
virtual void destroy(SigmaBox *fab) const final
Definition: PML.H:93
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_fp
Definition: PML.H:221
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
int dx
Definition: compute_domain.py:35
SigmaVect sigma_cumsum_fac
Definition: PML.H:66
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_fp
Definition: PML.H:220
bool ok() const
Definition: PML.H:198
SigmaVect sigma_star
Definition: PML.H:63
const amrex::BoxArray & m_grids
Definition: PML.H:100
int m_hi
Definition: PML.H:39
int dt
Definition: Stencil.py:468
std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > pml_field_factory
Definition: PML.H:246
std::unique_ptr< amrex::MultiFab > pml_G_fp
Definition: PML.H:234
const amrex::Real * m_dx
Definition: PML.H:101
bool m_divb_cleaning
Definition: PML.H:211
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition: PML.H:161
virtual SigmaBoxFactory * clone() const final
Definition: PML.H:96
std::unique_ptr< amrex::MultiFab > pml_G_cp
Definition: PML.H:235
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_cp
Definition: PML.H:226
SigmaVect sigma_star_cumsum_fac
Definition: PML.H:68
virtual SigmaBox * create(const amrex::Box &box, int, const amrex::FabInfo &, int) const final
Definition: PML.H:90
amrex::IntVect m_delta
Definition: PML.H:103
SigmaVect sigma_cumsum
Definition: PML.H:62
const amrex::IntVect m_fill_guards_fields
Definition: PML.H:213
PODVector & operator=(const PODVector< T, Allocator > &a_vector) noexcept
SigmaVect sigma_star_fac
Definition: PML.H:67
const amrex::Geometry * m_cgeom
Definition: PML.H:217
SigmaVect sigma
Definition: PML.H:61
bool m_ok
Definition: PML.H:208
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_edge_lengths
Definition: PML.H:223
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory() const noexcept
Definition: PML.H:248
amrex::Real v_sigma
Definition: PML.H:69
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_cp
Definition: PML.H:225
std::unique_ptr< amrex::MultiFab > pml_F_fp
Definition: PML.H:230
const amrex::IntVect m_fill_guards_current
Definition: PML.H:214
int m_lo
Definition: PML.H:39
std::unique_ptr< amrex::MultiFab > pml_F_cp
Definition: PML.H:231
AMREX_GPU_HOST_DEVICE static constexpr AMREX_FORCE_INLINE IntVect TheUnitVector() noexcept
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_cp
Definition: PML.H:227
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:241
amrex::Box m_regdomain
Definition: PML.H:104
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition: PML.H:238
int hi() const
Definition: PML.H:38
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:77
PatchType
Definition: WarpX.H:69
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_fp
Definition: PML.H:219
std::array< Sigma, AMREX_SPACEDIM > SigmaVect
Definition: PML.H:59
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition: PML.H:237
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition: PML.H:164
amrex::IntVect m_ncell
Definition: PML.H:102
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:32