SWFFT
This Tutorial demonstrates how to call the SWFFT wrapper to the FFTW3 solver.
Note that the SWFFT source code was developed by Adrian Pope and colleagues and is available at:
https://git.cels.anl.gov/hacc/SWFFT
Please refer to the AMReX documentation at amrex_docs:swfftdoc for a brief explanation of how the SWFFT redistributes data into pencil grids.
AMReX contains two SWFFT tutorials, SWFFT_poisson
and SWFFT_simple
:
SWFFT_poisson
tutorial: The tutorial found inamrex-tutorials/ExampleCodes/SWFFT/SWFFT_poisson
solves a Poisson equation with periodic boundary conditions. In it, both a forward FFT and reverse FFT are called to solve the equation, however, no reordering of the DFT data in k-space is performed.SWFFT_simple
tutorial: This tutorial:amrex-tutorials/ExampleCodes/SWFFT/SWFFT_simple
, is useful if the objective is to simply take a forward FFT of data, and the DFT’s ordering in k-space matters to the user. This tutorial initializes a 3D or 2DMultiFab
, takes a forward FFT, and then redistributes the data in k-space back to the “correct,” 0 to \(2\pi\), ordering. The results are written to a plot file.
SWFFT_poisson
In this test case we set up a right hand side (rhs), call the forward transform, modify the coefficients, then call the backward solver and output the solution to the discrete Poisson equation.
To build the code, type ‘make’ in amrex-tutorials/ExampleCodes/SWFFT/SWFFT_poisson
. This
will include code from amrex/Src/Extern/SWFFT
and you will need to
link to the FFT solvers themselves (on NERSC’s Cori machine, for example,
you would need to “module load fft”)
To run the code, type ‘main3d.gnu.MPI.ex inputs’ in this directory
To visualize the output, set the bool write_data to true, then use amrvis3d (source available at https://github.com/AMReX-Codes/Amrvis):
amrvis3d -mf RHS SOL_EXACT SOL_COMP
to visualize the rhs, the exact solution and the computed solution.
The max norm of the difference between the exact and computed solution is also printed.
For instructions on how to take a forward FFT only using SWFFT, please refer to SWFFT_simple.
SWFFT_simple
This tutorial initializes a 3D or 2D MultiFab
, takes a forward FFT, and then redistributes the data in k-space back to the “correct,” 0 to \(2\pi\), ordering. The results are written to a plot file.
In a similar fashion to the SWFFT_poisson
tutorial:
To build the code, type ‘make’ in amrex-tutorials/ExampleCodes/SWFFT/SWFFT_simple
. This
will include code from amrex/Src/Extern/SWFFT
and you will need to
link to the FFT solvers themselves (on NERSC’s Cori machine, for example,
you would need to “module load fft”)
To run the code, type ‘main*.ex inputs.oneGrid’ in this directory to run the code in serial. To run the code in parallel, type ‘mpiexec -n $N main*.ex inputs.multipleGrids’ instead, where N
holds the number of MPI processes (equal to the number of grids). run_me_2d
and run_me_3d
also provide examples of how to run the code.
Use amrvis2d or amrvis3d to visualize the output (source available at https://github.com/AMReX-Codes/Amrvis):
amrvis${dims}d plt_fft*
where dims
specifies AMREX_SPACEDIM
. The DFT of the data and the original data are labeled as FFT_of_phi
and phi
within the plot file.
The SWFFT_poisson tutorial provides an example of solving a Poisson equation using a discrete spectral method, in which a forward and reverse FFT of a MultiFab
are computed.