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,
210 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
224 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
238 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
246#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
254#elif defined(WARPX_DIM_RSPHERE)
273#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
274 template<
typename T_Algo >
281 template<
typename T_Algo >
286 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
291 template<
typename T_Algo >
299 template<
typename T_Algo >
305 template<
typename T_Algo>
313 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
315 bool solve_for_Faraday );
317 template<
typename T_Algo>
321 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
325 template<
typename T_Algo>
329 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
333 template<
typename T_Algo>
337 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
341 template<
typename T_Algo>
345 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
349 template<
typename T_Algo>
353 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
357#elif defined(WARPX_DIM_RSPHERE)
358 template<
typename T_Algo >
359 void EvolveBSpherical (
365 template<
typename T_Algo >
366 void EvolveESpherical (
374 template<
typename T_Algo >
375 void EvolveFSpherical (
382 template<
typename T_Algo >
383 void ComputeDivESpherical (
388 template<
typename T_Algo>
389 void HybridPICSolveESpherical (
397 bool solve_for_Faraday );
399 template<
typename T_Algo>
400 void CalculateCurrentAmpereSpherical (
406 template<
typename T_Algo>
407 void ComputeCurlASpherical (
410 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
414 template<
typename T_Algo>
415 void ComputeGradientSpherical (
418 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
422 template<
typename T_Algo>
423 void ComputeLaplacianSpherical (
426 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
430 template<
typename T_Algo>
431 void ComputeVectorLaplacianSpherical (
434 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
439 template<
typename T_Algo >
440 void EvolveBCartesian (
446 template<
typename T_Algo >
447 void EvolveECartesian (
451 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
455 template<
typename T_Algo >
456 void EvolveFCartesian (
463 template<
typename T_Algo >
464 void EvolveGCartesian (
469 void EvolveRhoCartesianECT (
475 void EvolveBCartesianECT (
481 std::array< std::unique_ptr<amrex::iMultiFab>, 3 >& flag_info_cell,
486 template<
typename T_Algo >
487 void ComputeDivECartesian (
491 template<
typename T_Algo,
typename T_MacroAlgo >
492 void MacroscopicEvolveECartesian (
496 std::array< std::unique_ptr<amrex::iMultiFab>,3 >
const& eb_update_E,
498 std::unique_ptr<MacroscopicProperties>
const& macroscopic_properties);
500 template<
typename T_Algo >
501 void EvolveBPMLCartesian (
502 std::array< amrex::MultiFab*, 3 > Bfield,
507 template<
typename T_Algo >
508 void EvolveEPMLCartesian (
510 std::array< amrex::MultiFab*, 3 > Bfield,
511 std::array< amrex::MultiFab*, 3 > Jfield,
512 std::array< amrex::MultiFab*, 3 > edge_lengths,
517 template<
typename T_Algo >
522 template<
typename T_Algo>
523 void HybridPICSolveECartesian (
530 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
532 bool solve_for_Faraday );
534 template<
typename T_Algo>
535 void CalculateCurrentAmpereCartesian (
538 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_E,
542 template<
typename T_Algo>
543 void ComputeCurlACartesian (
546 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update_B,
550 template<
typename T_Algo>
551 void ComputeGradientCartesian (
554 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
558 template<
typename T_Algo>
559 void ComputeLaplacianCartesian (
562 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
566 template<
typename T_Algo>
567 void ComputeVectorLaplacianCartesian (
570 std::array< std::unique_ptr<amrex::iMultiFab>,3>
const& eb_update,
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:248
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 ComputeGradient(ablastr::fields::VectorField &out_field, ablastr::fields::ScalarField const &in_field, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update, int lev)
Calculation of the gradient of the given scalar field.
Definition ComputeGradient.cpp:26
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:244
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 ComputeGradientCylindrical(ablastr::fields::VectorField &out_field, ablastr::fields::ScalarField const &in_field, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update, int lev)
Calculation of the gradient of the given scalar field.
Definition ComputeGradient.cpp:67
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:78
void EvolveFPML(amrex::MultiFab *Ffield, ablastr::fields::VectorField Efield, amrex::Real dt)
Update the E field, over one timestep.
Definition EvolveFPML.cpp:40
void ComputeLaplacian(ablastr::fields::ScalarField &out_field, ablastr::fields::ScalarField const &in_field, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update, int lev)
Calculation of the Laplacian of the given scalar field.
Definition ComputeLaplacian.cpp:26
void EvolveFCylindrical(amrex::MultiFab *Ffield, ablastr::fields::VectorField const &Efield, amrex::MultiFab *rhofield, int rho_comp, amrex::Real dt)
Definition EvolveF.cpp:144
void ComputeVectorLaplacianCylindrical(ablastr::fields::VectorField &out_field, ablastr::fields::VectorField const &in_field, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update, int lev)
Calculation of the vector Laplacian of the given vector field.
Definition ComputeLaplacian.cpp:209
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:253
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 ComputeVectorLaplacian(ablastr::fields::VectorField &out_field, ablastr::fields::VectorField const &in_field, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update, int lev)
Calculation of the vector Laplacian of the given vector field.
Definition ComputeLaplacian.cpp:168
void ComputeLaplacianCylindrical(ablastr::fields::ScalarField &out_field, ablastr::fields::ScalarField const &in_field, std::array< std::unique_ptr< amrex::iMultiFab >, 3 > const &eb_update, int lev)
Calculation of the Laplacian of the given scalar field.
Definition ComputeLaplacian.cpp:67
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:250
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_r
Definition FiniteDifferenceSolver.H:252
void EvolveG(amrex::MultiFab *Gfield, ablastr::fields::VectorField const &Bfield, amrex::Real dt)
Definition EvolveG.cpp:38
amrex::Real m_dr
Definition FiniteDifferenceSolver.H:247
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:250
amrex::Real m_rmin
Definition FiniteDifferenceSolver.H:247
ElectromagneticSolverAlgo m_fdtd_algo
Definition FiniteDifferenceSolver.H:243
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
PODVector< T, ArenaAllocator< T > > DeviceVector
Definition EffectivePotentialPoissonSolver.H:63
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:191
amrex::MultiFab * ScalarField
Definition MultiFabRegister.H:180
GridType
Definition Enums.H:23
PatchType
Definition Enums.H:30
Definition MultiFabRegister.H:262