8 #ifndef WARPX_FINITE_DIFFERENCE_SOLVER_H_
9 #define WARPX_FINITE_DIFFERENCE_SOLVER_H_
54 void EvolveB ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
55 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
56 std::unique_ptr<amrex::MultiFab>
const& Gfield,
57 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
58 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
59 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
60 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
61 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
63 int lev, amrex::Real
dt );
65 void EvolveE ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
66 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
67 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
68 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
69 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
70 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
71 std::unique_ptr<amrex::MultiFab>
const& Ffield,
72 int lev, amrex::Real
dt );
74 void EvolveF ( std::unique_ptr<amrex::MultiFab>& Ffield,
75 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
76 std::unique_ptr<amrex::MultiFab>
const& rhofield,
80 void EvolveG (std::unique_ptr<amrex::MultiFab>& Gfield,
81 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
84 void EvolveECTRho ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
85 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
86 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
87 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
91 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
92 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
98 void ComputeDivE (
const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
114 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
115 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
116 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
118 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
120 void EvolveBPML ( std::array< amrex::MultiFab*, 3 > Bfield,
121 std::array< amrex::MultiFab*, 3 > Efield,
125 void EvolveEPML ( std::array< amrex::MultiFab*, 3 > Efield,
126 std::array< amrex::MultiFab*, 3 > Bfield,
127 std::array< amrex::MultiFab*, 3 > Jfield,
128 std::array< amrex::MultiFab*, 3 > edge_lengths,
131 amrex::Real
dt,
bool pml_has_particles );
134 std::array< amrex::MultiFab*, 3 > Efield,
154 void HybridPICSolveE ( std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
155 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Jfield,
156 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jifield,
157 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jextfield,
158 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
159 std::unique_ptr<amrex::MultiFab>
const& rhofield,
160 std::unique_ptr<amrex::MultiFab>
const& Pefield,
161 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
163 bool include_resistivity_term );
175 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Jfield,
176 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
177 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
207 template<
typename T_Algo >
209 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
210 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
214 template<
typename T_Algo >
216 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
217 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
218 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
219 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
220 std::unique_ptr<amrex::MultiFab>
const& Ffield,
224 template<
typename T_Algo >
226 std::unique_ptr<amrex::MultiFab>& Ffield,
227 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
228 std::unique_ptr<amrex::MultiFab>
const& rhofield,
232 template<
typename T_Algo >
234 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
237 template<
typename T_Algo>
239 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
240 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jfield,
241 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jifield,
242 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jextfield,
243 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
244 std::unique_ptr<amrex::MultiFab>
const& rhofield,
245 std::unique_ptr<amrex::MultiFab>
const& Pefield,
246 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
248 bool include_resistivity_term );
250 template<
typename T_Algo>
252 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Jfield,
253 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
254 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
259 template<
typename T_Algo >
260 void EvolveBCartesian (
261 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
262 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
263 std::unique_ptr<amrex::MultiFab>
const& Gfield,
264 int lev, amrex::Real
dt );
266 template<
typename T_Algo >
267 void EvolveECartesian (
268 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
269 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
270 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
271 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
272 std::unique_ptr<amrex::MultiFab>
const& Ffield,
273 int lev, amrex::Real
dt );
275 template<
typename T_Algo >
276 void EvolveFCartesian (
277 std::unique_ptr<amrex::MultiFab>& Ffield,
278 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
279 std::unique_ptr<amrex::MultiFab>
const& rhofield,
283 template<
typename T_Algo >
284 void EvolveGCartesian (
285 std::unique_ptr<amrex::MultiFab>& Gfield,
286 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
289 void EvolveRhoCartesianECT (
290 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
291 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
292 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
293 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
int lev);
295 void EvolveBCartesianECT (
296 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
297 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
298 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
299 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
300 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
301 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
303 int lev, amrex::Real
dt
306 template<
typename T_Algo >
307 void ComputeDivECartesian (
308 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
311 template<
typename T_Algo,
typename T_MacroAlgo >
312 void MacroscopicEvolveECartesian (
313 std::array< std::unique_ptr< amrex::MultiFab>, 3>& Efield,
314 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Bfield,
315 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Jfield,
316 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
318 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
320 template<
typename T_Algo >
321 void EvolveBPMLCartesian (
322 std::array< amrex::MultiFab*, 3 > Bfield,
323 std::array< amrex::MultiFab*, 3 > Efield,
327 template<
typename T_Algo >
328 void EvolveEPMLCartesian (
329 std::array< amrex::MultiFab*, 3 > Efield,
330 std::array< amrex::MultiFab*, 3 > Bfield,
331 std::array< amrex::MultiFab*, 3 > Jfield,
332 std::array< amrex::MultiFab*, 3 > edge_lengths,
335 amrex::Real
dt,
bool pml_has_particles );
337 template<
typename T_Algo >
339 std::array< amrex::MultiFab*, 3 > Efield,
342 template<
typename T_Algo>
343 void HybridPICSolveECartesian (
344 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
345 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jfield,
346 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Jifield,
347 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jextfield,
348 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
349 std::unique_ptr<amrex::MultiFab>
const& rhofield,
350 std::unique_ptr<amrex::MultiFab>
const& Pefield,
351 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
353 bool include_resistivity_term );
355 template<
typename T_Algo>
356 void CalculateCurrentAmpereCartesian (
357 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Jfield,
358 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
359 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
Top-level class for the electromagnetic finite-difference solver.
Definition: FiniteDifferenceSolver.H:37
int m_nmodes
Definition: FiniteDifferenceSolver.H:187
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
FiniteDifferenceSolver(int fdtd_algo, std::array< amrex::Real, 3 > cell_size, ablastr::utils::enums::GridType grid_type)
Initialize the finite-difference Maxwell solver (for a given refinement level)
Definition: FiniteDifferenceSolver.cpp:30
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::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, std::unique_ptr< amrex::MultiFab > const &Ffield, int lev, amrex::Real dt)
Definition: EvolveE.cpp:232
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
ablastr::utils::enums::GridType m_grid_type
Definition: FiniteDifferenceSolver.H:183
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:192
int m_fdtd_algo
Definition: FiniteDifferenceSolver.H:182
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 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< FieldBoundaryType > field_boundary_lo, amrex::Vector< FieldBoundaryType > field_boundary_hi)
Update the B field at the boundary, using the Silver-Mueller condition.
Definition: ApplySilverMuellerBoundary.cpp:37
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:189
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_r
Definition: FiniteDifferenceSolver.H:191
amrex::Real m_dr
Definition: FiniteDifferenceSolver.H:186
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:189
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
amrex::Real m_rmin
Definition: FiniteDifferenceSolver.H:186
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:32
GridType
Definition: Enums.H:17
cell_size
Definition: compute_domain.py:37
float dt
Definition: stencil.py:442