ARTEMIS
|
Top-level class for the electromagnetic finite-difference solver. More...
#include <FiniteDifferenceSolver.H>
Public Member Functions | |
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) More... | |
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. More... | |
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. More... | |
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. More... | |
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. More... | |
void | EvolveG (std::unique_ptr< amrex::MultiFab > &Gfield, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &Bfield, amrex::Real const dt) |
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. More... | |
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. More... | |
void | ComputeDivE (const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, amrex::MultiFab &divE) |
Update the F field, over one timestep. More... | |
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 macroscopic sigma-method defined in WarpXAlgorithmSelection.H. More... | |
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. More... | |
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. More... | |
void | EvolveFPML (amrex::MultiFab *Ffield, std::array< amrex::MultiFab *, 3 > const Efield, amrex::Real const dt) |
Update the E field, over one timestep. More... | |
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. More... | |
template<typename T_Algo > | |
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) |
template<typename T_Algo > | |
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) |
template<typename T_Algo > | |
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) |
template<typename T_Algo > | |
void | ComputeDivECylindrical (const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, amrex::MultiFab &divE) |
Private Attributes | |
int | m_fdtd_algo |
short | m_grid_type |
amrex::Real | m_dr |
amrex::Real | m_rmin |
int | m_nmodes |
amrex::Vector< amrex::Real > | m_h_stencil_coefs_r |
amrex::Vector< amrex::Real > | m_h_stencil_coefs_z |
amrex::Gpu::DeviceVector< amrex::Real > | m_stencil_coefs_r |
amrex::Gpu::DeviceVector< amrex::Real > | m_stencil_coefs_z |
Top-level class for the electromagnetic finite-difference solver.
Stores the coefficients of the finite-difference stencils, and has member functions to update fields over one time step.
FiniteDifferenceSolver::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)
This function initializes the stencil coefficients for the chosen finite-difference algorithm
fdtd_algo | Identifies the chosen algorithm, as defined in WarpXAlgorithmSelection.H |
cell_size | Cell size along each dimension, for the chosen refinement level |
grid_type | Whether the solver is applied to a collocated or staggered grid |
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::ComputeDivE | ( | const std::array< std::unique_ptr< amrex::MultiFab >, 3 > & | Efield, |
amrex::MultiFab & | divE | ||
) |
Update the F field, over one timestep.
void FiniteDifferenceSolver::ComputeDivECylindrical | ( | const std::array< std::unique_ptr< amrex::MultiFab >, 3 > & | Efield, |
amrex::MultiFab & | divE | ||
) |
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::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 | ||
) |
void FiniteDifferenceSolver::EvolveBLondon | ( | std::array< std::unique_ptr< amrex::MultiFab >, 3 > & | Bfield, |
std::array< std::unique_ptr< amrex::MultiFab >, 3 > const & | current, | ||
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.
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::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 | ||
) |
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::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.
void FiniteDifferenceSolver::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 | ||
) |
void FiniteDifferenceSolver::EvolveFPML | ( | amrex::MultiFab * | Ffield, |
std::array< amrex::MultiFab *, 3 > const | Efield, | ||
amrex::Real const | dt | ||
) |
Update the E field, over one timestep.
void FiniteDifferenceSolver::EvolveG | ( | std::unique_ptr< amrex::MultiFab > & | Gfield, |
std::array< std::unique_ptr< amrex::MultiFab >, 3 > const & | Bfield, | ||
amrex::Real const | dt | ||
) |
void FiniteDifferenceSolver::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 & | macroscopic_properties | ||
) |
Macroscopic E-update for non-vacuum medium using the user-selected finite-difference algorithm and macroscopic sigma-method defined in WarpXAlgorithmSelection.H.
[out] | Efield | vector of electric field MultiFabs updated at a given level |
[in] | Bfield | vector of magnetic field MultiFabs at a given level |
[in] | Jfield | vector of current density MultiFabs at a given level |
[in] | edge_lengths | length of edges along embedded boundaries |
[in] | dt | timestep of the simulation |
[in] | macroscopic_properties | contains user-defined properties of the medium. |
void FiniteDifferenceSolver::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 & | macroscopic_properties, | ||
amrex::MultiFab *const | eps_mf, | ||
amrex::MultiFab *const | mu_mf, | ||
amrex::MultiFab *const | sigma_mf | ||
) |
Update the E field, over one timestep.
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |