WarpX
FiniteDifferenceSolver.H
Go to the documentation of this file.
1 /* Copyright 2020 Remi Lehe
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 
8 #ifndef WARPX_FINITE_DIFFERENCE_SOLVER_H_
9 #define WARPX_FINITE_DIFFERENCE_SOLVER_H_
10 
14 
16 #include "Evolve/WarpXDtType.H"
19 
20 #include <ablastr/utils/Enums.H>
21 
22 #include <AMReX_GpuContainers.H>
23 #include <AMReX_REAL.H>
24 
25 #include <AMReX_BaseFwd.H>
26 
27 #include <array>
28 #include <memory>
29 
37 {
38  public:
39 
40  // Constructor
50  int fdtd_algo,
51  std::array<amrex::Real,3> cell_size,
53 
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,
62  std::array< std::unique_ptr<amrex::LayoutData<FaceInfoBox> >, 3 >& borrowing,
63  int lev, amrex::Real dt );
64 
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 );
73 
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,
77  int rhocomp,
78  amrex::Real dt );
79 
80  void EvolveG (std::unique_ptr<amrex::MultiFab>& Gfield,
81  std::array<std::unique_ptr<amrex::MultiFab>,3> const& Bfield,
82  amrex::Real dt);
83 
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,
88  int lev );
89 
91  std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
92  std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
93  amrex::Box domain_box,
94  amrex::Real dt,
95  amrex::Vector<FieldBoundaryType> field_boundary_lo,
96  amrex::Vector<FieldBoundaryType> field_boundary_hi);
97 
98  void ComputeDivE ( const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
99  amrex::MultiFab& divE );
100 
113  void MacroscopicEvolveE ( 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,
117  amrex::Real dt,
118  std::unique_ptr<MacroscopicProperties> const& macroscopic_properties);
119 
120  void EvolveBPML ( std::array< amrex::MultiFab*, 3 > Bfield,
121  std::array< amrex::MultiFab*, 3 > Efield,
122  amrex::Real dt,
123  bool dive_cleaning);
124 
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,
129  amrex::MultiFab* Ffield,
130  MultiSigmaBox const& sigba,
131  amrex::Real dt, bool pml_has_particles );
132 
133  void EvolveFPML ( amrex::MultiFab* Ffield,
134  std::array< amrex::MultiFab*, 3 > Efield,
135  amrex::Real dt );
136 
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,
162  int lev, HybridPICModel const* hybrid_model,
163  bool include_resistivity_term );
164 
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,
178  int lev );
179 
180  private:
181 
184 
185 #ifdef WARPX_DIM_RZ
186  amrex::Real m_dr, m_rmin;
187  int m_nmodes;
188  // host-only
190  // device copy after init
193 #else
194  // host-only
195  amrex::Vector<amrex::Real> m_h_stencil_coefs_x, m_h_stencil_coefs_y, m_h_stencil_coefs_z;
196  // device copy after init
197  amrex::Gpu::DeviceVector<amrex::Real> m_stencil_coefs_x;
198  amrex::Gpu::DeviceVector<amrex::Real> m_stencil_coefs_y;
200 #endif
201 
202  public:
203  // The member functions below contain extended __device__ lambda.
204  // In order to compile with nvcc, they need to be public.
205 
206 #ifdef WARPX_DIM_RZ
207  template< typename T_Algo >
208  void EvolveBCylindrical (
209  std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
210  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& Efield,
211  int lev,
212  amrex::Real dt );
213 
214  template< typename T_Algo >
215  void EvolveECylindrical (
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,
221  int lev,
222  amrex::Real dt );
223 
224  template< typename T_Algo >
225  void EvolveFCylindrical (
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,
229  int rhocomp,
230  amrex::Real dt );
231 
232  template< typename T_Algo >
234  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
235  amrex::MultiFab& divE );
236 
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,
247  int lev, HybridPICModel const* hybrid_model,
248  bool include_resistivity_term );
249 
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,
255  int lev
256  );
257 
258 #else
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 );
265 
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 );
274 
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,
280  int rhocomp,
281  amrex::Real dt );
282 
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,
287  amrex::Real dt);
288 
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);
294 
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,
302  std::array< std::unique_ptr<amrex::LayoutData<FaceInfoBox> >, 3 >& borrowing,
303  int lev, amrex::Real dt
304  );
305 
306  template< typename T_Algo >
307  void ComputeDivECartesian (
308  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
309  amrex::MultiFab& divE );
310 
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,
317  amrex::Real dt,
318  std::unique_ptr<MacroscopicProperties> const& macroscopic_properties);
319 
320  template< typename T_Algo >
321  void EvolveBPMLCartesian (
322  std::array< amrex::MultiFab*, 3 > Bfield,
323  std::array< amrex::MultiFab*, 3 > Efield,
324  amrex::Real dt,
325  bool dive_cleaning);
326 
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,
333  amrex::MultiFab* Ffield,
334  MultiSigmaBox const& sigba,
335  amrex::Real dt, bool pml_has_particles );
336 
337  template< typename T_Algo >
338  void EvolveFPMLCartesian ( amrex::MultiFab* Ffield,
339  std::array< amrex::MultiFab*, 3 > Efield,
340  amrex::Real dt );
341 
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,
352  int lev, HybridPICModel const* hybrid_model,
353  bool include_resistivity_term );
354 
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,
360  int lev
361  );
362 #endif
363 
364 };
365 
366 #endif // WARPX_FINITE_DIFFERENCE_SOLVER_H_
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 &macroscopic_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
Definition: PML.H:123
GridType
Definition: Enums.H:17
cell_size
Definition: compute_domain.py:37
float dt
Definition: stencil.py:442