WarpX
PML.H
Go to the documentation of this file.
1 /* Copyright 2019 Andrew Myers, Aurore Blelly, Axel Huebl
2  * Maxence Thevenet, Remi Lehe, Weiqun Zhang
3  *
4  *
5  * This file is part of WarpX.
6  *
7  * License: BSD-3-Clause-LBNL
8  */
9 #ifndef WARPX_PML_H_
10 #define WARPX_PML_H_
11 
13 
14 #ifdef WARPX_USE_PSATD
16 #endif
17 
18 #include <AMReX_MultiFab.H>
19 #include <AMReX_Geometry.H>
20 
21 #include <array>
22 
23 
24 struct Sigma : amrex::Gpu::DeviceVector<amrex::Real>
25 {
26  int lo() const { return m_lo; }
27  int hi() const { return m_hi; }
28  int m_lo, m_hi;
29 };
30 
31 struct SigmaBox
32 {
33  SigmaBox (const amrex::Box& box, const amrex::BoxArray& grids,
34  const amrex::Real* dx, int ncell, int delta);
35 
36  void ComputePMLFactorsB (const amrex::Real* dx, amrex::Real dt);
37  void ComputePMLFactorsE (const amrex::Real* dx, amrex::Real dt);
38 
39  using SigmaVect = std::array<Sigma,AMREX_SPACEDIM>;
40 
49 
50 };
51 
52 namespace amrex {
53  template<>
54  class FabFactory<SigmaBox>
55  {
56  public:
57  FabFactory<SigmaBox> (const BoxArray& grid_ba, const Real* dx, int ncell, int delta)
58  : m_grids(grid_ba), m_dx(dx), m_ncell(ncell), m_delta(delta) {}
59  virtual SigmaBox* create (const Box& box, int /*ncomps*/,
60  const FabInfo& /*info*/, int /*box_index*/) const final
61  { return new SigmaBox(box, m_grids, m_dx, m_ncell, m_delta); }
62  virtual void destroy (SigmaBox* fab) const final {
63  delete fab;
64  }
65  virtual FabFactory<SigmaBox>* clone () const {
66  return new FabFactory<SigmaBox>(*this);
67  }
68  private:
69  const BoxArray& m_grids;
70  const Real* m_dx;
71  int m_ncell;
72  int m_delta;
73  };
74 }
75 
77  : public amrex::FabArray<SigmaBox>
78 {
79 public:
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);
84 private:
85  amrex::Real dt_B = -1.e10;
86  amrex::Real dt_E = -1.e10;
87 };
88 
89 enum struct PatchType : int;
90 
91 class PML
92 {
93 public:
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,
99 #endif
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());
104 
105  void ComputePMLFactors (amrex::Real dt);
106 
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 ();
113 
114  amrex::MultiFab* GetF_fp ();
115  amrex::MultiFab* GetF_cp ();
116 
118  { return *sigba_fp; }
119 
121  { return *sigba_cp; }
122 
123 #ifdef WARPX_USE_PSATD
124  void PushPSATD ();
125 #endif
126 
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);
133 
134  void ExchangeB (PatchType patch_type,
135  const std::array<amrex::MultiFab*,3>& Bp, int do_pml_in_domain);
136  void ExchangeE (PatchType patch_type,
137  const std::array<amrex::MultiFab*,3>& Ep, int do_pml_in_domain);
138 
139  void CopyJtoPMLs (PatchType patch_type,
140  const std::array<amrex::MultiFab*,3>& jp);
141 
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);
144 
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);
152 
153  bool ok () const { return m_ok; }
154 
155  void CheckPoint (const std::string& dir) const;
156  void Restart (const std::string& dir);
157 
158  static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom, int do_pml_in_domain);
159 
160 private:
161  bool m_ok;
162 
163  const amrex::Geometry* m_geom;
164  const amrex::Geometry* m_cgeom;
165 
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;
169 
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;
173 
174  std::unique_ptr<amrex::MultiFab> pml_F_fp;
175  std::unique_ptr<amrex::MultiFab> pml_F_cp;
176 
177  std::unique_ptr<MultiSigmaBox> sigba_fp;
178  std::unique_ptr<MultiSigmaBox> sigba_cp;
179 
180 #ifdef WARPX_USE_PSATD
181  std::unique_ptr<SpectralSolver> spectral_solver_fp;
182  std::unique_ptr<SpectralSolver> spectral_solver_cp;
183 #endif
184 
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());
190 
191  static void CopyToPML (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
192 };
193 
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 );
198 #endif
199 
200 #endif
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
Definition: PML.H:24
Definition: PML.H:31
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
Definition: PML.H:91
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
Definition: PML.H:76
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
Definition: PML.H:52
Definition: PML.H:54
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