14 #ifdef WARPX_USE_PSATD 18 #include <AMReX_MultiFab.H> 19 #include <AMReX_BoxArray.H> 20 #include <AMReX_Config.H> 21 #include <AMReX_FabArray.H> 22 #include <AMReX_FabFactory.H> 23 #include <AMReX_GpuContainers.H> 24 #include <AMReX_IntVect.H> 25 #include <AMReX_REAL.H> 26 #include <AMReX_Vector.H> 28 #include <AMReX_BaseFwd.H> 35 struct Sigma : amrex::Gpu::DeviceVector<amrex::Real>
44 SigmaBox (
const amrex::Box& box,
const amrex::BoxArray& grids,
45 const amrex::Real*
dx,
int ncell,
int delta);
47 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real dt);
48 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
64 :
public amrex::FabFactory<SigmaBox>
67 SigmaBoxFactory (
const amrex::BoxArray& grid_ba,
const amrex::Real*
dx,
int ncell,
int delta)
68 : m_grids(grid_ba), m_dx(dx), m_ncell(ncell), m_delta(delta) {}
79 const amrex::FabInfo& ,
int )
const final 80 {
return new SigmaBox(box, m_grids, m_dx, m_ncell, m_delta); }
95 :
public amrex::FabArray<SigmaBox>
98 MultiSigmaBox(
const amrex::BoxArray& ba,
const amrex::DistributionMapping& dm,
99 const amrex::BoxArray& grid_ba,
const amrex::Real*
dx,
int ncell,
int delta);
100 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real dt);
101 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
103 amrex::Real dt_B = -1.e10;
104 amrex::Real dt_E = -1.e10;
113 const amrex::BoxArray& ba,
const amrex::DistributionMapping& dm,
114 const amrex::Geometry* geom,
const amrex::Geometry* cgeom,
115 int ncell,
int delta, amrex::IntVect ref_ratio,
116 amrex::Real dt,
int nox_fft,
int noy_fft,
int noz_fft,
bool do_nodal,
117 int do_moving_window,
int pml_has_particles,
int do_pml_in_domain,
118 const bool J_linear_in_time,
119 const bool do_pml_dive_cleaning,
const bool do_pml_divb_cleaning,
120 const amrex::IntVect do_pml_Lo = amrex::IntVect::TheUnitVector(),
121 const amrex::IntVect do_pml_Hi = amrex::IntVect::TheUnitVector());
123 void ComputePMLFactors (amrex::Real dt);
125 std::array<amrex::MultiFab*,3> GetE_fp ();
126 std::array<amrex::MultiFab*,3> GetB_fp ();
127 std::array<amrex::MultiFab*,3> Getj_fp ();
128 std::array<amrex::MultiFab*,3> GetE_cp ();
129 std::array<amrex::MultiFab*,3> GetB_cp ();
130 std::array<amrex::MultiFab*,3> Getj_cp ();
133 amrex::MultiFab* GetF_fp ();
134 amrex::MultiFab* GetF_cp ();
137 amrex::MultiFab* GetG_fp ();
138 amrex::MultiFab* GetG_cp ();
141 {
return *sigba_fp; }
144 {
return *sigba_cp; }
146 #ifdef WARPX_USE_PSATD 147 void PushPSATD (
const int lev);
150 void ExchangeB (
const std::array<amrex::MultiFab*,3>& B_fp,
151 const std::array<amrex::MultiFab*,3>& B_cp,
int do_pml_in_domain);
152 void ExchangeE (
const std::array<amrex::MultiFab*,3>& E_fp,
153 const std::array<amrex::MultiFab*,3>& E_cp,
int do_pml_in_domain);
154 void CopyJtoPMLs (
const std::array<amrex::MultiFab*,3>& j_fp,
155 const std::array<amrex::MultiFab*,3>& j_cp);
158 const std::array<amrex::MultiFab*,3>& Bp,
int do_pml_in_domain);
160 const std::array<amrex::MultiFab*,3>& Ep,
int do_pml_in_domain);
163 const std::array<amrex::MultiFab*,3>& jp);
165 void ExchangeF (amrex::MultiFab* F_fp, amrex::MultiFab* F_cp,
int do_pml_in_domain);
166 void ExchangeF (
PatchType patch_type, amrex::MultiFab* Fp,
int do_pml_in_domain);
168 void FillBoundary ();
169 void FillBoundaryE ();
170 void FillBoundaryB ();
171 void FillBoundaryF ();
172 void FillBoundaryG ();
173 void FillBoundaryE (
PatchType patch_type);
174 void FillBoundaryB (
PatchType patch_type);
175 void FillBoundaryF (
PatchType patch_type);
176 void FillBoundaryG (
PatchType patch_type);
178 bool ok ()
const {
return m_ok; }
180 void CheckPoint (
const std::string& dir)
const;
181 void Restart (
const std::string& dir);
183 static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg,
const amrex::Geometry& geom,
int do_pml_in_domain);
196 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_fp;
197 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_fp;
198 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_fp;
200 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_cp;
201 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_cp;
202 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_cp;
215 #ifdef WARPX_USE_PSATD 220 static amrex::BoxArray MakeBoxArray (
const amrex::Geometry& geom,
221 const amrex::BoxArray& grid_ba,
222 int ncell,
int do_pml_in_domain,
223 const amrex::IntVect do_pml_Lo = amrex::IntVect::TheUnitVector(),
224 const amrex::IntVect do_pml_Hi = amrex::IntVect::TheUnitVector());
226 static void CopyToPML (amrex::MultiFab& pml, amrex::MultiFab& reg,
const amrex::Geometry& geom);
229 #ifdef WARPX_USE_PSATD 232 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_E,
233 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_B,
234 std::unique_ptr<amrex::MultiFab>& pml_F,
235 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)
Definition: PML.cpp:1211
const amrex::Geometry * m_geom
Definition: PML.H:193
int lo() const
Definition: PML.H:37
bool m_dive_cleaning
Definition: PML.H:190
SigmaVect sigma_star_cumsum
Definition: PML.H:55
SigmaVect sigma_fac
Definition: PML.H:56
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:217
virtual void destroy(SigmaBox *fab) const final
Definition: PML.H:81
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_fp
Definition: PML.H:198
int dx
Definition: compute_domain.py:35
SigmaVect sigma_cumsum_fac
Definition: PML.H:57
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_fp
Definition: PML.H:197
bool ok() const
Definition: PML.H:178
SigmaVect sigma_star
Definition: PML.H:54
const amrex::BoxArray & m_grids
Definition: PML.H:88
int m_hi
Definition: PML.H:39
std::unique_ptr< amrex::MultiFab > pml_G_fp
Definition: PML.H:209
int m_ncell
Definition: PML.H:90
int m_delta
Definition: PML.H:91
const amrex::Real * m_dx
Definition: PML.H:89
bool m_divb_cleaning
Definition: PML.H:191
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition: PML.H:140
virtual SigmaBoxFactory * clone() const final
Definition: PML.H:84
std::unique_ptr< amrex::MultiFab > pml_G_cp
Definition: PML.H:210
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_cp
Definition: PML.H:201
SigmaVect sigma_star_cumsum_fac
Definition: PML.H:59
virtual SigmaBox * create(const amrex::Box &box, int, const amrex::FabInfo &, int) const final
Definition: PML.H:78
SigmaVect sigma_cumsum
Definition: PML.H:53
SigmaVect sigma_star_fac
Definition: PML.H:58
const amrex::Geometry * m_cgeom
Definition: PML.H:194
SigmaVect sigma
Definition: PML.H:52
bool m_ok
Definition: PML.H:188
SigmaBoxFactory(const amrex::BoxArray &grid_ba, const amrex::Real *dx, int ncell, int delta)
Definition: PML.H:67
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_cp
Definition: PML.H:200
std::unique_ptr< amrex::MultiFab > pml_F_fp
Definition: PML.H:205
int m_lo
Definition: PML.H:39
std::unique_ptr< amrex::MultiFab > pml_F_cp
Definition: PML.H:206
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_cp
Definition: PML.H:202
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:216
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition: PML.H:213
int hi() const
Definition: PML.H:38
PatchType
Definition: WarpX.H:71
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_fp
Definition: PML.H:196
std::array< Sigma, AMREX_SPACEDIM > SigmaVect
Definition: PML.H:50
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition: PML.H:212
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition: PML.H:143
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:32