WarpX
Loading...
Searching...
No Matches
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
12#include "PML_fwd.H"
13
15
16#ifdef WARPX_USE_FFT
18#endif
19
21
22#include <AMReX_BoxArray.H>
23#include <AMReX_Config.H>
24#include <AMReX_FabArray.H>
25#include <AMReX_FabFactory.H>
26#include <AMReX_GpuContainers.H>
27#include <AMReX_IntVect.H>
28#include <AMReX_iMultiFab.H>
29#include <AMReX_REAL.H>
30#include <AMReX_Vector.H>
31
32#include <AMReX_BaseFwd.H>
33
34#include <array>
35#include <memory>
36#include <optional>
37#include <string>
38#include <vector>
39
40struct Sigma : amrex::Gpu::DeviceVector<amrex::Real>
41{
42 [[nodiscard]] int lo() const { return m_lo; }
43 [[nodiscard]] int hi() const { return m_hi; }
44 int m_lo, m_hi;
45};
46
48{
49 SigmaBox (const amrex::Box& box, const amrex::BoxArray& grids,
50 const amrex::Real* dx, const amrex::IntVect& ncell, const amrex::IntVect& delta,
51 const amrex::Box& regdomain, amrex::Real v_sigma);
52
53 void define_single (const amrex::Box& regdomain, const amrex::IntVect& ncell,
56 void define_multiple (const amrex::Box& box, const amrex::BoxArray& grids,
57 const amrex::IntVect& ncell,
60
61 void ComputePMLFactorsB (const amrex::Real* dx, amrex::Real dt);
62 void ComputePMLFactorsE (const amrex::Real* dx, amrex::Real dt);
63
64 using SigmaVect = std::array<Sigma,AMREX_SPACEDIM>;
65
66 using value_type = void; // needed by amrex::FabArray
67
77
78};
79
81 : public amrex::FabFactory<SigmaBox>
82{
83public:
84 SigmaBoxFactory (const amrex::BoxArray* grid_ba, const amrex::Real* dx,
85 const amrex::IntVect& ncell, const amrex::IntVect& delta,
86 const amrex::Box& regular_domain, const amrex::Real v_sigma_sb)
87 : m_grids{grid_ba}, m_dx(dx), m_ncell(ncell), m_delta(delta), m_regdomain(regular_domain), m_v_sigma_sb(v_sigma_sb) {}
88 ~SigmaBoxFactory () override = default;
89
90 SigmaBoxFactory (const SigmaBoxFactory&) = default;
91 SigmaBoxFactory (SigmaBoxFactory&&) noexcept = default;
92
93 SigmaBoxFactory () = delete;
94 SigmaBoxFactory& operator= (const SigmaBoxFactory&) = delete;
95 SigmaBoxFactory& operator= (SigmaBoxFactory&&) = delete;
96
97 [[nodiscard]] SigmaBox* create (const amrex::Box& box, int /*ncomps*/,
98 const amrex::FabInfo& /*info*/, int /*box_index*/) const final
99 {
101 }
102
103 void destroy (SigmaBox* fab) const final
104 {
105 delete fab;
106 }
107
108 [[nodiscard]] SigmaBoxFactory*
109 clone () const final
110 {
111 return new SigmaBoxFactory(*this);
112 }
113
114private:
121};
122
124 : public amrex::FabArray<SigmaBox>
125{
126public:
128 const amrex::BoxArray* grid_ba, const amrex::Real* dx,
129 const amrex::IntVect& ncell, const amrex::IntVect& delta,
130 const amrex::Box& regular_domain, amrex::Real v_sigma_sb);
131 void ComputePMLFactorsB (const amrex::Real* dx, amrex::Real dt);
132 void ComputePMLFactorsE (const amrex::Real* dx, amrex::Real dt);
133private:
136};
137
138class PML
139{
140public:
141 PML (int lev, const amrex::BoxArray& ba,
142 const amrex::DistributionMapping& dm, bool do_similar_dm_pml,
143 const amrex::Geometry* geom, const amrex::Geometry* cgeom,
144 int ncell, int delta, amrex::IntVect ref_ratio,
145 amrex::Real dt, int nox_fft, int noy_fft, int noz_fft,
147 int do_moving_window, int pml_has_particles, int do_pml_in_domain,
148 PSATDSolutionType psatd_solution_type,
149 TimeDependencyJ time_dependency_J, TimeDependencyRho time_dependency_rho,
150 bool do_pml_dive_cleaning, bool do_pml_divb_cleaning,
151 const amrex::IntVect& fill_guards_fields,
152 const amrex::IntVect& fill_guards_current,
153 bool eb_enabled,
154 int max_guard_EB, amrex::Real v_sigma_sb,
158
160
161 [[nodiscard]] const MultiSigmaBox& GetMultiSigmaBox_fp () const
162 {
163 return *sigba_fp;
164 }
165
166 [[nodiscard]] const MultiSigmaBox& GetMultiSigmaBox_cp () const
167 {
168 return *sigba_cp;
169 }
170
174 [[nodiscard]] std::array< std::unique_ptr<amrex::iMultiFab>, 3 > const & GetEBUpdateEFlag () const
175 {
176 return m_eb_update_E;
177 }
178
179#ifdef WARPX_USE_FFT
180 void PushPSATD (ablastr::fields::MultiFabRegister& fields, int lev);
181#endif
182
183 void CopyJtoPMLs (ablastr::fields::MultiFabRegister& fields, int lev);
184
187 const PatchType& patch_type,
188 int do_pml_in_domain);
189 void Exchange (amrex::MultiFab* mf_pml,
190 amrex::MultiFab* mf,
191 const PatchType& patch_type,
192 int do_pml_in_domain);
193
194 void CopyJtoPMLs (
196 PatchType patch_type,
197 int lev
198 );
199
200 void FillBoundary (ablastr::fields::VectorField mf_pml, PatchType patch_type, std::optional<bool> nodal_sync=std::nullopt);
201 void FillBoundary (amrex::MultiFab & mf_pml, PatchType patch_type, std::optional<bool> nodal_sync=std::nullopt);
202
203 [[nodiscard]] bool ok () const { return m_ok; }
204
205 void CheckPoint (ablastr::fields::MultiFabRegister& fields, const std::string& dir) const;
206 void Restart (ablastr::fields::MultiFabRegister& fields, const std::string& dir);
207
208 static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom, int do_pml_in_domain);
209
210private:
211 bool m_ok;
212
215
218
221
222 std::unique_ptr<MultiSigmaBox> sigba_fp;
223 std::unique_ptr<MultiSigmaBox> sigba_cp;
224
225 // Flags indicating on which grid points the E field (and PML current) should
226 // be updated, depending on their position relative to the embedded boundary.
227 std::array< std::unique_ptr<amrex::iMultiFab>, 3 > m_eb_update_E;
228
229#ifdef WARPX_USE_FFT
230 std::unique_ptr<SpectralSolver> spectral_solver_fp;
231 std::unique_ptr<SpectralSolver> spectral_solver_cp;
232#endif
233
234 // Factory for field data
235 std::unique_ptr<amrex::FabFactory<amrex::FArrayBox> > pml_field_factory;
236
237#ifdef AMREX_USE_EB
238 [[nodiscard]] amrex::EBFArrayBoxFactory const& fieldEBFactory () const noexcept {
239 return static_cast<amrex::EBFArrayBoxFactory const&>(*pml_field_factory);
240 }
241#endif
242
243 static void CopyToPML (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
244};
245
246#ifdef WARPX_USE_FFT
248 int lev,
254 const amrex::IntVect& fill_guards
255);
256#endif
257
258#endif
HYPRE_Solver solver
void PushPMLPSATDSinglePatch(const int lev, SpectralSolver &solver, ablastr::fields::VectorField &pml_E, ablastr::fields::VectorField &pml_B, ablastr::fields::ScalarField pml_F, ablastr::fields::ScalarField pml_G, const amrex::IntVect &fill_guards)
Definition PML.cpp:1338
TimeDependencyJ
Definition WarpXAlgorithmSelection.H:107
PSATDSolutionType
Definition WarpXAlgorithmSelection.H:101
TimeDependencyRho
Definition WarpXAlgorithmSelection.H:113
Definition PML.H:125
amrex::Real dt_E
Definition PML.H:135
MultiSigmaBox(const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, const amrex::BoxArray *grid_ba, const amrex::Real *dx, const amrex::IntVect &ncell, const amrex::IntVect &delta, const amrex::Box &regular_domain, amrex::Real v_sigma_sb)
Definition PML.cpp:649
void ComputePMLFactorsE(const amrex::Real *dx, amrex::Real dt)
Definition PML.cpp:674
void ComputePMLFactorsB(const amrex::Real *dx, amrex::Real dt)
Definition PML.cpp:658
amrex::Real dt_B
Definition PML.H:134
const amrex::Geometry * m_geom
Definition PML.H:219
void ComputePMLFactors(amrex::Real dt)
Definition PML.cpp:1064
std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const & GetEBUpdateEFlag() const
Definition PML.H:174
std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > pml_field_factory
Definition PML.H:235
const MultiSigmaBox & GetMultiSigmaBox_cp() const
Definition PML.H:166
static void CopyToPML(amrex::MultiFab &pml, amrex::MultiFab &reg, const amrex::Geometry &geom)
Definition PML.cpp:1219
std::unique_ptr< MultiSigmaBox > sigba_fp
Definition PML.H:222
const MultiSigmaBox & GetMultiSigmaBox_fp() const
Definition PML.H:161
void CopyJtoPMLs(ablastr::fields::MultiFabRegister &fields, int lev)
Definition PML.cpp:1109
std::array< std::unique_ptr< amrex::iMultiFab >, 3 > m_eb_update_E
Definition PML.H:227
const amrex::Geometry * m_cgeom
Definition PML.H:220
bool ok() const
Definition PML.H:203
void PushPSATD(ablastr::fields::MultiFabRegister &fields, int lev)
Definition PML.cpp:1319
void Exchange(ablastr::fields::VectorField mf_pml, ablastr::fields::VectorField mf, const PatchType &patch_type, int do_pml_in_domain)
Definition PML.cpp:1118
bool m_divb_cleaning
Definition PML.H:214
bool m_ok
Definition PML.H:211
bool m_dive_cleaning
Definition PML.H:213
amrex::IntVect m_fill_guards_fields
Definition PML.H:216
void CheckPoint(ablastr::fields::MultiFabRegister &fields, const std::string &dir) const
Definition PML.cpp:1252
std::unique_ptr< MultiSigmaBox > sigba_cp
Definition PML.H:223
PML(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, bool do_similar_dm_pml, const amrex::Geometry *geom, const amrex::Geometry *cgeom, int ncell, int delta, amrex::IntVect ref_ratio, amrex::Real dt, int nox_fft, int noy_fft, int noz_fft, ablastr::utils::enums::GridType grid_type, int do_moving_window, int pml_has_particles, int do_pml_in_domain, PSATDSolutionType psatd_solution_type, TimeDependencyJ time_dependency_J, TimeDependencyRho time_dependency_rho, bool do_pml_dive_cleaning, bool do_pml_divb_cleaning, const amrex::IntVect &fill_guards_fields, const amrex::IntVect &fill_guards_current, bool eb_enabled, int max_guard_EB, amrex::Real v_sigma_sb, ablastr::fields::MultiFabRegister &fields, amrex::IntVect do_pml_Lo=amrex::IntVect::TheUnitVector(), amrex::IntVect do_pml_Hi=amrex::IntVect::TheUnitVector())
Definition PML.cpp:689
void Restart(ablastr::fields::MultiFabRegister &fields, const std::string &dir)
Definition PML.cpp:1285
amrex::IntVect m_fill_guards_current
Definition PML.H:217
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition PML.H:231
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition PML.H:230
Definition PML.H:82
const amrex::BoxArray * m_grids
Definition PML.H:115
SigmaBox * create(const amrex::Box &box, int, const amrex::FabInfo &, int) const final
Definition PML.H:97
amrex::IntVect m_delta
Definition PML.H:118
SigmaBoxFactory(SigmaBoxFactory &&) noexcept=default
amrex::IntVect m_ncell
Definition PML.H:117
amrex::Box m_regdomain
Definition PML.H:119
SigmaBoxFactory(const SigmaBoxFactory &)=default
SigmaBoxFactory * clone() const final
Definition PML.H:109
SigmaBoxFactory(const amrex::BoxArray *grid_ba, const amrex::Real *dx, const amrex::IntVect &ncell, const amrex::IntVect &delta, const amrex::Box &regular_domain, const amrex::Real v_sigma_sb)
Definition PML.H:84
amrex::Real m_v_sigma_sb
Definition PML.H:120
SigmaBoxFactory()=delete
void destroy(SigmaBox *fab) const final
Definition PML.H:103
~SigmaBoxFactory() override=default
const amrex::Real * m_dx
Definition PML.H:116
Top-level class for the electromagnetic spectral solver.
Definition SpectralSolver.H:37
__host__ static __device__ constexpr IntVectND< dim > TheUnitVector() noexcept
amrex_real Real
void FillBoundary(bool cross=false)
PODVector< T, ArenaAllocator< T > > DeviceVector
std::array< T, N > Array
Definition EffectivePotentialPoissonSolver.H:63
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:201
amrex::MultiFab * ScalarField
Definition MultiFabRegister.H:190
GridType
Definition Enums.H:23
PatchType
Definition Enums.H:30
BoxND< 3 > Box
IntVectND< 3 > IntVect
Definition PML.H:48
SigmaVect sigma_star_cumsum_fac
Definition PML.H:75
void define_multiple(const amrex::Box &box, const amrex::BoxArray &grids, const amrex::IntVect &ncell, const amrex::Array< amrex::Real, 3 > &fac, amrex::Real v_sigma)
Definition PML.cpp:382
void define_single(const amrex::Box &regdomain, const amrex::IntVect &ncell, const amrex::Array< amrex::Real, 3 > &fac, amrex::Real v_sigma)
Definition PML.cpp:339
SigmaVect sigma_star
Definition PML.H:70
SigmaVect sigma_star_fac
Definition PML.H:74
std::array< Sigma, 3 > SigmaVect
Definition PML.H:64
SigmaVect sigma_cumsum
Definition PML.H:69
SigmaVect sigma_star_cumsum
Definition PML.H:71
void ComputePMLFactorsB(const amrex::Real *dx, amrex::Real dt)
Definition PML.cpp:582
void value_type
Definition PML.H:66
SigmaVect sigma_cumsum_fac
Definition PML.H:73
SigmaVect sigma_fac
Definition PML.H:72
SigmaBox(const amrex::Box &box, const amrex::BoxArray &grids, const amrex::Real *dx, const amrex::IntVect &ncell, const amrex::IntVect &delta, const amrex::Box &regdomain, amrex::Real v_sigma)
Definition PML.cpp:289
void ComputePMLFactorsE(const amrex::Real *dx, amrex::Real dt)
Definition PML.cpp:616
SigmaVect sigma
Definition PML.H:68
amrex::Real v_sigma
Definition PML.H:76
Definition PML.H:41
int m_lo
Definition PML.H:44
int lo() const
Definition PML.H:42
int hi() const
Definition PML.H:43
int m_hi
Definition PML.H:44
Definition MultiFabRegister.H:275