14 #ifdef WARPX_USE_PSATD 18 #include <AMReX_MultiFab.H> 19 #include <AMReX_Geometry.H> 24 struct Sigma : amrex::Gpu::DeviceVector<amrex::Real>
33 SigmaBox (
const amrex::Box& box,
const amrex::BoxArray& grids,
34 const amrex::Real*
dx,
int ncell,
int delta);
36 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real dt);
37 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
58 : m_grids(grid_ba), m_dx(dx), m_ncell(ncell), m_delta(delta) {}
60 const FabInfo& ,
int )
const final 61 {
return new SigmaBox(box, m_grids, m_dx, m_ncell, m_delta); }
77 :
public amrex::FabArray<SigmaBox>
80 MultiSigmaBox(
const amrex::BoxArray& ba,
const amrex::DistributionMapping& dm,
81 const amrex::BoxArray& grid_ba,
const amrex::Real*
dx,
int ncell,
int delta);
82 void ComputePMLFactorsB (
const amrex::Real* dx, amrex::Real dt);
83 void ComputePMLFactorsE (
const amrex::Real* dx, amrex::Real dt);
85 amrex::Real dt_B = -1.e10;
86 amrex::Real dt_E = -1.e10;
94 PML (
const amrex::BoxArray& ba,
const amrex::DistributionMapping& dm,
95 const amrex::Geometry* geom,
const amrex::Geometry* cgeom,
96 int ncell,
int delta,
int ref_ratio,
97 #ifdef WARPX_USE_PSATD
98 amrex::Real dt,
int nox_fft,
int noy_fft,
int noz_fft,
bool do_nodal,
100 int do_dive_cleaning,
int do_moving_window,
101 int pml_has_particles,
int do_pml_in_domain,
102 const amrex::IntVect do_pml_Lo = amrex::IntVect::TheUnitVector(),
103 const amrex::IntVect do_pml_Hi = amrex::IntVect::TheUnitVector());
105 void ComputePMLFactors (amrex::Real dt);
107 std::array<amrex::MultiFab*,3> GetE_fp ();
108 std::array<amrex::MultiFab*,3> GetB_fp ();
109 std::array<amrex::MultiFab*,3> Getj_fp ();
110 std::array<amrex::MultiFab*,3> GetE_cp ();
111 std::array<amrex::MultiFab*,3> GetB_cp ();
112 std::array<amrex::MultiFab*,3> Getj_cp ();
114 amrex::MultiFab* GetF_fp ();
115 amrex::MultiFab* GetF_cp ();
118 {
return *sigba_fp; }
121 {
return *sigba_cp; }
123 #ifdef WARPX_USE_PSATD 127 void ExchangeB (
const std::array<amrex::MultiFab*,3>& B_fp,
128 const std::array<amrex::MultiFab*,3>& B_cp,
int do_pml_in_domain);
129 void ExchangeE (
const std::array<amrex::MultiFab*,3>& E_fp,
130 const std::array<amrex::MultiFab*,3>& E_cp,
int do_pml_in_domain);
131 void CopyJtoPMLs (
const std::array<amrex::MultiFab*,3>& j_fp,
132 const std::array<amrex::MultiFab*,3>& j_cp);
135 const std::array<amrex::MultiFab*,3>& Bp,
int do_pml_in_domain);
137 const std::array<amrex::MultiFab*,3>& Ep,
int do_pml_in_domain);
140 const std::array<amrex::MultiFab*,3>& jp);
142 void ExchangeF (amrex::MultiFab* F_fp, amrex::MultiFab* F_cp,
int do_pml_in_domain);
143 void ExchangeF (
PatchType patch_type, amrex::MultiFab* Fp,
int do_pml_in_domain);
145 void FillBoundary ();
146 void FillBoundaryE ();
147 void FillBoundaryB ();
148 void FillBoundaryF ();
149 void FillBoundaryE (
PatchType patch_type);
150 void FillBoundaryB (
PatchType patch_type);
151 void FillBoundaryF (
PatchType patch_type);
153 bool ok ()
const {
return m_ok; }
155 void CheckPoint (
const std::string& dir)
const;
156 void Restart (
const std::string& dir);
158 static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg,
const amrex::Geometry& geom,
int do_pml_in_domain);
166 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_fp;
167 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_fp;
168 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_fp;
170 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_E_cp;
171 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_B_cp;
172 std::array<std::unique_ptr<amrex::MultiFab>,3>
pml_j_cp;
180 #ifdef WARPX_USE_PSATD 185 static amrex::BoxArray MakeBoxArray (
const amrex::Geometry& geom,
186 const amrex::BoxArray& grid_ba,
187 int ncell,
int do_pml_in_domain,
188 const amrex::IntVect do_pml_Lo = amrex::IntVect::TheUnitVector(),
189 const amrex::IntVect do_pml_Hi = amrex::IntVect::TheUnitVector());
191 static void CopyToPML (amrex::MultiFab& pml, amrex::MultiFab& reg,
const amrex::Geometry& geom);
194 #ifdef WARPX_USE_PSATD 196 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_E,
197 std::array<std::unique_ptr<amrex::MultiFab>,3>& pml_B );
const amrex::Geometry * m_geom
Definition: PML.H:163
int lo() const
Definition: PML.H:26
SigmaVect sigma_star_cumsum
Definition: PML.H:44
SigmaVect sigma_fac
Definition: PML.H:45
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:182
int m_ncell
Definition: PML.H:71
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_fp
Definition: PML.H:168
int dx
Definition: compute_domain.py:35
SigmaVect sigma_cumsum_fac
Definition: PML.H:46
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_fp
Definition: PML.H:167
bool ok() const
Definition: PML.H:153
SigmaVect sigma_star
Definition: PML.H:43
int m_hi
Definition: PML.H:28
virtual void destroy(SigmaBox *fab) const final
Definition: PML.H:62
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition: PML.H:117
virtual FabFactory< SigmaBox > * clone() const
Definition: PML.H:65
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_B_cp
Definition: PML.H:171
SigmaVect sigma_star_cumsum_fac
Definition: PML.H:48
SigmaVect sigma_cumsum
Definition: PML.H:42
const Real * m_dx
Definition: PML.H:70
SigmaVect sigma_star_fac
Definition: PML.H:47
const amrex::Geometry * m_cgeom
Definition: PML.H:164
virtual SigmaBox * create(const Box &box, int, const FabInfo &, int) const final
Definition: PML.H:59
SigmaVect sigma
Definition: PML.H:41
const BoxArray & m_grids
Definition: PML.H:69
bool m_ok
Definition: PML.H:161
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_cp
Definition: PML.H:170
std::unique_ptr< amrex::MultiFab > pml_F_fp
Definition: PML.H:174
int m_lo
Definition: PML.H:28
std::unique_ptr< amrex::MultiFab > pml_F_cp
Definition: PML.H:175
void PushPMLPSATDSinglePatch(SpectralSolver &solver, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &pml_E, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &pml_B)
Definition: PML.cpp:1086
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_j_cp
Definition: PML.H:172
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:181
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition: PML.H:178
int hi() const
Definition: PML.H:27
PatchType
Definition: WarpX.H:63
std::array< std::unique_ptr< amrex::MultiFab >, 3 > pml_E_fp
Definition: PML.H:166
std::array< Sigma, AMREX_SPACEDIM > SigmaVect
Definition: PML.H:39
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition: PML.H:177
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition: PML.H:120
int m_delta
Definition: PML.H:72
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:22