8 #ifndef WARPX_FINITE_DIFFERENCE_SOLVER_H_
9 #define WARPX_FINITE_DIFFERENCE_SOLVER_H_
47 short const grid_type );
49 void EvolveBLondon ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
50 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& current,
51 std::unique_ptr<amrex::MultiFab>
const& Gfield,
52 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
53 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
54 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
55 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
56 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
58 int lev, amrex::Real
const dt, amrex::Real
const penetration_depth );
60 void EvolveB ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
61 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
62 std::unique_ptr<amrex::MultiFab>
const& Gfield,
63 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
64 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
65 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
66 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
67 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
69 int lev, amrex::Real
const dt );
71 void EvolveE ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
72 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
73 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
74 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
75 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
76 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
77 std::unique_ptr<amrex::MultiFab>
const& Ffield,
78 int lev, amrex::Real
const dt );
80 void EvolveF ( std::unique_ptr<amrex::MultiFab>& Ffield,
81 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
82 std::unique_ptr<amrex::MultiFab>
const& rhofield,
84 amrex::Real
const dt );
86 void EvolveG (std::unique_ptr<amrex::MultiFab>& Gfield,
87 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
88 amrex::Real
const dt);
90 void EvolveECTRho ( std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
91 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
92 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
93 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
97 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
98 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
100 amrex::Real
const dt,
104 void ComputeDivE (
const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
120 #ifndef WARPX_MAG_LLG
121 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
123 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Hfield,
125 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
126 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
127 amrex::Real
const dt,
128 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
147 void MacroscopicEvolveHM (
148 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Mfield,
149 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Hfield,
150 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Bfield,
151 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &H_biasfield,
152 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &Efield,
153 amrex::Real
const dt,
154 std::unique_ptr<MacroscopicProperties>
const ¯oscopic_properties);
156 void MacroscopicEvolveHM_2nd (
158 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Mfield,
159 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Hfield,
160 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Bfield,
161 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &H_biasfield,
162 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &Efield,
163 amrex::Real
const dt,
164 std::unique_ptr<MacroscopicProperties>
const ¯oscopic_properties);
169 void EvolveBPML ( std::array< amrex::MultiFab*, 3 > Bfield,
170 std::array< amrex::MultiFab*, 3 >
const Efield,
171 amrex::Real
const dt,
172 const bool dive_cleaning);
174 void EvolveEPML ( std::array< amrex::MultiFab*, 3 > Efield,
175 std::array< amrex::MultiFab*, 3 >
const Bfield,
176 std::array< amrex::MultiFab*, 3 >
const Jfield,
177 std::array< amrex::MultiFab*, 3 >
const edge_lengths,
180 amrex::Real
const dt,
bool pml_has_particles );
183 std::array< amrex::MultiFab*, 3 >
const Efield,
184 amrex::Real
const dt );
187 #ifndef WARPX_MAG_LLG
188 std::array< amrex::MultiFab*, 3 >
const Bfield,
190 std::array< amrex::MultiFab*, 3 >
const Hfield,
192 std::array< amrex::MultiFab*, 3 >
const Jfield,
195 amrex::Real
const dt,
bool pml_has_particles,
196 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties,
203 void EvolveHPML ( std::array< amrex::MultiFab*, 3 > Hfield,
204 std::array< amrex::MultiFab*, 3 >
const Efield,
205 amrex::Real
const dt,
206 const bool dive_cleaning);
237 template<
typename T_Algo >
239 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
240 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
242 amrex::Real
const dt );
244 template<
typename T_Algo >
246 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
247 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
248 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
249 std::unique_ptr<amrex::MultiFab>
const& Ffield,
251 amrex::Real
const dt );
253 template<
typename T_Algo >
255 std::unique_ptr<amrex::MultiFab>& Ffield,
256 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
257 std::unique_ptr<amrex::MultiFab>
const& rhofield,
259 amrex::Real
const dt );
261 template<
typename T_Algo >
263 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
266 template<
typename T_Algo >
267 void EvolveBLondonCartesian (
268 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
269 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& current,
270 std::unique_ptr<amrex::MultiFab>
const& Gfield,
271 int lev, amrex::Real
const dt, amrex::Real
const penetration_depth );
273 template<
typename T_Algo >
274 void EvolveBCartesian (
275 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
276 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
277 std::unique_ptr<amrex::MultiFab>
const& Gfield,
278 int lev, amrex::Real
const dt );
280 template<
typename T_Algo >
281 void EvolveECartesian (
282 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Efield,
283 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Bfield,
284 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Jfield,
285 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
286 std::unique_ptr<amrex::MultiFab>
const& Ffield,
287 int lev, amrex::Real
const dt );
289 template<
typename T_Algo >
290 void EvolveFCartesian (
291 std::unique_ptr<amrex::MultiFab>& Ffield,
292 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
293 std::unique_ptr<amrex::MultiFab>
const& rhofield,
295 amrex::Real
const dt );
297 template<
typename T_Algo >
298 void EvolveGCartesian (
299 std::unique_ptr<amrex::MultiFab>& Gfield,
300 std::array<std::unique_ptr<amrex::MultiFab>,3>
const& Bfield,
301 amrex::Real
const dt);
303 void EvolveRhoCartesianECT (
304 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& Efield,
305 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
306 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
307 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
int lev);
309 void EvolveBCartesianECT (
310 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
311 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& face_areas,
312 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& area_mod,
313 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& ECTRhofield,
314 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Venl,
315 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
317 int lev, amrex::Real
const dt
320 template<
typename T_Algo >
321 void ComputeDivECartesian (
322 const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
325 template<
typename T_Algo,
typename T_MacroAlgo >
326 void MacroscopicEvolveECartesian (
327 std::array< std::unique_ptr< amrex::MultiFab>, 3>& Efield,
328 #ifndef WARPX_MAG_LLG
329 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const &Bfield,
331 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const &Hfield,
333 std::array< std::unique_ptr< amrex::MultiFab>, 3>
const& Jfield,
334 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const& edge_lengths,
335 amrex::Real
const dt,
336 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
339 template<
typename T_Algo >
340 void MacroscopicEvolveHMCartesian(
341 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Mfield,
342 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Hfield,
343 std::array< std::unique_ptr<amrex::MultiFab>, 3>& Bfield,
344 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &H_biasfield,
345 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &Efield,
346 amrex::Real
const dt,
347 std::unique_ptr<MacroscopicProperties>
const ¯oscopic_properties);
349 template<
typename T_Algo >
350 void MacroscopicEvolveHMCartesian_2nd(
352 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Mfield,
353 std::array<std::unique_ptr<amrex::MultiFab>, 3> &Hfield,
354 std::array< std::unique_ptr<amrex::MultiFab>, 3 >& Bfield,
355 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &H_biasfield,
356 std::array<std::unique_ptr<amrex::MultiFab>, 3>
const &Efield,
357 amrex::Real
const dt,
358 std::unique_ptr<MacroscopicProperties>
const ¯oscopic_properties);
361 template<
typename T_Algo >
362 void EvolveBPMLCartesian (
363 std::array< amrex::MultiFab*, 3 > Bfield,
364 std::array< amrex::MultiFab*, 3 >
const Efield,
365 amrex::Real
const dt,
366 const bool dive_cleaning);
368 template<
typename T_Algo >
369 void EvolveEPMLCartesian (
370 std::array< amrex::MultiFab*, 3 > Efield,
371 std::array< amrex::MultiFab*, 3 >
const Bfield,
372 std::array< amrex::MultiFab*, 3 >
const Jfield,
373 std::array< amrex::MultiFab*, 3 >
const edge_lengths,
376 amrex::Real
const dt,
bool pml_has_particles );
378 template<
typename T_Algo >
380 std::array< amrex::MultiFab*, 3 >
const Efield,
381 amrex::Real
const dt );
383 template<
typename T_Algo,
typename T_MacroAlgo >
384 void MacroscopicEvolveEPMLCartesian (
385 std::array< amrex::MultiFab*, 3 > Efield,
386 #ifndef WARPX_MAG_LLG
387 std::array< amrex::MultiFab*, 3 >
const Bfield,
389 std::array< amrex::MultiFab*, 3 >
const Hfield,
391 std::array< amrex::MultiFab*, 3 >
const Jfield,
394 amrex::Real
const dt,
bool pml_has_particles,
395 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties,
402 template<
typename T_Algo >
403 void EvolveHPMLCartesian (
404 std::array< amrex::MultiFab*, 3 > Bfield,
405 std::array< amrex::MultiFab*, 3 >
const Efield,
406 amrex::Real
const dt,
407 const bool dive_cleaning);
Top-level class for the electromagnetic finite-difference solver.
Definition: FiniteDifferenceSolver.H:32
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, const int lev)
Update the B field, over one timestep.
Definition: EvolveECTRho.cpp:49
int m_nmodes
Definition: FiniteDifferenceSolver.H:217
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 const dt)
Update the E field, over one timestep.
Definition: EvolveE.cpp:48
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, const int lev, amrex::Real const dt)
Definition: EvolveE.cpp:234
FiniteDifferenceSolver(int const fdtd_algo, std::array< amrex::Real, 3 > cell_size, short const grid_type)
Initialize the finite-difference Maxwell solver (for a given refinement level)
Definition: FiniteDifferenceSolver.cpp:30
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 const 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
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 const dt)
Update the B field, over one timestep.
Definition: EvolveB.cpp:50
void EvolveEPML(std::array< amrex::MultiFab *, 3 > Efield, std::array< amrex::MultiFab *, 3 > const Bfield, std::array< amrex::MultiFab *, 3 > const Jfield, std::array< amrex::MultiFab *, 3 > const edge_lengths, amrex::MultiFab *const Ffield, MultiSigmaBox const &sigba, amrex::Real const dt, bool pml_has_particles)
Update the E field, over one timestep.
Definition: EvolveEPML.cpp:46
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 const 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 EvolveBLondon(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const ¤t, 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 const dt, amrex::Real const penetration_depth)
Update the B field, over one timestep.
Definition: EvolveBLondon.cpp:48
void ComputeDivECylindrical(const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, amrex::MultiFab &divE)
Definition: ComputeDivE.cpp:123
void MacroscopicEvolveEPML(std::array< amrex::MultiFab *, 3 > Efield, std::array< amrex::MultiFab *, 3 > const Bfield, std::array< amrex::MultiFab *, 3 > const Jfield, amrex::MultiFab *const Ffield, MultiSigmaBox const &sigba, amrex::Real const dt, bool pml_has_particles, std::unique_ptr< MacroscopicProperties > const ¯oscopic_properties, amrex::MultiFab *const eps_mf, amrex::MultiFab *const mu_mf, amrex::MultiFab *const sigma_mf)
Update the E field, over one timestep.
Definition: MacroscopicEvolveEPML.cpp:24
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_z
Definition: FiniteDifferenceSolver.H:222
int m_fdtd_algo
Definition: FiniteDifferenceSolver.H:212
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 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 const rhocomp, amrex::Real const dt)
Definition: EvolveF.cpp:137
amrex::Vector< amrex::Real > m_h_stencil_coefs_z
Definition: FiniteDifferenceSolver.H:219
short m_grid_type
Definition: FiniteDifferenceSolver.H:213
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_r
Definition: FiniteDifferenceSolver.H:221
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 const rhocomp, amrex::Real const dt)
Update the F field, over one timestep.
Definition: EvolveF.cpp:46
void EvolveG(std::unique_ptr< amrex::MultiFab > &Gfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, amrex::Real const dt)
Definition: EvolveG.cpp:40
amrex::Real m_dr
Definition: FiniteDifferenceSolver.H:216
void EvolveBPML(std::array< amrex::MultiFab *, 3 > Bfield, std::array< amrex::MultiFab *, 3 > const Efield, amrex::Real const dt, const bool dive_cleaning)
Update the B field, over one timestep.
Definition: EvolveBPML.cpp:43
void EvolveFPML(amrex::MultiFab *Ffield, std::array< amrex::MultiFab *, 3 > const Efield, amrex::Real const dt)
Update the E field, over one timestep.
Definition: EvolveFPML.cpp:42
amrex::Vector< amrex::Real > m_h_stencil_coefs_r
Definition: FiniteDifferenceSolver.H:219
amrex::Real m_rmin
Definition: FiniteDifferenceSolver.H:216
void EvolveBCylindrical(std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Bfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Efield, const int lev, amrex::Real const dt)
Definition: EvolveB.cpp:370
cell_size
Definition: compute_domain.py:37
int dt
Definition: stencil.py:440