Hipace
Classes | Typedefs | Enumerations | Functions | Variables
AnyDST Namespace Reference

Wrapper around multiple FFT libraries. More...

Classes

struct  DSTplan
 This struct contains the vendor FFT plan and additional metadata. More...
 

Typedefs

using DSTplans = amrex::LayoutData< DSTplan >
 

Enumerations

enum class  direction { forward , backward }
 

Functions

DSTplan CreatePlan (const amrex::IntVect &real_size, amrex::FArrayBox *position_array, amrex::FArrayBox *fourier_array)
 create FFT plan for the backend FFT library. More...
 
void DestroyPlan (DSTplan &dst_plan)
 Destroy library FFT plan. More...
 
template<AnyDST::direction d>
void Execute (DSTplan &dst_plan)
 Perform FFT with backend library. More...
 
template void Execute< direction::forward > (DSTplan &dst_plan)
 
template void Execute< direction::backward > (DSTplan &dst_plan)
 
void ExpandR2R (amrex::FArrayBox &dst, amrex::FArrayBox &src)
 Extend src into a symmetrized larger array dst. More...
 
void ShrinkC2R (amrex::FArrayBox &dst, amrex::BaseFab< amrex::GpuComplex< amrex::Real >> &src)
 Extract symmetrical src array into smaller array dst. More...
 
void ToComplex (const amrex::Real *const AMREX_RESTRICT in, amrex::GpuComplex< amrex::Real > *const AMREX_RESTRICT out, const int n_data, const int n_batch)
 Make Complex array out of Real array to prepare for fft. out[idx] = -in[2*idx-2] + in[2*idx] + i*in[2*idx-1] for each column with in[-1] = 0; in[-2] = -in[0]; in[n_data] = 0; in[n_data+1] = -in[n_data-1]. More...
 
void C2Rfft (AnyFFT::VendorFFTPlan &plan, amrex::GpuComplex< amrex::Real > *AMREX_RESTRICT in, amrex::Real *const AMREX_RESTRICT out)
 Complex to Real fft for every column of the input matrix. The output Matrix has its indexes reversed compared to some other libraries. More...
 
void ToSine (const amrex::Real *const AMREX_RESTRICT in, amrex::Real *const AMREX_RESTRICT out, const int n_data, const int n_batch)
 Make Sine-space Real array out of array from fft. out[idx] = 0.5 *(in[n_data-idx] - in[idx+1] + (in[n_data-idx] + in[idx+1])/ (2*sin((idx+1)*pi/(n_data+1)))) for each column. More...
 
void Transpose (const amrex::Real *const AMREX_RESTRICT in, amrex::Real *const AMREX_RESTRICT out, const int n_data, const int n_batch)
 Transpose input matrix out[idy][idx] = in[idx][idy]. More...
 
void C2Rfft (AnyFFT::VendorFFTPlan &plan, amrex::GpuComplex< amrex::Real > *AMREX_RESTRICT in, amrex::Real *const AMREX_RESTRICT out, rocfft_execution_info execinfo)
 

Variables

cufftType VendorR2C = CUFFT_D2Z
 
cufftType VendorC2R = CUFFT_Z2D
 
const auto VendorCreatePlanR2R2D = fftw_plan_r2r_2d
 

Detailed Description

Wrapper around multiple FFT libraries.

The header file defines the API and the base types (Complex and VendorFFTPlan), and the implementation for different FFT libraries is done in different cpp files. This wrapper only depends on the underlying FFT library AND on AMReX (There is no dependence on WarpX).

Typedef Documentation

◆ DSTplans

Collection of FFT plans, one FFTplan per box

Enumeration Type Documentation

◆ direction

enum AnyDST::direction
strong

Direction in which the FFT is performed.

Enumerator
forward 
backward 

Function Documentation

◆ C2Rfft() [1/2]

void AnyDST::C2Rfft ( AnyFFT::VendorFFTPlan plan,
amrex::GpuComplex< amrex::Real > *AMREX_RESTRICT  in,
amrex::Real *const AMREX_RESTRICT  out 
)

Complex to Real fft for every column of the input matrix. The output Matrix has its indexes reversed compared to some other libraries.

Parameters
[in]plancuda fft plan for transformation
[in]ininput complex array
[out]outoutput real array

◆ C2Rfft() [2/2]

void AnyDST::C2Rfft ( AnyFFT::VendorFFTPlan plan,
amrex::GpuComplex< amrex::Real > *AMREX_RESTRICT  in,
amrex::Real *const AMREX_RESTRICT  out,
rocfft_execution_info  execinfo 
)

◆ CreatePlan()

DSTplan AnyDST::CreatePlan ( const amrex::IntVect real_size,
amrex::FArrayBox position_array,
amrex::FArrayBox fourier_array 
)

create FFT plan for the backend FFT library.

Parameters
[in]real_sizeSize of the real array, along each dimension.
[out]position_arrayReal array from/to where R2R DST is performed
[out]fourier_arrayReal array to/from where R2R DST is performed

◆ DestroyPlan()

void AnyDST::DestroyPlan ( DSTplan dst_plan)

Destroy library FFT plan.

Parameters
[out]dst_planplan to destroy

◆ Execute()

template<AnyDST::direction d>
void AnyDST::Execute ( DSTplan dst_plan)

Perform FFT with backend library.

Parameters
[out]dst_planplan for which the FFT is performed

◆ Execute< direction::backward >()

template void AnyDST::Execute< direction::backward > ( DSTplan dst_plan)

◆ Execute< direction::forward >()

template void AnyDST::Execute< direction::forward > ( DSTplan dst_plan)

◆ ExpandR2R()

void AnyDST::ExpandR2R ( amrex::FArrayBox dst,
amrex::FArrayBox src 
)

Extend src into a symmetrized larger array dst.

Parameters
[in,out]dstdestination array, odd symmetry around 0 and the middle points in x and y
[in]srcsource array

◆ ShrinkC2R()

void AnyDST::ShrinkC2R ( amrex::FArrayBox dst,
amrex::BaseFab< amrex::GpuComplex< amrex::Real >> &  src 
)

Extract symmetrical src array into smaller array dst.

Parameters
[in,out]dstdestination array
[in]srcdestination array, symmetric in x and y

◆ ToComplex()

void AnyDST::ToComplex ( const amrex::Real *const AMREX_RESTRICT  in,
amrex::GpuComplex< amrex::Real > *const AMREX_RESTRICT  out,
const int  n_data,
const int  n_batch 
)

Make Complex array out of Real array to prepare for fft. out[idx] = -in[2*idx-2] + in[2*idx] + i*in[2*idx-1] for each column with in[-1] = 0; in[-2] = -in[0]; in[n_data] = 0; in[n_data+1] = -in[n_data-1].

Parameters
[in]ininput real array
[out]outoutput complex array
[in]n_datanumber of (contiguous) rows in position matrix
[in]n_batchnumber of (strided) columns in position matrix

◆ ToSine()

void AnyDST::ToSine ( const amrex::Real *const AMREX_RESTRICT  in,
amrex::Real *const AMREX_RESTRICT  out,
const int  n_data,
const int  n_batch 
)

Make Sine-space Real array out of array from fft. out[idx] = 0.5 *(in[n_data-idx] - in[idx+1] + (in[n_data-idx] + in[idx+1])/ (2*sin((idx+1)*pi/(n_data+1)))) for each column.

Parameters
[in]ininput real array
[out]outoutput real array
[in]n_datanumber of (contiguous) rows in position matrix
[in]n_batchnumber of (strided) columns in position matrix

◆ Transpose()

void AnyDST::Transpose ( const amrex::Real *const AMREX_RESTRICT  in,
amrex::Real *const AMREX_RESTRICT  out,
const int  n_data,
const int  n_batch 
)

Transpose input matrix out[idy][idx] = in[idx][idy].

Parameters
[in]ininput real array
[out]outoutput real array
[in]n_datanumber of (contiguous) rows in input matrix
[in]n_batchnumber of (strided) columns in input matrix

Variable Documentation

◆ VendorC2R

cufftType AnyDST::VendorC2R = CUFFT_Z2D

◆ VendorCreatePlanR2R2D

const auto AnyDST::VendorCreatePlanR2R2D = fftw_plan_r2r_2d

◆ VendorR2C

cufftType AnyDST::VendorR2C = CUFFT_D2Z