8 #ifndef WARPX_FINITE_DIFFERENCE_SOLVER_H_
9 #define WARPX_FINITE_DIFFERENCE_SOLVER_H_
51 void EvolveB ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
52 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
53 std::unique_ptr<amrex::MultiFab>
const& Gfield,
54 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
55 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
56 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
57 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
58 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
60 int lev, amrex::Real
dt );
62 void EvolveE ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
63 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
64 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
65 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
66 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
67 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
68 std::unique_ptr<amrex::MultiFab>
const& Ffield,
69 int lev, amrex::Real
dt );
71 void EvolveF ( std::unique_ptr<amrex::MultiFab>& Ffield,
72 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
73 std::unique_ptr<amrex::MultiFab>
const& rhofield,
77 void EvolveG (std::unique_ptr<amrex::MultiFab>& Gfield,
78 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
81 void EvolveECTRho ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
82 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
83 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
84 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
88 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
89 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
95 void ComputeDivE (
const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
111 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
112 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
113 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
115 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
117 void EvolveBPML ( std::array< amrex::MultiFab*, 3 > Bfield,
118 std::array< amrex::MultiFab*, 3 > Efield,
122 void EvolveEPML ( std::array< amrex::MultiFab*, 3 > Efield,
123 std::array< amrex::MultiFab*, 3 > Bfield,
124 std::array< amrex::MultiFab*, 3 > Jfield,
125 std::array< amrex::MultiFab*, 3 > edge_lengths,
128 amrex::Real
dt,
bool pml_has_particles );
131 std::array< amrex::MultiFab*, 3 > Efield,
151 void HybridPICSolveE ( std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
152 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Jfield,
153 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jifield,
154 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jextfield,
155 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
156 std::unique_ptr<amrex::MultiFab>
const& rhofield,
157 std::unique_ptr<amrex::MultiFab>
const& Pefield,
158 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
160 bool include_resistivity_term );
172 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Jfield,
173 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
174 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
204 template<
typename T_Algo >
206 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
207 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
211 template<
typename T_Algo >
213 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
214 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
215 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
216 std::unique_ptr<amrex::MultiFab>
const& Ffield,
220 template<
typename T_Algo >
222 std::unique_ptr<amrex::MultiFab>& Ffield,
223 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
224 std::unique_ptr<amrex::MultiFab>
const& rhofield,
228 template<
typename T_Algo >
230 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
233 template<
typename T_Algo>
235 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
236 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jfield,
237 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jifield,
238 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jextfield,
239 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
240 std::unique_ptr<amrex::MultiFab>
const& rhofield,
241 std::unique_ptr<amrex::MultiFab>
const& Pefield,
242 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
244 bool include_resistivity_term );
246 template<
typename T_Algo>
248 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Jfield,
249 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
250 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
255 template<
typename T_Algo >
256 void EvolveBCartesian (
257 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
258 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
259 std::unique_ptr<amrex::MultiFab>
const& Gfield,
260 int lev, amrex::Real
dt );
262 template<
typename T_Algo >
263 void EvolveECartesian (
264 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
265 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
266 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
267 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
268 std::unique_ptr<amrex::MultiFab>
const& Ffield,
269 int lev, amrex::Real
dt );
271 template<
typename T_Algo >
272 void EvolveFCartesian (
273 std::unique_ptr<amrex::MultiFab>& Ffield,
274 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
275 std::unique_ptr<amrex::MultiFab>
const& rhofield,
279 template<
typename T_Algo >
280 void EvolveGCartesian (
281 std::unique_ptr<amrex::MultiFab>& Gfield,
282 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
285 void EvolveRhoCartesianECT (
286 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
287 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
288 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
289 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
int lev);
291 void EvolveBCartesianECT (
292 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
293 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
294 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
295 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
296 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
297 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
299 int lev, amrex::Real
dt
302 template<
typename T_Algo >
303 void ComputeDivECartesian (
304 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
307 template<
typename T_Algo,
typename T_MacroAlgo >
308 void MacroscopicEvolveECartesian (
309 std::array< std::unique_ptr< amrex::MultiFab>, 3>& Efield,
310 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Bfield,
311 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Jfield,
312 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
314 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
316 template<
typename T_Algo >
317 void EvolveBPMLCartesian (
318 std::array< amrex::MultiFab*, 3 > Bfield,
319 std::array< amrex::MultiFab*, 3 > Efield,
323 template<
typename T_Algo >
324 void EvolveEPMLCartesian (
325 std::array< amrex::MultiFab*, 3 > Efield,
326 std::array< amrex::MultiFab*, 3 > Bfield,
327 std::array< amrex::MultiFab*, 3 > Jfield,
328 std::array< amrex::MultiFab*, 3 > edge_lengths,
331 amrex::Real
dt,
bool pml_has_particles );
333 template<
typename T_Algo >
335 std::array< amrex::MultiFab*, 3 > Efield,
338 template<
typename T_Algo>
339 void HybridPICSolveECartesian (
340 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
341 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jfield,
342 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jifield,
343 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jextfield,
344 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
345 std::unique_ptr<amrex::MultiFab>
const& rhofield,
346 std::unique_ptr<amrex::MultiFab>
const& Pefield,
347 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
349 bool include_resistivity_term );
351 template<
typename T_Algo>
352 void CalculateCurrentAmpereCartesian (
353 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Jfield,
354 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
355 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
Top-level class for the electromagnetic finite-difference solver.
Definition: FiniteDifferenceSolver.H:34
int m_nmodes
Definition: FiniteDifferenceSolver.H:184
void HybridPICSolveECylindrical(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jifield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jextfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::unique_ptr< amrex::MultiFab > const &rhofield, std::unique_ptr< amrex::MultiFab > const &Pefield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, int lev, HybridPICModel const *hybrid_model, bool include_resistivity_term)
Definition: HybridPICSolveE.cpp:406
void MacroscopicEvolveE(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, amrex::Real dt, std::unique_ptr< MacroscopicProperties > const ¯oscopic_properties)
Macroscopic E-update for non-vacuum medium using the user-selected finite-difference algorithm and ma...
Definition: MacroscopicEvolveE.cpp:37
void CalculateCurrentAmpere(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Jfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, int lev)
Calculation of total current using Ampere's law (without displacement current): J = (curl x B) / mu0.
Definition: HybridPICSolveE.cpp:25
void EvolveG(std::unique_ptr< amrex::MultiFab > &Gfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, amrex::Real dt)
Definition: EvolveG.cpp:40
void EvolveBPML(std::array< amrex::MultiFab *, 3 > Bfield, std::array< amrex::MultiFab *, 3 > Efield, amrex::Real dt, bool dive_cleaning)
Update the B field, over one timestep.
Definition: EvolveBPML.cpp:43
void EvolveFCylindrical(std::unique_ptr< amrex::MultiFab > &Ffield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Efield, std::unique_ptr< amrex::MultiFab > const &rhofield, int rhocomp, amrex::Real dt)
Definition: EvolveF.cpp:137
void HybridPICSolveE(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Jfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jifield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jextfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::unique_ptr< amrex::MultiFab > const &rhofield, std::unique_ptr< amrex::MultiFab > const &Pefield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, int lev, HybridPICModel const *hybrid_model, bool include_resistivity_term)
E-update in the hybrid PIC algorithm as described in Winske et al. (2003) Eq. 10. https://link....
Definition: HybridPICSolveE.cpp:368
void EvolveF(std::unique_ptr< amrex::MultiFab > &Ffield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Efield, std::unique_ptr< amrex::MultiFab > const &rhofield, int rhocomp, amrex::Real dt)
Update the F field, over one timestep.
Definition: EvolveF.cpp:46
void ComputeDivECylindrical(const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, amrex::MultiFab &divE)
Definition: ComputeDivE.cpp:125
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_z
Definition: FiniteDifferenceSolver.H:189
void ApplySilverMuellerBoundary(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Bfield, amrex::Box domain_box, amrex::Real dt, amrex::Vector< int > field_boundary_lo, amrex::Vector< int > field_boundary_hi)
Update the B field at the boundary, using the Silver-Mueller condition.
Definition: ApplySilverMuellerBoundary.cpp:37
int m_fdtd_algo
Definition: FiniteDifferenceSolver.H:179
void EvolveE(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &face_areas, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &ECTRhofield, std::unique_ptr< amrex::MultiFab > const &Ffield, int lev, amrex::Real dt)
Update the E field, over one timestep.
Definition: EvolveE.cpp:48
void ComputeDivE(const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, amrex::MultiFab &divE)
Update the F field, over one timestep.
Definition: ComputeDivE.cpp:42
void EvolveECTRho(std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &face_areas, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &ECTRhofield, int lev)
Update the B field, over one timestep.
Definition: EvolveECTRho.cpp:49
void EvolveFPML(amrex::MultiFab *Ffield, std::array< amrex::MultiFab *, 3 > Efield, amrex::Real dt)
Update the E field, over one timestep.
Definition: EvolveFPML.cpp:42
void EvolveECylindrical(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Jfield, std::unique_ptr< amrex::MultiFab > const &Ffield, int lev, amrex::Real dt)
Definition: EvolveE.cpp:234
void EvolveEPML(std::array< amrex::MultiFab *, 3 > Efield, std::array< amrex::MultiFab *, 3 > Bfield, std::array< amrex::MultiFab *, 3 > Jfield, std::array< amrex::MultiFab *, 3 > edge_lengths, amrex::MultiFab *Ffield, MultiSigmaBox const &sigba, amrex::Real dt, bool pml_has_particles)
Update the E field, over one timestep.
Definition: EvolveEPML.cpp:46
amrex::Vector< amrex::Real > m_h_stencil_coefs_z
Definition: FiniteDifferenceSolver.H:186
short m_grid_type
Definition: FiniteDifferenceSolver.H:180
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_r
Definition: FiniteDifferenceSolver.H:188
amrex::Real m_dr
Definition: FiniteDifferenceSolver.H:183
void EvolveB(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Efield, std::unique_ptr< amrex::MultiFab > const &Gfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &face_areas, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &area_mod, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &ECTRhofield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Venl, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > &flag_info_cell, std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > &borrowing, int lev, amrex::Real dt)
Update the B field, over one timestep.
Definition: EvolveB.cpp:50
amrex::Vector< amrex::Real > m_h_stencil_coefs_r
Definition: FiniteDifferenceSolver.H:186
void CalculateCurrentAmpereCylindrical(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Jfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, int lev)
Definition: HybridPICSolveE.cpp:60
FiniteDifferenceSolver(int fdtd_algo, std::array< amrex::Real, 3 > cell_size, short grid_type)
Initialize the finite-difference Maxwell solver (for a given refinement level)
Definition: FiniteDifferenceSolver.cpp:30
amrex::Real m_rmin
Definition: FiniteDifferenceSolver.H:183
void EvolveBCylindrical(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Efield, int lev, amrex::Real dt)
Definition: EvolveB.cpp:372
This class contains the parameters needed to evaluate hybrid field solutions (kinetic ions with fluid...
Definition: HybridPICModel.H:30
cell_size
Definition: compute_domain.py:37
float dt
Definition: stencil.py:442