11#ifndef WARPX_FINITE_DIFFERENCE_SOLVER_H_
12#define WARPX_FINITE_DIFFERENCE_SOLVER_H_
54 std::array<amrex::Real,3> cell_size,
60 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
68 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
118 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
120 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
136 bool pml_has_particles
165 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
167 bool solve_for_Faraday );
181 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
196 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
204#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
212#elif defined(WARPX_DIM_RSPHERE)
231#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
232 template<
typename T_Algo >
239 template<
typename T_Algo >
244 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
249 template<
typename T_Algo >
257 template<
typename T_Algo >
263 template<
typename T_Algo>
271 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
273 bool solve_for_Faraday );
275 template<
typename T_Algo>
279 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
283 template<
typename T_Algo>
287 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
291#elif defined(WARPX_DIM_RSPHERE)
292 template<
typename T_Algo >
293 void EvolveBSpherical (
299 template<
typename T_Algo >
300 void EvolveESpherical (
308 template<
typename T_Algo >
309 void EvolveFSpherical (
316 template<
typename T_Algo >
317 void ComputeDivESpherical (
322 template<
typename T_Algo>
323 void HybridPICSolveESpherical (
331 bool solve_for_Faraday );
333 template<
typename T_Algo>
334 void CalculateCurrentAmpereSpherical (
340 template<
typename T_Algo>
341 void ComputeCurlASpherical (
344 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
349 template<
typename T_Algo >
350 void EvolveBCartesian (
354 int lev, amrex::Real dt );
356 template<
typename T_Algo >
357 void EvolveECartesian (
361 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
363 int lev, amrex::Real dt );
365 template<
typename T_Algo >
366 void EvolveFCartesian (
373 template<
typename T_Algo >
374 void EvolveGCartesian (
379 void EvolveRhoCartesianECT (
385 void EvolveBCartesianECT (
391 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
393 int lev, amrex::Real dt
396 template<
typename T_Algo >
397 void ComputeDivECartesian (
401 template<
typename T_Algo,
typename T_MacroAlgo >
402 void MacroscopicEvolveECartesian (
406 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
408 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
410 template<
typename T_Algo >
411 void EvolveBPMLCartesian (
412 std::array< amrex::MultiFab*, 3 > Bfield,
417 template<
typename T_Algo >
418 void EvolveEPMLCartesian (
420 std::array< amrex::MultiFab*, 3 > Bfield,
421 std::array< amrex::MultiFab*, 3 > Jfield,
422 std::array< amrex::MultiFab*, 3 > edge_lengths,
425 amrex::Real dt,
bool pml_has_particles );
427 template<
typename T_Algo >
432 template<
typename T_Algo>
433 void HybridPICSolveECartesian (
440 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
442 bool solve_for_Faraday );
444 template<
typename T_Algo>
445 void CalculateCurrentAmpereCartesian (
448 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
452 template<
typename T_Algo>
453 void ComputeCurlACartesian (
456 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
ElectromagneticSolverAlgo
Definition WarpXAlgorithmSelection.H:58
MacroscopicSolverAlgo
struct to select algorithm for macroscopic Maxwell solver LaxWendroff (semi-implicit) represents sigm...
Definition WarpXAlgorithmSelection.H:48
void ComputeDivE(ablastr::fields::VectorField const &Efield, amrex::MultiFab &divE)
Update the F field, over one timestep.
Definition ComputeDivE.cpp:46
int m_nmodes
Definition FiniteDifferenceSolver.H:206
void ComputeCurlA(ablastr::fields::VectorField &Bfield, ablastr::fields::VectorField const &Afield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_B, int lev)
Calculation of B field from the vector potential A B = (curl x A) / mu0.
Definition ComputeCurlA.cpp:27
void EvolveB(ablastr::fields::MultiFabRegister &fields, int lev, PatchType patch_type, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > &flag_info_cell, std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > &borrowing, amrex::Real dt)
Update the B field, over one timestep.
Definition EvolveB.cpp:53
ablastr::utils::enums::GridType m_grid_type
Definition FiniteDifferenceSolver.H:202
FiniteDifferenceSolver(ElectromagneticSolverAlgo 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:32
void EvolveECTRho(ablastr::fields::VectorField const &Efield, ablastr::fields::VectorField const &edge_lengths, ablastr::fields::VectorField const &face_areas, ablastr::fields::VectorField const &ECTRhofield, int lev)
Update the B field, over one timestep.
Definition EvolveECTRho.cpp:48
void EvolveE(ablastr::fields::MultiFabRegister &fields, int lev, PatchType patch_type, ablastr::fields::VectorField const &Efield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, amrex::Real dt)
Update the E field, over one timestep.
Definition EvolveE.cpp:55
void EvolveBCylindrical(ablastr::fields::VectorField const &Bfield, ablastr::fields::VectorField const &Efield, int lev, amrex::Real dt)
Definition EvolveB.cpp:394
void EvolveF(amrex::MultiFab *Ffield, ablastr::fields::VectorField const &Efield, amrex::MultiFab *rhofield, int rho_comp, amrex::Real dt)
Update the F field, over one timestep.
Definition EvolveF.cpp:48
void HybridPICSolveE(ablastr::fields::VectorField const &Efield, ablastr::fields::VectorField &Jfield, ablastr::fields::VectorField const &Jifield, ablastr::fields::VectorField const &Bfield, amrex::MultiFab const &rhofield, amrex::MultiFab const &Pefield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, int lev, HybridPICModel const *hybrid_model, bool solve_for_Faraday)
E-update in the hybrid PIC algorithm as described in Winske et al. (2003) Eq. 10. https://link....
Definition HybridPICSolveE.cpp:484
void EvolveEPML(ablastr::fields::MultiFabRegister &fields, PatchType patch_type, int level, MultiSigmaBox const &sigba, amrex::Real dt, bool pml_has_particles)
Update the E field, over one timestep.
Definition EvolveEPML.cpp:46
void ComputeCurlACylindrical(ablastr::fields::VectorField &Bfield, ablastr::fields::VectorField const &Afield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_B, int lev)
Calculate B from the curl of A i.e. B = curl(A) output field on B field mesh staggering.
Definition ComputeCurlA.cpp:77
void EvolveFPML(amrex::MultiFab *Ffield, ablastr::fields::VectorField Efield, amrex::Real dt)
Update the E field, over one timestep.
Definition EvolveFPML.cpp:40
void EvolveFCylindrical(amrex::MultiFab *Ffield, ablastr::fields::VectorField const &Efield, amrex::MultiFab *rhofield, int rho_comp, amrex::Real dt)
Definition EvolveF.cpp:144
void MacroscopicEvolveE(MacroscopicSolverAlgo macroscopic_solver_algo, ablastr::fields::VectorField const &Efield, ablastr::fields::VectorField const &Bfield, ablastr::fields::VectorField const &Jfield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, 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:38
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_z
Definition FiniteDifferenceSolver.H:211
void HybridPICSolveECylindrical(ablastr::fields::VectorField const &Efield, ablastr::fields::VectorField const &Jfield, ablastr::fields::VectorField const &Jifield, ablastr::fields::VectorField const &Bfield, amrex::MultiFab const &rhofield, amrex::MultiFab const &Pefield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, int lev, HybridPICModel const *hybrid_model, bool solve_for_Faraday)
Definition HybridPICSolveE.cpp:534
void EvolveBPML(ablastr::fields::MultiFabRegister &fields, PatchType patch_type, int level, amrex::Real dt, bool dive_cleaning)
Update the B field, over one timestep.
Definition EvolveBPML.cpp:42
amrex::Vector< amrex::Real > m_h_stencil_coefs_z
Definition FiniteDifferenceSolver.H:208
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_r
Definition FiniteDifferenceSolver.H:210
void EvolveG(amrex::MultiFab *Gfield, ablastr::fields::VectorField const &Bfield, amrex::Real dt)
Definition EvolveG.cpp:38
amrex::Real m_dr
Definition FiniteDifferenceSolver.H:205
void ComputeDivECylindrical(ablastr::fields::VectorField const &Efield, amrex::MultiFab &divE)
Definition ComputeDivE.cpp:136
void ApplySilverMuellerBoundary(ablastr::fields::VectorField &Efield, ablastr::fields::VectorField &Bfield, amrex::Box domain_box, amrex::Real dt, amrex::Array< FieldBoundaryType, 3 > field_boundary_lo, amrex::Array< FieldBoundaryType, 3 > field_boundary_hi)
Update the B field at the boundary, using the Silver-Mueller condition.
Definition ApplySilverMuellerBoundary.cpp:37
amrex::Vector< amrex::Real > m_h_stencil_coefs_r
Definition FiniteDifferenceSolver.H:208
amrex::Real m_rmin
Definition FiniteDifferenceSolver.H:205
ElectromagneticSolverAlgo m_fdtd_algo
Definition FiniteDifferenceSolver.H:201
void CalculateCurrentAmpereCylindrical(ablastr::fields::VectorField &Jfield, ablastr::fields::VectorField const &Bfield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, int lev)
Calculate total current from Ampere's law without displacement current i.e. J = 1/mu_0 curl x B.
Definition HybridPICSolveE.cpp:80
void EvolveECylindrical(ablastr::fields::VectorField const &Efield, ablastr::fields::VectorField const &Bfield, ablastr::fields::VectorField const &Jfield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, amrex::MultiFab const *Ffield, int lev, amrex::Real dt)
Definition EvolveE.cpp:240
void CalculateCurrentAmpere(ablastr::fields::VectorField &Jfield, ablastr::fields::VectorField const &Bfield, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update_E, int lev)
Calculation of total current using Ampere's law (without displacement current): J = (curl x B) / mu0.
Definition HybridPICSolveE.cpp:31
This class contains the parameters needed to evaluate hybrid field solutions (kinetic ions with fluid...
Definition HybridPICModel.H:41
Definition EffectivePotentialPoissonSolver.H:63
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:191
GridType
Definition Enums.H:23
PatchType
Definition Enums.H:30
PODVector< T, ArenaAllocator< T > > DeviceVector
Definition MultiFabRegister.H:262