omp_poisson_fft_t Derived Type

type, public, extends(poisson_fft_t) :: omp_poisson_fft_t

FFT based Poisson solver


Inherits

type~~omp_poisson_fft_t~~InheritsGraph type~omp_poisson_fft_t omp_poisson_fft_t decomp_info decomp_info type~omp_poisson_fft_t->decomp_info ph, sp, dc type~poisson_fft_t poisson_fft_t type~omp_poisson_fft_t->type~poisson_fft_t type~mesh_t mesh_t type~poisson_fft_t->type~mesh_t mesh type~geo_t geo_t type~mesh_t->type~geo_t geo type~grid_t grid_t type~mesh_t->type~grid_t grid type~par_t par_t type~mesh_t->type~par_t par

Components

Type Visibility Attributes Name Initial
type(mesh_t), public, pointer :: mesh => null()
integer, public :: nx_glob

Global dimensions

integer, public :: ny_glob

Global dimensions

integer, public :: nz_glob

Global dimensions

integer, public :: nx_loc

Local dimensions

integer, public :: ny_loc

Local dimensions

integer, public :: nz_loc

Local dimensions

integer, public :: nx_perm

Local dimensions in the permuted slabs

integer, public :: ny_perm

Local dimensions in the permuted slabs

integer, public :: nz_perm

Local dimensions in the permuted slabs

integer, public :: nx_spec

Local dimensions in the permuted slabs in spectral space

integer, public :: ny_spec

Local dimensions in the permuted slabs in spectral space

integer, public :: nz_spec

Local dimensions in the permuted slabs in spectral space

integer, public :: sp_st(3)

Offset per spectral dimension (dim1, dim2, dim3) in spectral space

complex(kind=dp), public, allocatable, dimension(:, :, :) :: waves

Local domain sized array storing the spectral equivalence constants

real(kind=dp), public, allocatable, dimension(:) :: ax

Wave numbers in x, y, and z

real(kind=dp), public, allocatable, dimension(:) :: bx

Wave numbers in x, y, and z

real(kind=dp), public, allocatable, dimension(:) :: ay

Wave numbers in x, y, and z

real(kind=dp), public, allocatable, dimension(:) :: by

Wave numbers in x, y, and z

real(kind=dp), public, allocatable, dimension(:) :: az

Wave numbers in x, y, and z

real(kind=dp), public, allocatable, dimension(:) :: bz

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: kx

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: ky

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: kz

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: exs

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: eys

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: ezs

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: k2x

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: k2y

Wave numbers in x, y, and z

complex(kind=dp), public, allocatable, dimension(:) :: k2z

Wave numbers in x, y, and z

real(kind=dp), public, allocatable, dimension(:) :: trans_x_re

Staggered grid transformation

real(kind=dp), public, allocatable, dimension(:) :: trans_x_im

Staggered grid transformation

real(kind=dp), public, allocatable, dimension(:) :: trans_y_re

Staggered grid transformation

real(kind=dp), public, allocatable, dimension(:) :: trans_y_im

Staggered grid transformation

real(kind=dp), public, allocatable, dimension(:) :: trans_z_re

Staggered grid transformation

real(kind=dp), public, allocatable, dimension(:) :: trans_z_im

Staggered grid transformation

logical, public :: periodic_x

Periodicity in x, y, and z

logical, public :: periodic_y

Periodicity in x, y, and z

logical, public :: periodic_z

Periodicity in x, y, and z

logical, public :: stretched_y = .false.

Periodicity in x, y, and z

logical, public :: stretched_y_sym

Periodicity in x, y, and z

real(kind=dp), public, allocatable, dimension(:, :, :, :) :: a_odd_re

Stretching operator matrices

real(kind=dp), public, allocatable, dimension(:, :, :, :) :: a_odd_im

Stretching operator matrices

real(kind=dp), public, allocatable, dimension(:, :, :, :) :: a_even_re

Stretching operator matrices

real(kind=dp), public, allocatable, dimension(:, :, :, :) :: a_even_im

Stretching operator matrices

real(kind=dp), public, allocatable, dimension(:, :, :, :) :: a_re

Stretching operator matrices

real(kind=dp), public, allocatable, dimension(:, :, :, :) :: a_im

Stretching operator matrices

logical, public :: lowmem = .false.

lowmem option, only used in CUDA backend

procedure(poisson_xxx), public, pointer :: poisson => null()

Procedure pointer to BC specific poisson solvers

complex(kind=dp), public, allocatable, dimension(:, :, :) :: c_x
complex(kind=dp), public, allocatable, dimension(:, :, :) :: c_y
complex(kind=dp), public, allocatable, dimension(:, :, :) :: c_z
logical, public :: is_100_case = .false.

Non-periodic in x, periodic in y and z

logical, public :: is_110_case = .false.

Non-periodic in x and y, periodic in z

integer, public :: p_row = 1

2decomp processor grid. p_row splits y in the x-pencil, p_col splits z.

integer, public :: p_col = 1

2decomp processor grid. p_row splits y in the x-pencil, p_col splits z.

type(decomp_info), public, pointer :: ph => null()

Physical space decomposition owned by the FFT. The 100 case builds the transform on the swapped cell grid (ny, nx, nz), so ph%xsz is exactly the layout the transform reads, and ph%ysz is what a local dim1/dim2 swap of the untransposed x-pencil lands on. decomp_main cannot serve here because it is built on vertex dims.

real(kind=dp), public, allocatable, dimension(:, :, :) :: r_yp

Y-pencil staging buffer of ph, only needed when y is decomposed.

type(decomp_info), public, pointer :: sp => null()

Spectral decomposition, and its y-pencil staging buffers. The FFT leaves the spectral slab in a z-pencil, where dim2 (the x modes) is split across p_col. The paired split in the postprocess couples a mode with its mirror in that same direction, so it needs dim2 whole. The y-pencil of the very same decomposition has dim2 complete for any processor grid, so 2decomp's own transpose delivers exactly the layout the pairing wants. waves is redistributed once, at init. sp is associated for every case, since init also reads the spectral slab extents from it, but c_pair and waves_pair exist only when the pairing actually needs the hop.

complex(kind=dp), public, allocatable, dimension(:, :, :) :: c_pair
complex(kind=dp), public, allocatable, dimension(:, :, :) :: waves_pair
real(kind=dp), public, allocatable, dimension(:, :, :) :: r_tr

Exact sized, x-y transposed real work buffer for the 100 case. The FFT is initialised with the x and y dimensions swapped so that the r2c transform runs along the periodic y direction and the non-periodic x direction keeps its full mode range in dim2, which is what the paired split in the spectral postprocess needs. The buffer is also exactly (ny, nx, nz) rather than padded up to a multiple of SZ, because 2decomp plans its FFTW transforms over the flat array and a padded one would be read with the wrong stride.

type(decomp_info), public :: dc

Cell-dims decomposition for the 110 case, built separately because decomp_main is on vertex dims. Its x-pencil is the solver field layout (x whole, y split by p_row, z split by p_col); its z-pencil is, after a local (i,j,k)->(k,i,j) transpose, the x-pencil of ph. r_xp/r_yp2/r_zp are its x-, y2- and z-pencil staging buffers, only allocated on multiple ranks; r_yp and r_tr above are reused for the y- and transposed-z-pencils. r_yp2 is only needed when y is split (p_row > 1), since that is when the xy-periodicity fold needs a second y-pencil buffer alongside r_yp.

real(kind=dp), public, allocatable, dimension(:, :, :) :: r_xp
real(kind=dp), public, allocatable, dimension(:, :, :) :: r_yp2
real(kind=dp), public, allocatable, dimension(:, :, :) :: r_zp

Constructor

public interface omp_poisson_fft_t

  • private function init(mesh, xdirps, ydirps, zdirps, lowmem) result(poisson_fft)

    Arguments

    Type IntentOptional Attributes Name
    type(mesh_t), intent(in), target :: mesh
    class(dirps_t), intent(in) :: xdirps
    class(dirps_t), intent(in) :: ydirps
    class(dirps_t), intent(in) :: zdirps
    logical, intent(in), optional :: lowmem

    Return Value type(omp_poisson_fft_t)


Type-Bound Procedures

procedure, public :: base_init

  • public subroutine base_init(self, mesh, xdirps, ydirps, zdirps, n_spec, n_sp_st)

    Arguments

    Type IntentOptional Attributes Name
    class(poisson_fft_t) :: self
    type(mesh_t), intent(in), target :: mesh
    type(dirps_t), intent(in) :: xdirps
    type(dirps_t), intent(in) :: ydirps
    type(dirps_t), intent(in) :: zdirps
    integer, intent(in), dimension(3) :: n_spec
    integer, intent(in), dimension(3) :: n_sp_st

procedure, public :: solve_poisson

procedure, public :: stretching_matrix

  • public subroutine stretching_matrix(self, geo, xdirps, ydirps, zdirps)

    Stretching necessitates a special operation in spectral space. The coefficients for the operation are stored in matrix form.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(poisson_fft_t) :: self
    type(geo_t), intent(in) :: geo
    type(dirps_t), intent(in) :: xdirps
    type(dirps_t), intent(in) :: ydirps
    type(dirps_t), intent(in) :: zdirps

procedure, public :: waves_set

  • public subroutine waves_set(self, geo, xdirps, ydirps, zdirps)

    Spectral equivalence constants

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(poisson_fft_t) :: self
    type(geo_t), intent(in) :: geo
    type(dirps_t), intent(in) :: xdirps
    type(dirps_t), intent(in) :: ydirps
    type(dirps_t), intent(in) :: zdirps

procedure, public :: get_km

  • public function get_km(self, i, j, k) result(km)

    Arguments

    Type IntentOptional Attributes Name
    class(poisson_fft_t) :: self
    integer, intent(in) :: i
    integer, intent(in) :: j
    integer, intent(in) :: k

    Return Value complex(kind=dp)

procedure, public :: get_km_re

  • public function get_km_re(self, i, j, k) result(re)

    Arguments

    Type IntentOptional Attributes Name
    class(poisson_fft_t) :: self
    integer, intent(in) :: i
    integer, intent(in) :: j
    integer, intent(in) :: k

    Return Value real(kind=dp)

procedure, public :: get_km_im

  • public function get_km_im(self, i, j, k) result(re)

    Arguments

    Type IntentOptional Attributes Name
    class(poisson_fft_t) :: self
    integer, intent(in) :: i
    integer, intent(in) :: j
    integer, intent(in) :: k

    Return Value real(kind=dp)

procedure, public :: fft_forward => fft_forward_omp

procedure, public :: fft_forward_010 => fft_forward_omp

procedure, public :: fft_forward_100 => fft_forward_100_omp

  • public subroutine fft_forward_100_omp(self, f_in)

    Forward FFT for the non-periodic x case. Transposes x and y so that the non-periodic direction sits in dim2, where it keeps its full mode range, then transforms the (ny, nx, nz) buffer with the swapped plan set up in init.

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(in) :: f_in

procedure, public :: fft_forward_110 => fft_forward_110_omp

  • public subroutine fft_forward_110_omp(self, f_in)

    Forward FFT for the non-periodic x and y case. Transposes the physical field (nx, ny, nz) to (nz, nx, ny) so that the r2c transform runs along the periodic z direction, then transforms with the plan set up in init.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(in) :: f_in

procedure, public :: fft_backward => fft_backward_omp

procedure, public :: fft_backward_010 => fft_backward_omp

procedure, public :: fft_backward_100 => fft_backward_100_omp

  • public subroutine fft_backward_100_omp(self, f_out)

    Backward FFT for the non-periodic x case, undoing the x-y transpose applied by fft_forward_100_omp. Only the unpadded extents are written, which is all undo_periodicity_x_omp goes on to read.

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(inout) :: f_out

procedure, public :: fft_backward_110 => fft_backward_110_omp

  • public subroutine fft_backward_110_omp(self, f_out)

    Backward FFT for the non-periodic x and y case, undoing the transpose applied by fft_forward_110_omp. Only the unpadded extents are written, which is all undo_periodicity_xy_omp goes on to read.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(inout) :: f_out

procedure, public :: fft_postprocess_000 => fft_postprocess_000_omp

procedure, public :: fft_postprocess_010 => fft_postprocess_010_omp

procedure, public :: fft_postprocess_100 => fft_postprocess_100_omp

procedure, public :: fft_postprocess_110 => fft_postprocess_110_omp

  • public subroutine fft_postprocess_110_omp(self)

    Post-process div U* in spectral space for the non-periodic x and y case. After the (nx, ny, nz) -> (nz, nx, ny) transpose applied by fft_forward_110_omp, dim1 holds the periodic z r2c modes, dim2 holds the non-periodic x modes and dim3 holds the non-periodic y modes.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self

procedure, public :: enforce_periodicity_x => enforce_periodicity_x_omp

  • public subroutine enforce_periodicity_x_omp(self, f_out, f_in)

    Gathers the non-periodic x line into a periodic one so that a plain FFT can stand in for the cosine transform. Unlike the y version below this handles an odd nx, which the 100 case requires.

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(inout) :: f_out
    class(field_t), intent(in) :: f_in

procedure, public :: undo_periodicity_x => undo_periodicity_x_omp

  • public subroutine undo_periodicity_x_omp(self, f_out, f_in)

    Scatters the gathered x line back to its original ordering.

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(inout) :: f_out
    class(field_t), intent(in) :: f_in

procedure, public :: enforce_periodicity_y => enforce_periodicity_y_omp

procedure, public :: undo_periodicity_y => undo_periodicity_y_omp

procedure, public :: enforce_periodicity_xy => enforce_periodicity_xy_omp

  • public subroutine enforce_periodicity_xy_omp(self, f_out, f_in)

    Gathers the non-periodic x and, when it is not split across ranks, y lines into periodic ones so that a plain FFT can stand in for the cosine transform in both directions.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(inout) :: f_out
    class(field_t), intent(in) :: f_in

procedure, public :: undo_periodicity_xy => undo_periodicity_xy_omp

  • public subroutine undo_periodicity_xy_omp(self, f_out, f_in)

    Scatters the gathered x and, when it is not split across ranks, y lines back to their original ordering.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(omp_poisson_fft_t) :: self
    class(field_t), intent(inout) :: f_out
    class(field_t), intent(in) :: f_in