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,
150 void HybridPICSolveE ( std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
151 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Jfield,
152 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jifield,
153 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
154 std::unique_ptr<amrex::MultiFab>
const& rhofield,
155 std::unique_ptr<amrex::MultiFab>
const& Pefield,
156 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
158 bool include_resistivity_term );
170 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Jfield,
171 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
172 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
202 template<
typename T_Algo >
204 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
205 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
209 template<
typename T_Algo >
211 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
212 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
213 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
214 std::unique_ptr<amrex::MultiFab>
const& Ffield,
218 template<
typename T_Algo >
220 std::unique_ptr<amrex::MultiFab>& Ffield,
221 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
222 std::unique_ptr<amrex::MultiFab>
const& rhofield,
226 template<
typename T_Algo >
228 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
231 template<
typename T_Algo>
233 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
234 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jfield,
235 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jifield,
236 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
237 std::unique_ptr<amrex::MultiFab>
const& rhofield,
238 std::unique_ptr<amrex::MultiFab>
const& Pefield,
239 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
241 bool include_resistivity_term );
243 template<
typename T_Algo>
245 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Jfield,
246 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
247 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
252 template<
typename T_Algo >
253 void EvolveBCartesian (
254 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
255 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
256 std::unique_ptr<amrex::MultiFab>
const& Gfield,
257 int lev, amrex::Real
dt );
259 template<
typename T_Algo >
260 void EvolveECartesian (
261 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
262 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
263 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
264 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
265 std::unique_ptr<amrex::MultiFab>
const& Ffield,
266 int lev, amrex::Real
dt );
268 template<
typename T_Algo >
269 void EvolveFCartesian (
270 std::unique_ptr<amrex::MultiFab>& Ffield,
271 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
272 std::unique_ptr<amrex::MultiFab>
const& rhofield,
276 template<
typename T_Algo >
277 void EvolveGCartesian (
278 std::unique_ptr<amrex::MultiFab>& Gfield,
279 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
282 void EvolveRhoCartesianECT (
283 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
284 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
285 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
286 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
int lev);
288 void EvolveBCartesianECT (
289 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
290 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
291 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
292 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
293 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
294 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
296 int lev, amrex::Real
dt
299 template<
typename T_Algo >
300 void ComputeDivECartesian (
301 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
304 template<
typename T_Algo,
typename T_MacroAlgo >
305 void MacroscopicEvolveECartesian (
306 std::array< std::unique_ptr< amrex::MultiFab>, 3>& Efield,
307 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Bfield,
308 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Jfield,
309 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
311 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
313 template<
typename T_Algo >
314 void EvolveBPMLCartesian (
315 std::array< amrex::MultiFab*, 3 > Bfield,
316 std::array< amrex::MultiFab*, 3 > Efield,
320 template<
typename T_Algo >
321 void EvolveEPMLCartesian (
322 std::array< amrex::MultiFab*, 3 > Efield,
323 std::array< amrex::MultiFab*, 3 > Bfield,
324 std::array< amrex::MultiFab*, 3 > Jfield,
325 std::array< amrex::MultiFab*, 3 > edge_lengths,
328 amrex::Real
dt,
bool pml_has_particles );
330 template<
typename T_Algo >
332 std::array< amrex::MultiFab*, 3 > Efield,
335 template<
typename T_Algo>
336 void HybridPICSolveECartesian (
337 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
338 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jfield,
339 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jifield,
340 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
341 std::unique_ptr<amrex::MultiFab>
const& rhofield,
342 std::unique_ptr<amrex::MultiFab>
const& Pefield,
343 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
345 bool include_resistivity_term );
347 template<
typename T_Algo>
348 void CalculateCurrentAmpereCartesian (
349 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Jfield,
350 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
351 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:182
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 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:187
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:177
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:184
short m_grid_type
Definition: FiniteDifferenceSolver.H:178
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_r
Definition: FiniteDifferenceSolver.H:186
amrex::Real m_dr
Definition: FiniteDifferenceSolver.H:181
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:184
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:181
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
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 &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_pic_model, bool include_resistivity_term)
Definition: HybridPICSolveE.cpp:405
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 &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_pic_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
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