Module: FFT#
Fast fourier transform related variables and subroutines.
Cluster distributed FFT
In intel MKL, the MPI slicing happens along the first dimension in C, or the last dimension in Fortran. Note, this is the most natural way to do the slicing, because you want to keep the contingent data in memory on the same core. In the Mu-PRO PhaseFieldSDK, since we also support thin-film boundary conditions in many of our solvers and in most cases x dimension is larger than z, thus it is not a good choice to slice along the Z direction. As a result, all of the real space allocated arrays in Mu-PRO PhaseFieldSDK is defined as (z, y, x) rather than (x, y, z), so that the slicing happens along the x dimension instead of z.
Important
FFT module is also the base for many other modules. You must call the mupro_fft_setup
subroutine before you can use the solvers in the SDK.
Name: mod_mupro_fft
Depends on: mod_mupro_size, mod_mupro_print
Defined variables: None
Defined types: type_mupro_FFTContext
Defined subroutines: mupro_fft_setup, mupro_fft_forward, mupro_fft_forward2, mupro_fft_backward , mupro_fft_backward2, mupro_fitted_derivative, mupro_fitted_curvature
Defined Types#
type_mupro_FFTContext#
Variable |
Type |
Meaning |
---|---|---|
Rn1 |
int32 |
Size of real space x dimension on the current core |
Rn2 |
int32 |
Size of real space y dimension on the current core |
Rn3 |
int32 |
Size of real space z dimension on the current core |
Cn1 |
int32 |
Size of fourier space x dimension on the current core |
Cn2 |
int32 |
Size of fourier space y dimension on the current core |
Cn3 |
int32 |
Size of fourier space z dimension on the current core |
Hn1 |
int32 |
Dimension sizes for 2D-transform arrays. They should be sized f(Rn3,Hn2,Hn1) |
Hn2 |
int32 |
Dimension sizes for 2D-transform arrays. They should be sized f(Rn3,Hn2,Hn1) |
lstart |
int32 |
Starting index of the data along x on the current core |
Rn1All |
int32(:) |
|
lstartRAll |
int32(:) |
|
kvec |
int32 pointer(:,:,:,:) |
|
Important
MPI slicing in FFT only happens along the last dimension of Fortran array, so to have such slicing happens along the x direction, we have to define the x as the last dimension, y as the second to last, and so on. To give an example, the dimension for polarization is (3,z,y,x).
Note
Since MPI slicing happens along the last dimension of Fortran array (which is x in our convention), so \(\text{Rn3}=\text{nz}\), \(\text{Rn2}=\text{ny}\), \(\text{Rn1}\neq \text{nx}\), and \(\text{lstartR} = \text{0}\) for rank 0, and \(\text{lstartR}\neq \text{0}\) for other ranks.
Defined Subroutines#
mupro_fft_setup(context)#
Initialize cluster distributed FFT, so that we can use forward and backward functions afterwards.
call mupro_fft_setup(context)
Important
You must call this fft setup subroutine after mupro_size_setup and mupro_mpi_setup but before all other subroutines that involves 3D data.
Argument |
Type(Intent) |
Meaning |
---|---|---|
context |
The initialized FFT system information |
mupro_fft_forward(real_space, fourier_space)#
Forward fft from real space to fourier space in three dimension.
Argument |
Type(Intent) |
Meaning |
---|---|---|
real_space |
real(kind=rdp),intent(in),dimension(Rn3,Rn2,Rn1) |
Data in real space |
fourier_space |
complex(kind=rdp),intent(out),dimension(Cn3,Cn2,Cn1) |
Data in fourier space |
mupro_fft_forward2(real_space, fourier_space)#
Forward fft from real space to fourier space in two dimension.
Argument |
Type(Intent) |
Meaning |
---|---|---|
real_space |
real(kind=rdp),intent(in),dimension(Rn3,Hn2,Hn1) |
Data in real space |
fourier_space |
complex(kind=rdp),intent(out),dimension(Cn3,Cn2,Cn1) |
Data in fourier space |
mupro_fft_backward(fourier_space, real_space)#
Backward fft from fourier space to real space in three dimension.
Argument |
Type(Intent) |
Meaning |
---|---|---|
fourier_space |
complex(kind=rdp),intent(in),dimension(Cn3,Cn2,Cn1) |
Data in fourier space |
real_space |
real(kind=rdp),intent(out),dimension(Rn3,Rn2,Rn1) |
Data in real space |
mupro_fft_backward2(fourier_space, real_spac)#
Backward fft from fourier space to real space in two dimension.
Argument |
Type(Intent) |
Meaning |
---|---|---|
fourier_space |
complex(kind=rdp),intent(in),dimension(Cn3,Cn2,Cn1) |
Data in fourier space |
real_space |
real(kind=rdp),intent(out),dimension(Rn3,Hn2,Hn1) |
Data in real space |
mupro_fitted_derivative(data, derivative, order, direction)#
Calculate derivate of 3D data. This function can be called in both thin film and bulk cases. In the thin film case, due to the sudden change in data across the film interface and surface, a special fitting step is included, which is also why the subroutine is called mupro_fitted_derivative.
Argument |
Type(Intent) |
Meaning |
---|---|---|
data |
real(kind=rdp),intent(in),dimension(Rn3,Rn2,Rn1) |
Data in real space |
derivate |
real(kind=rdp),intent(out),dimension(3, Rn3,Rn2,Rn1 ) |
Derivative in real space, in the order of \(\frac{d}{dx}\), \(\frac{d}{dy}\), \(\frac{d}{dz}\) |
order |
integer,intent(in) |
Order for the fitting along z direction in the thin film case, you can choose from 0 to 4 |
direction |
integer,intent(in) |
The direction to calculate derivative, 1: only \(\frac{d}{dx}\), 2: only \(\frac{d}{dy}\), 3: only \(\frac{d}{dz}\), 4: all derivates, 5: \(\frac{d}{dx}\) and \(\frac{d}{dy}\) |
mupro_fitted_curvature(data, curvature, order, direction)#
Calculate curvature of 3D data. This function can be called in both thin film and bulk cases. In the thin film case, due to the sudden change in data across the film interface and surface, a special fitting step is included, which is also why the subroutine is called mupro_fitted_curvature.
Argument |
Type(Intent) |
Meaning |
---|---|---|
data |
real(kind=rdp),intent(in),dimension(Rn3,Rn2,Rn1) |
Data in real space |
derivate |
real(kind=rdp),intent(out),dimension(6, Rn3,Rn2,Rn1 ) |
Curvature in real space, in the order of \(\frac{d^2}{dx^2}\), \(\frac{d^2}{dy^2}\), \(\frac{d^2}{dz^2}\), \(\frac{d^2}{dydz}\) , \(\frac{d^2}{dxdz}\), \(\frac{d^2}{dxdy}\) |
order |
integer,intent(in) |
Order for the fitting along z direction in the thin film case, you can choose from 0 to 4 |
direction |
integer,intent(in) |
The direction to calculate Curvature, 1 for \(\frac{d^2}{dxdy}\), 2 for \(\frac{d^2}{dxdz}\), 4 for \(\frac{d^2}{dydz}\), 8 for \(\frac{d^2}{dz^2}\), 16 for \(\frac{d^2}{dy^2}\), 32 for \(\frac{d^2}{dx^2}\). To request multiple second derivatives these numbers should be added together |