diff options
Diffstat (limited to 'Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PMLPsatdAlgorithmRZ.cpp')
-rw-r--r-- | Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PMLPsatdAlgorithmRZ.cpp | 177 |
1 files changed, 0 insertions, 177 deletions
diff --git a/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PMLPsatdAlgorithmRZ.cpp b/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PMLPsatdAlgorithmRZ.cpp deleted file mode 100644 index 892c542c7..000000000 --- a/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PMLPsatdAlgorithmRZ.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright 2021 David Grote - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#include "PMLPsatdAlgorithmRZ.H" -#include "FieldSolver/SpectralSolver/SpectralHankelTransform/HankelTransform.H" -#include "Utils/WarpXConst.H" -#include "Utils/WarpXProfilerWrapper.H" -#include "WarpX.H" - -#include <cmath> - -using amrex::operator""_rt; - - -/* \brief Initialize coefficients for the update equation */ -PMLPsatdAlgorithmRZ::PMLPsatdAlgorithmRZ (SpectralKSpaceRZ const & spectral_kspace, - amrex::DistributionMapping const & dm, - const SpectralFieldIndex& spectral_index, - int const n_rz_azimuthal_modes, int const norder_z, - bool const nodal, amrex::Real const dt) - // Initialize members of base class - : SpectralBaseAlgorithmRZ(spectral_kspace, dm, spectral_index, norder_z, nodal), - m_spectral_index(spectral_index), - m_dt(dt) -{ - // Allocate the arrays of coefficients - amrex::BoxArray const & ba = spectral_kspace.spectralspace_ba; - C_coef = SpectralRealCoefficients(ba, dm, n_rz_azimuthal_modes, 0); - S_ck_coef = SpectralRealCoefficients(ba, dm, n_rz_azimuthal_modes, 0); - - coefficients_initialized = false; -} - -/* Advance the E and B field in spectral space (stored in `f`) - * over one time step */ -void -PMLPsatdAlgorithmRZ::pushSpectralFields (SpectralFieldDataRZ & f) -{ - - if (not coefficients_initialized) { - // This is called from here since it needs the kr values - // which can be obtained from the SpectralFieldDataRZ - InitializeSpectralCoefficients(f); - coefficients_initialized = true; - } - - const SpectralFieldIndex& Idx = m_spectral_index; - - // Loop over boxes - for (amrex::MFIter mfi(f.fields); mfi.isValid(); ++mfi){ - - amrex::Box const & bx = f.fields[mfi].box(); - - // Extract arrays for the fields to be updated - amrex::Array4<Complex> const& fields = f.fields[mfi].array(); - // Extract arrays for the coefficients - amrex::Array4<const amrex::Real> const& C_arr = C_coef[mfi].array(); - amrex::Array4<const amrex::Real> const& S_ck_arr = S_ck_coef[mfi].array(); - - // Extract pointers for the k vectors - HankelTransform::RealVector const & kr_modes = f.getKrArray(mfi); - amrex::Real const* kr_arr = kr_modes.dataPtr(); - int const nr = bx.length(0); - - // Loop over indices within one box - // Note that k = 0 - int const modes = f.n_rz_azimuthal_modes; - amrex::ParallelFor(bx, modes, - [=] AMREX_GPU_DEVICE(int i, int j, int k, int mode) noexcept - { - - // All of the fields of each mode are grouped together - int const Ep_m_pml = Idx.Er_pml + Idx.n_fields*mode; - int const Em_m_pml = Idx.Et_pml + Idx.n_fields*mode; - int const Bp_m_pml = Idx.Br_pml + Idx.n_fields*mode; - int const Bm_m_pml = Idx.Bt_pml + Idx.n_fields*mode; - int const Ez_m = Idx.Ez + Idx.n_fields*mode; - int const Bz_m = Idx.Bz + Idx.n_fields*mode; - - // Record old values of the fields to be updated - Complex const Ep_old_pml = fields(i,j,k,Ep_m_pml); - Complex const Em_old_pml = fields(i,j,k,Em_m_pml); - Complex const Bp_old_pml = fields(i,j,k,Bp_m_pml); - Complex const Bm_old_pml = fields(i,j,k,Bm_m_pml); - Complex const Ez_old = fields(i,j,k,Ez_m); - Complex const Bz_old = fields(i,j,k,Bz_m); - - // k vector values, and coefficients - // The k values for each mode are grouped together - int const ir = i + nr*mode; - amrex::Real const kr = kr_arr[ir]; - - constexpr amrex::Real c2 = PhysConst::c*PhysConst::c; - Complex const I = Complex{0._rt,1._rt}; - amrex::Real const C = C_arr(i,j,k,mode); - amrex::Real const S_ck = S_ck_arr(i,j,k,mode); - - // Update E (see WarpX online documentation: theory section) - fields(i,j,k,Ep_m_pml) = C*Ep_old_pml - + S_ck*(-c2*I*kr/2._rt*Bz_old); - fields(i,j,k,Em_m_pml) = C*Em_old_pml - + S_ck*(-c2*I*kr/2._rt*Bz_old); - // Update B (see WarpX online documentation: theory section) - fields(i,j,k,Bp_m_pml) = C*Bp_old_pml - - S_ck*(-I*kr/2._rt*Ez_old); - fields(i,j,k,Bm_m_pml) = C*Bm_old_pml - - S_ck*(-I*kr/2._rt*Ez_old); - - }); - } -} - -void PMLPsatdAlgorithmRZ::InitializeSpectralCoefficients (SpectralFieldDataRZ const & f) -{ - - // Fill them with the right values: - // Loop over boxes and allocate the corresponding coefficients - // for each box owned by the local MPI proc - for (amrex::MFIter mfi(f.fields); mfi.isValid(); ++mfi){ - - amrex::Box const & bx = f.fields[mfi].box(); - - // Extract pointers for the k vectors - amrex::Real const* const modified_kz = modified_kz_vec[mfi].dataPtr(); - - // Extract arrays for the coefficients - amrex::Array4<amrex::Real> const& C = C_coef[mfi].array(); - amrex::Array4<amrex::Real> const& S_ck = S_ck_coef[mfi].array(); - - HankelTransform::RealVector const & kr_modes = f.getKrArray(mfi); - amrex::Real const* kr_arr = kr_modes.dataPtr(); - int const nr = bx.length(0); - amrex::Real const dt = m_dt; - - // Loop over indices within one box - int const modes = f.n_rz_azimuthal_modes; - amrex::ParallelFor(bx, modes, - [=] AMREX_GPU_DEVICE(int i, int j, int k, int mode) noexcept - { - // Calculate norm of vector - int const ir = i + nr*mode; - amrex::Real const kr = kr_arr[ir]; - amrex::Real const kz = modified_kz[j]; - amrex::Real const k_norm = std::sqrt(kr*kr + kz*kz); - - // Calculate coefficients - constexpr amrex::Real c = PhysConst::c; - if (k_norm != 0._rt){ - C(i,j,k,mode) = std::cos(c*k_norm*dt); - S_ck(i,j,k,mode) = std::sin(c*k_norm*dt)/(c*k_norm); - } else { // Handle k_norm = 0, by using the analytical limit - C(i,j,k,mode) = 1._rt; - S_ck(i,j,k,mode) = dt; - } - }); - } -} - -void -PMLPsatdAlgorithmRZ::CurrentCorrection (const int /* lev */, - SpectralFieldDataRZ& /* field_data */, - std::array<std::unique_ptr<amrex::MultiFab>,3>& /* current */, - const std::unique_ptr<amrex::MultiFab>& /* rho */) -{ - amrex::Abort("Current correction not implemented in RZ geometry PML"); -} - -void -PMLPsatdAlgorithmRZ::VayDeposition (const int /* lev */, - SpectralFieldDataRZ& /*field_data*/, - std::array<std::unique_ptr<amrex::MultiFab>,3>& /*current*/) -{ - amrex::Abort("Vay deposition not implemented in RZ geometry PML"); -} |