aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp
diff options
context:
space:
mode:
authorGravatar Remi Lehe <remi.lehe@normalesup.org> 2019-04-20 22:53:00 -0700
committerGravatar Remi Lehe <remi.lehe@normalesup.org> 2019-04-23 12:43:53 -0700
commit80787133443c9adebdf6a9c6cdc6538bb2bcd2df (patch)
treefe6d97f6f86ad8f8030c7b5fcc5c23d16562d93d /Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp
parent7b0571362a6eb23427ea56b1d780378c6f7730d8 (diff)
downloadWarpX-80787133443c9adebdf6a9c6cdc6538bb2bcd2df.tar.gz
WarpX-80787133443c9adebdf6a9c6cdc6538bb2bcd2df.tar.zst
WarpX-80787133443c9adebdf6a9c6cdc6538bb2bcd2df.zip
Added shift function
Diffstat (limited to 'Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp')
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp55
1 files changed, 42 insertions, 13 deletions
diff --git a/Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp b/Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp
index 6e6115cec..94b1486af 100644
--- a/Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp
+++ b/Source/FieldSolver/SpectralSolver/SpectralKSpace.cpp
@@ -1,5 +1,6 @@
#include <WarpXConst.H>
#include <SpectralKSpace.H>
+#include <cmath>
using namespace amrex;
using namespace Gpu;
@@ -25,19 +26,19 @@ SpectralKSpace::SpectralKSpace( const BoxArray& realspace_ba,
// Allocate the components of the k vector: kx, ky (only in 3D), kz
for (int i_dim=0; i_dim<AMREX_SPACEDIM; i_dim++) {
- k_vec[i_dim] = AllocateAndFillKVector( dm, i_dim );
+ k_vec[i_dim] = AllocateAndFillKComponent( dm, i_dim );
}
}
-KVectorComponent&
-SpectralKSpace::AllocateAndFillKVector( const DistributionMapping& dm, const int i_dim ) const
+KVectorComponent
+SpectralKSpace::AllocateAndFillKComponent( const DistributionMapping& dm, const int i_dim ) const
{
- // Initialize an empty vector in each box
- KVectorComponent k_vec = KVectorComponent(spectralspace_ba, dm);
+ // Initialize an empty ManagedVector in each box
+ KVectorComponent k_comp = KVectorComponent(spectralspace_ba, dm);
// Loop over boxes
for ( MFIter mfi(spectralspace_ba, dm); mfi.isValid(); ++mfi ){
Box bx = spectralspace_ba[mfi];
- ManagedVector<Real>& k = k_vec[mfi];
+ ManagedVector<Real>& k = k_comp[mfi];
// Allocate k to the right size
int N = bx.length( i_dim );
@@ -62,19 +63,19 @@ SpectralKSpace::AllocateAndFillKVector( const DistributionMapping& dm, const int
// and distinguish the size of the local box and that of the global FFT
// This will also be different for the real-to-complex transform
}
- return k_vec;
+ return k_comp;
}
-KVectorComponent&
-SpectralKSpace::AllocateAndFillModifiedKVector(
+KVectorComponent
+SpectralKSpace::AllocateAndFillModifiedKComponent(
const DistributionMapping& dm, const int i_dim, const int order ) const
{
- // Initialize an empty vector in each box
- KVectorComponent modified_k_vec = KVectorComponent( spectralspace_ba, dm );
+ // Initialize an empty ManagedVector in each box
+ KVectorComponent modified_k_comp = KVectorComponent( spectralspace_ba, dm );
// Loop over boxes
for ( MFIter mfi(spectralspace_ba, dm); mfi.isValid(); ++mfi ){
const ManagedVector<Real>& k = k_vec[i_dim][mfi];
- ManagedVector<Real>& modified_k = modified_k_vec[mfi];
+ ManagedVector<Real>& modified_k = modified_k_comp[mfi];
// Allocate modified_k to the same size as k
modified_k.resize( k.size() );
@@ -86,5 +87,33 @@ SpectralKSpace::AllocateAndFillModifiedKVector(
modified_k[i] = k[i];
}
}
- return modified_k_vec;
+ return modified_k_comp;
+}
+
+SpectralShiftFactor
+SpectralKSpace::AllocateAndFillSpectralShiftFactor(
+ const DistributionMapping& dm, const int i_dim, const int shift_type ) const
+{
+ // Initialize an empty ManagedVector in each box
+ SpectralShiftFactor shift_factor = SpectralShiftFactor( spectralspace_ba, dm );
+ // Loop over boxes
+ for ( MFIter mfi(spectralspace_ba, dm); mfi.isValid(); ++mfi ){
+ const ManagedVector<Real>& k = k_vec[i_dim][mfi];
+ ManagedVector<Complex>& shift = shift_factor[mfi];
+
+ // Allocate shift coefficients
+ shift.resize( k.size() );
+
+ // Fill the shift coefficients
+ Real sign = 0;
+ switch (shift_type){
+ case ShiftType::CenteredToNodal: sign = -1.;
+ case ShiftType::NodalToCentered: sign = 1.;
+ }
+ constexpr Complex I{0,1};
+ for (int i=0; i<k.size(); i++ ){
+ shift[i] = std::exp( I*sign*k[i]*0.5*dx[i_dim] );
+ }
+ }
+ return shift_factor;
}