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);
81 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb)
82 : m_grids(grid_ba), m_dx(dx), m_ncell(ncell), m_delta(delta), m_regdomain(regular_domain), m_v_sigma_sb(v_sigma_sb) {}
94 {
return new SigmaBox(box, m_grids, m_dx, m_ncell, m_delta, m_regdomain, m_v_sigma_sb); }
117 const amrex::Box& regular_domain,
const amrex::Real v_sigma_sb);
118 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real
dt);
119 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
121 amrex::Real dt_B = -1.e10;
122 amrex::Real dt_E = -1.e10;
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,
144 void ComputePMLFactors (amrex::Real dt);
146 std::array<amrex::MultiFab*,3> GetE_fp ();
147 std::array<amrex::MultiFab*,3> GetB_fp ();
148 std::array<amrex::MultiFab*,3> Getj_fp ();
149 std::array<amrex::MultiFab*,3> GetE_cp ();
150 std::array<amrex::MultiFab*,3> GetB_cp ();
151 std::array<amrex::MultiFab*,3> Getj_cp ();
152 std::array<amrex::MultiFab*,3> Get_edge_lengths ();
153 std::array<amrex::MultiFab*,3> Get_face_areas ();
164 {
return *sigba_fp; }
167 {
return *sigba_cp; }
169 #ifdef WARPX_USE_PSATD 170 void PushPSATD (
const int lev);
173 void CopyJtoPMLs (
const std::array<amrex::MultiFab*,3>& j_fp,
174 const std::array<amrex::MultiFab*,3>& j_cp);
176 void Exchange (
const std::array<amrex::MultiFab*,3>& mf_pml,
177 const std::array<amrex::MultiFab*,3>& mf,
179 const int do_pml_in_domain);
182 const std::array<amrex::MultiFab*,3>& jp);
191 void FillBoundaryE ();
192 void FillBoundaryB ();
193 void FillBoundaryF ();
194 void FillBoundaryG ();
195 void FillBoundaryE (
PatchType patch_type);
196 void FillBoundaryB (
PatchType patch_type);
197 void FillBoundaryF (
PatchType patch_type);
198 void FillBoundaryG (
PatchType patch_type);
200 bool ok ()
const {
return m_ok; }
202 void CheckPoint (
const std::string& dir)
const;
203 void Restart (
const std::string& dir);
221 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_fp;
222 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_fp;
223 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_fp;
227 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_cp;
228 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_cp;
229 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_cp;
242 #ifdef WARPX_USE_PSATD 251 return *pml_field_factory;
264 int do_pml_in_domain,
277 int do_pml_in_domain,
284 #ifdef WARPX_USE_PSATD 287 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_E,
288 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_B,
289 std::unique_ptr<amrex::MultiFab>& pml_F,
290 std::unique_ptr<amrex::MultiFab>& pml_G,
amrex::Real m_v_sigma_sb
Definition: PML.H:107
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:1393
const amrex::Geometry * m_geom
Definition: PML.H:218
int lo() const
Definition: PML.H:37
bool m_dive_cleaning
Definition: PML.H:212
void value_type
Definition: PML.H:61
SigmaVect sigma_star_cumsum
Definition: PML.H:66
SigmaVect sigma_fac
Definition: PML.H:67
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:244
virtual void destroy(SigmaBox *fab) const final
Definition: PML.H:95
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_fp
Definition: PML.H:223
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:68
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_fp
Definition: PML.H:222
bool ok() const
Definition: PML.H:200
SigmaVect sigma_star
Definition: PML.H:65
const amrex::BoxArray & m_grids
Definition: PML.H:102
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:248
std::unique_ptr< amrex::MultiFab > pml_G_fp
Definition: PML.H:236
const amrex::Real * m_dx
Definition: PML.H:103
bool m_divb_cleaning
Definition: PML.H:213
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition: PML.H:163
virtual SigmaBoxFactory * clone() const final
Definition: PML.H:98
std::unique_ptr< amrex::MultiFab > pml_G_cp
Definition: PML.H:237
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_cp
Definition: PML.H:228
SigmaVect sigma_star_cumsum_fac
Definition: PML.H:70
virtual SigmaBox * create(const amrex::Box &box, int, const amrex::FabInfo &, int) const final
Definition: PML.H:92
amrex::IntVect m_delta
Definition: PML.H:105
SigmaVect sigma_cumsum
Definition: PML.H:64
const amrex::IntVect m_fill_guards_fields
Definition: PML.H:215
PODVector & operator=(const PODVector< T, Allocator > &a_vector) noexcept
SigmaVect sigma_star_fac
Definition: PML.H:69
const amrex::Geometry * m_cgeom
Definition: PML.H:219
SigmaVect sigma
Definition: PML.H:63
bool m_ok
Definition: PML.H:210
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_edge_lengths
Definition: PML.H:225
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory() const noexcept
Definition: PML.H:250
amrex::Real v_sigma
Definition: PML.H:71
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_cp
Definition: PML.H:227
std::unique_ptr< amrex::MultiFab > pml_F_fp
Definition: PML.H:232
const amrex::IntVect m_fill_guards_current
Definition: PML.H:216
int m_lo
Definition: PML.H:39
std::unique_ptr< amrex::MultiFab > pml_F_cp
Definition: PML.H:233
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:229
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:243
amrex::Box m_regdomain
Definition: PML.H:106
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition: PML.H:240
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:79
PatchType
Definition: WarpX.H:71
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_fp
Definition: PML.H:221
std::array< Sigma, AMREX_SPACEDIM > SigmaVect
Definition: PML.H:59
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition: PML.H:239
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition: PML.H:166
amrex::IntVect m_ncell
Definition: PML.H:104
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:32