diff options
Diffstat (limited to 'Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H')
-rw-r--r-- | Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H index aecf4ed9e..aec2bd330 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H +++ b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H @@ -12,6 +12,8 @@ #include "FiniteDifferenceSolver_fwd.H" #include "BoundaryConditions/PML_fwd.H" +#include "Evolve/WarpXDtType.H" +#include "HybridPICModel/HybridPICModel_fwd.H" #include "MacroscopicProperties/MacroscopicProperties_fwd.H" #include <AMReX_GpuContainers.H> @@ -129,6 +131,46 @@ class FiniteDifferenceSolver std::array< amrex::MultiFab*, 3 > const Efield, amrex::Real const dt ); + /** + * \brief E-update in the hybrid PIC algorithm as described in + * Winske et al. (2003) Eq. 10. + * https://link.springer.com/chapter/10.1007/3-540-36530-3_8 + * + * \param[out] Efield vector of electric field MultiFabs updated at a given level + * \param[in] Jfield vector of total current MultiFabs at a given level + * \param[in] Jifield vector of ion current density MultiFabs at a given level + * \param[in] Bfield vector of magnetic field MultiFabs at a given level + * \param[in] rhofield scalar ion charge density Multifab at a given level + * \param[in] Pefield scalar electron pressure MultiFab at a given level + * \param[in] edge_lengths length of edges along embedded boundaries + * \param[in] lev level number for the calculation + * \param[in] hybrid_pic_model instance of the hybrid-PIC model + */ + 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& 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_pic_model, + DtType a_dt_type ); + + /** + * \brief Calculation of total current using Ampere's law (without + * displacement current): J = (curl x B) / mu0. + * + * \param[out] Jfield vector of current MultiFabs at a given level + * \param[in] Bfield vector of magnetic field MultiFabs at a given level + * \param[in] edge_lengths length of edges along embedded boundaries + * \param[in] lev level number for the calculation + */ + 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 ); + private: int m_fdtd_algo; @@ -184,6 +226,27 @@ class FiniteDifferenceSolver void ComputeDivECylindrical ( const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield, amrex::MultiFab& divE ); + + template<typename T_Algo> + 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& 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_pic_model, + DtType a_dt_type ); + + template<typename T_Algo> + 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 + ); + #else template< typename T_Algo > void EvolveBCartesian ( @@ -267,6 +330,26 @@ class FiniteDifferenceSolver void EvolveFPMLCartesian ( amrex::MultiFab* Ffield, std::array< amrex::MultiFab*, 3 > const Efield, amrex::Real const dt ); + + template<typename T_Algo> + void HybridPICSolveECartesian ( + 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& 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_pic_model, + DtType a_dt_type ); + + template<typename T_Algo> + void CalculateCurrentAmpereCartesian ( + 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 + ); #endif }; |