diff options
Diffstat (limited to 'Source/FieldSolver/FiniteDifferenceSolver/MacroscopicEvolveE.cpp')
-rw-r--r-- | Source/FieldSolver/FiniteDifferenceSolver/MacroscopicEvolveE.cpp | 91 |
1 files changed, 45 insertions, 46 deletions
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicEvolveE.cpp b/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicEvolveE.cpp index f2a0cc9c7..2647a1c08 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicEvolveE.cpp +++ b/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicEvolveE.cpp @@ -10,6 +10,7 @@ #include "MacroscopicProperties/MacroscopicProperties.H" #include "Utils/CoarsenIO.H" #include "Utils/WarpXAlgorithmSelection.H" +#include "Utils/WarpXUtil.H" #include "WarpX.H" #include <AMReX.H> @@ -36,12 +37,14 @@ 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, - amrex::Real const dt, std::unique_ptr<MacroscopicProperties> const& macroscopic_properties ) { + amrex::Real const dt, + std::unique_ptr<MacroscopicProperties> const& macroscopic_properties, int const lev) +{ // Select algorithm (The choice of algorithm is a runtime option, // but we compile code for each algorithm, using templates) #ifdef WARPX_DIM_RZ - amrex::ignore_unused(Efield, Bfield, Jfield, dt, macroscopic_properties); + amrex::ignore_unused(Efield, Bfield, Jfield, dt, macroscopic_properties, lev); amrex::Abort("currently macro E-push does not work for RZ"); #else if (m_do_nodal) { @@ -52,13 +55,13 @@ void FiniteDifferenceSolver::MacroscopicEvolveE ( if (WarpX::macroscopic_solver_algo == MacroscopicSolverAlgo::LaxWendroff) { MacroscopicEvolveECartesian <CartesianYeeAlgorithm, LaxWendroffAlgo> - ( Efield, Bfield, Jfield, dt, macroscopic_properties ); + ( Efield, Bfield, Jfield, dt, macroscopic_properties, lev ); } if (WarpX::macroscopic_solver_algo == MacroscopicSolverAlgo::BackwardEuler) { MacroscopicEvolveECartesian <CartesianYeeAlgorithm, BackwardEulerAlgo> - ( Efield, Bfield, Jfield, dt, macroscopic_properties ); + ( Efield, Bfield, Jfield, dt, macroscopic_properties, lev ); } @@ -69,12 +72,12 @@ void FiniteDifferenceSolver::MacroscopicEvolveE ( if (WarpX::macroscopic_solver_algo == MacroscopicSolverAlgo::LaxWendroff) { MacroscopicEvolveECartesian <CartesianCKCAlgorithm, LaxWendroffAlgo> - ( Efield, Bfield, Jfield, dt, macroscopic_properties ); + ( Efield, Bfield, Jfield, dt, macroscopic_properties, lev ); } else if (WarpX::macroscopic_solver_algo == MacroscopicSolverAlgo::BackwardEuler) { MacroscopicEvolveECartesian <CartesianCKCAlgorithm, BackwardEulerAlgo> - ( Efield, Bfield, Jfield, dt, macroscopic_properties ); + ( Efield, Bfield, Jfield, dt, macroscopic_properties, lev ); } @@ -93,21 +96,23 @@ void FiniteDifferenceSolver::MacroscopicEvolveECartesian ( 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, - amrex::Real const dt, std::unique_ptr<MacroscopicProperties> const& macroscopic_properties ) { + amrex::Real const dt, + std::unique_ptr<MacroscopicProperties> const& macroscopic_properties, int const lev) +{ - auto& sigma_mf = macroscopic_properties->getsigma_mf(); - auto& epsilon_mf = macroscopic_properties->getepsilon_mf(); - auto& mu_mf = macroscopic_properties->getmu_mf(); - - // Index type required for calling CoarsenIO::Interp to interpolate macroscopic - // properties from their respective staggering to the Ex, Ey, Ez locations - amrex::GpuArray<int, 3> const& sigma_stag = macroscopic_properties->sigma_IndexType; - amrex::GpuArray<int, 3> const& epsilon_stag = macroscopic_properties->epsilon_IndexType; amrex::GpuArray<int, 3> const& Ex_stag = macroscopic_properties->Ex_IndexType; amrex::GpuArray<int, 3> const& Ey_stag = macroscopic_properties->Ey_IndexType; amrex::GpuArray<int, 3> const& Ez_stag = macroscopic_properties->Ez_IndexType; - amrex::GpuArray<int, 3> const& macro_cr = macroscopic_properties->macro_cr_ratio; + amrex::GpuArray<int, 3> const& Bx_stag = macroscopic_properties->Bx_IndexType; + amrex::GpuArray<int, 3> const& By_stag = macroscopic_properties->By_IndexType; + amrex::GpuArray<int, 3> const& Bz_stag = macroscopic_properties->Bz_IndexType; + const auto getSigma = GetSigmaMacroparameter(); + const auto getEpsilon = GetEpsilonMacroparameter(); + const auto getMu = GetMuMacroparameter(); + auto &warpx = WarpX::GetInstance(); + const auto problo = warpx.Geom(lev).ProbLoArray(); + const auto dx = warpx.Geom(lev).CellSizeArray(); // Loop through the grids, and over the tiles within each grid #ifdef AMREX_USE_OMP @@ -126,11 +131,6 @@ void FiniteDifferenceSolver::MacroscopicEvolveECartesian ( Array4<Real> const& jy = Jfield[1]->array(mfi); Array4<Real> const& jz = Jfield[2]->array(mfi); - // material prop // - Array4<Real> const& sigma_arr = sigma_mf.array(mfi); - Array4<Real> const& eps_arr = epsilon_mf.array(mfi); - Array4<Real> const& mu_arr = mu_mf.array(mfi); - // Extract stencil coefficients Real const * const AMREX_RESTRICT coefs_x = m_stencil_coefs_x.dataPtr(); int const n_coefs_x = m_stencil_coefs_x.size(); @@ -139,27 +139,24 @@ void FiniteDifferenceSolver::MacroscopicEvolveECartesian ( Real const * const AMREX_RESTRICT coefs_z = m_stencil_coefs_z.dataPtr(); int const n_coefs_z = m_stencil_coefs_z.size(); - FieldAccessorMacroscopic const Hx(Bx, mu_arr); - FieldAccessorMacroscopic const Hy(By, mu_arr); - FieldAccessorMacroscopic const Hz(Bz, mu_arr); + FieldAccessorMacroscopic<GetMuMacroparameter> const Hx(Bx, getMu, Bx_stag, problo, dx); + FieldAccessorMacroscopic<GetMuMacroparameter> const Hy(By, getMu, By_stag, problo, dx); + FieldAccessorMacroscopic<GetMuMacroparameter> const Hz(Bz, getMu, Bz_stag, problo, dx); // Extract tileboxes for which to loop Box const& tex = mfi.tilebox(Efield[0]->ixType().toIntVect()); Box const& tey = mfi.tilebox(Efield[1]->ixType().toIntVect()); Box const& tez = mfi.tilebox(Efield[2]->ixType().toIntVect()); - // starting component to interpolate macro properties to Ex, Ey, Ez locations - const int scomp = 0; // Loop over the cells and update the fields amrex::ParallelFor(tex, tey, tez, [=] AMREX_GPU_DEVICE (int i, int j, int k){ - //// Interpolate conductivity, sigma, to Ex position on the grid - amrex::Real const sigma_interp = CoarsenIO::Interp( sigma_arr, sigma_stag, - Ex_stag, macro_cr, i, j, k, scomp); - // Interpolated permittivity, epsilon, to Ex position on the grid - amrex::Real const epsilon_interp = CoarsenIO::Interp( eps_arr, epsilon_stag, - Ex_stag, macro_cr, i, j, k, scomp); - amrex::Real alpha = T_MacroAlgo::alpha( sigma_interp, epsilon_interp, dt); - amrex::Real beta = T_MacroAlgo::beta( sigma_interp, epsilon_interp, dt); + amrex::Real x, y, z; + WarpXUtilAlgo::getCellCoordinates (i, j, k, Ex_stag, problo, dx, + x, y, z ); + amrex::Real const sigma = getSigma(x, y, z); + amrex::Real const epsilon = getEpsilon(x, y, z); + amrex::Real alpha = T_MacroAlgo::alpha( sigma, epsilon, dt); + amrex::Real beta = T_MacroAlgo::beta( sigma, epsilon, dt); Ex(i, j, k) = alpha * Ex(i, j, k) + beta * ( - T_Algo::DownwardDz(Hy, coefs_z, n_coefs_z, i, j, k,0) + T_Algo::DownwardDy(Hz, coefs_y, n_coefs_y, i, j, k,0) @@ -167,12 +164,13 @@ void FiniteDifferenceSolver::MacroscopicEvolveECartesian ( }, [=] AMREX_GPU_DEVICE (int i, int j, int k){ - amrex::Real const sigma_interp = CoarsenIO::Interp( sigma_arr, sigma_stag, - Ey_stag, macro_cr, i, j, k, scomp); - amrex::Real const epsilon_interp = CoarsenIO::Interp( eps_arr, epsilon_stag, - Ey_stag, macro_cr, i, j, k, scomp); - amrex::Real alpha = T_MacroAlgo::alpha( sigma_interp, epsilon_interp, dt); - amrex::Real beta = T_MacroAlgo::beta( sigma_interp, epsilon_interp, dt); + amrex::Real x, y, z; + WarpXUtilAlgo::getCellCoordinates (i, j, k, Ey_stag, problo, dx, + x, y, z ); + amrex::Real const sigma = getSigma(x, y, z); + amrex::Real const epsilon = getEpsilon(x, y, z); + amrex::Real alpha = T_MacroAlgo::alpha( sigma, epsilon, dt); + amrex::Real beta = T_MacroAlgo::beta( sigma, epsilon, dt); Ey(i, j, k) = alpha * Ey(i, j, k) + beta * ( - T_Algo::DownwardDx(Hz, coefs_x, n_coefs_x, i, j, k,0) @@ -181,12 +179,13 @@ void FiniteDifferenceSolver::MacroscopicEvolveECartesian ( }, [=] AMREX_GPU_DEVICE (int i, int j, int k){ - amrex::Real const sigma_interp = CoarsenIO::Interp( sigma_arr, sigma_stag, - Ez_stag, macro_cr, i, j, k, scomp); - amrex::Real const epsilon_interp = CoarsenIO::Interp( eps_arr, epsilon_stag, - Ez_stag, macro_cr, i, j, k, scomp); - amrex::Real alpha = T_MacroAlgo::alpha( sigma_interp, epsilon_interp, dt); - amrex::Real beta = T_MacroAlgo::beta( sigma_interp, epsilon_interp, dt); + amrex::Real x, y, z; + WarpXUtilAlgo::getCellCoordinates (i, j, k, Ez_stag, problo, dx, + x, y, z ); + amrex::Real const sigma = getSigma(x, y, z); + amrex::Real const epsilon = getEpsilon(x, y, z); + amrex::Real alpha = T_MacroAlgo::alpha( sigma, epsilon, dt); + amrex::Real beta = T_MacroAlgo::beta( sigma, epsilon, dt); Ez(i, j, k) = alpha * Ez(i, j, k) + beta * ( - T_Algo::DownwardDy(Hx, coefs_y, n_coefs_y, i, j, k,0) |