aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp')
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp63
1 files changed, 62 insertions, 1 deletions
diff --git a/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp b/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
index 02fa2015f..5998bdd2b 100644
--- a/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
+++ b/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
@@ -54,6 +54,25 @@ SpectralFieldData::SpectralFieldData( const BoxArray& realspace_ba,
IntVect fft_size = realspace_ba[mfi].length();
#ifdef AMREX_USE_GPU
// Add cuFFT-specific code
+ // Creating 3D plan for real to complex -- double precision
+ cudaDeviceSynchronize();
+ cufftResult result;
+ result = cufftPlan3d( &forward_plan[mfi], fft_size[2],
+ fft_size[1],fft_size[0], CUFFT_D2Z);
+ if ( result != CUFFT_SUCCESS ) {
+ amrex::Print() << " cufftplan3d forward failed! \n";
+ }
+ // Add 2D cuFFT-spacific code for D2Z
+ // Note that D2Z is inherently forward plan
+
+ result = cufftPlan3d( &backward_plan[mfi], fft_size[2],
+ fft_size[1], fft_size[0], CUFFT_Z2D);
+ // Add 2D cuFFT-specific code for Z2D
+ if ( result != CUFFT_SUCCESS ) {
+ amrex::Print() << " cufftplan3d backward failed! \n";
+ }
+ cudaDeviceSynchronize();
+
#else
// Create FFTW plans
forward_plan[mfi] =
@@ -87,6 +106,8 @@ SpectralFieldData::~SpectralFieldData()
for ( MFIter mfi(tmpRealField); mfi.isValid(); ++mfi ){
#ifdef AMREX_USE_GPU
// Add cuFFT-specific code
+ cufftDestroy( forward_plan[mfi] );
+ cufftDestroy( backward_plan[mfi] );
#else
// Destroy FFTW plans
fftw_destroy_plan( forward_plan[mfi] );
@@ -129,14 +150,30 @@ SpectralFieldData::ForwardTransform( const MultiFab& mf,
Array4<Real> tmp_arr = tmpRealField[mfi].array();
ParallelFor( realspace_bx,
[=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
- tmp_arr(i,j,k) = mf_arr(i,j,k,i_comp);
+ tmp_arr(i,j,k) = mf_arr(i,j,k,i_comp);
});
+//#ifdef AMREX_USE_GPU
+// cudaDeviceSynchronize();
+//#endif
}
// Perform Fourier transform from `tmpRealField` to `tmpSpectralField`
#ifdef AMREX_USE_GPU
// Add cuFFT-specific code ; make sure that this is done on the same
// GPU stream as the above copy
+ cudaDeviceSynchronize();
+ cufftResult result;
+ cudaStream_t stream = amrex::Cuda::Device::cudaStream();
+ amrex::Print() << " stream is " << stream << "\n";
+ cufftSetStream ( forward_plan[mfi], stream);
+ result = cufftExecD2Z( forward_plan[mfi],
+ tmpRealField[mfi].dataPtr(),
+ reinterpret_cast<cuDoubleComplex*>(
+ tmpSpectralField[mfi].dataPtr()) );
+ if ( result != CUFFT_SUCCESS ) {
+ amrex::Print() << " cufftplan3d execute failed ! \n";
+ }
+ cudaDeviceSynchronize();
#else
fftw_execute( forward_plan[mfi] );
#endif
@@ -227,6 +264,22 @@ SpectralFieldData::BackwardTransform( MultiFab& mf,
#ifdef AMREX_USE_GPU
// Add cuFFT-specific code ; make sure that this is done on the same
// GPU stream as the above copy
+ cudaDeviceSynchronize();
+ cufftResult result;
+ cudaStream_t stream = amrex::Cuda::Device::cudaStream();
+ amrex::Print() << " stream is " << stream << "\n";
+ cufftSetStream ( backward_plan[mfi], stream);
+ result = cufftExecZ2D( backward_plan[mfi],
+ reinterpret_cast<cuDoubleComplex*>(
+ tmpSpectralField[mfi].dataPtr()),
+ tmpRealField[mfi].dataPtr() );
+ if ( result != CUFFT_SUCCESS ) {
+ amrex::Print() << " cufftplan3d execute inverse failed ! \n";
+ }
+ if ( result == CUFFT_SUCCESS ) {
+ amrex::Print() << " created cufft inverse transform\n";
+ }
+ cudaDeviceSynchronize();
#else
fftw_execute( backward_plan[mfi] );
#endif
@@ -245,6 +298,14 @@ SpectralFieldData::BackwardTransform( MultiFab& mf,
// Copy and normalize field
mf_arr(i,j,k,i_comp) = inv_N*tmp_arr(i,j,k);
});
+//#ifdef AMREX_USE_GPU
+// cudaDeviceSynchronize();
+//#endif
+
+#ifdef AMREX_USE_GPU
+ cudaDeviceSynchronize();
+#endif
+ amrex::Print() << " divided by 1/N \n";
}
}
}