aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H
diff options
context:
space:
mode:
Diffstat (limited to 'Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H')
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H83
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
};