Periodic in x and z, non-periodic in y, the only case that supports stretching in y
| 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 |
|||
| character(len=3), | public | :: | bc_code |
Boundary condition case, see poisson_bc_code. The backend's init sets it first, ahead of base_init. |
|||
| 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 |
|
| complex(kind=dp), | public, | device, allocatable, dimension(:, :, :) | :: | waves_dev |
Local domain sized array storing the spectral equivalence constants |
||
| real(kind=dp), | public, | device, allocatable, dimension(:) | :: | ax_dev |
Wave numbers in x, y, and z |
||
| real(kind=dp), | public, | device, allocatable, dimension(:) | :: | bx_dev |
Wave numbers in x, y, and z |
||
| real(kind=dp), | public, | device, allocatable, dimension(:) | :: | ay_dev |
Wave numbers in x, y, and z |
||
| real(kind=dp), | public, | device, allocatable, dimension(:) | :: | by_dev |
Wave numbers in x, y, and z |
||
| real(kind=dp), | public, | device, allocatable, dimension(:) | :: | az_dev |
Wave numbers in x, y, and z |
||
| real(kind=dp), | public, | device, allocatable, dimension(:) | :: | bz_dev |
Wave numbers in x, y, and z |
||
| integer, | public | :: | plan3D_fw |
Forward and backward FFT transform plans |
|||
| integer, | public | :: | plan3D_bw |
Forward and backward FFT transform plans |
|||
| logical, | public | :: | use_cufftmp | = | .true. |
Flag to indicate whether cuFFTMp is used |
|
| type(cudaLibXtDesc), | public, | pointer | :: | xtdesc |
cuFFTMp object manages decomposition and data storage |
||
| complex(kind=dp), | public, | device, allocatable, dimension(:, :, :) | :: | c_dev |
Standard cuFFT storage |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :) | :: | r_dev |
cuFFT real workspace (input/output of R2C/C2R) |
||
| complex(kind=dp), | public, | device, allocatable, dimension(:, :, :) | :: | c_mirror_dev |
dim2 mirror of the local spectral slab, used by the 010, 100 and 110 cases to reach the paired split partner that lives on another rank. Only init_dim2_mirror allocates it, and init_cuda reads its allocation status as "this case needs cuFFTMp". |
||
| complex(kind=dp), | public, | device, allocatable, dimension(:, :, :) | :: | c_slab_send_dev |
Staging copy of the local slab, sent in place of c_dev itself. In the cuFFTMp path c_dev is a c_f_pointer onto descriptor%data(1), which is cufftXtMalloc memory and therefore lives in the NVSHMEM symmetric heap. UCX does not reliably classify such a pointer as device memory: when it falls back to the host CMA transport it calls process_vm_readv on it and the job aborts with EFAULT. Copying into ordinary device memory first makes the exchange independent of which transport UCX happens to select. |
||
| complex(kind=dp), | public, | device, allocatable, dimension(:, :) | :: | c_plane_send_dev |
The single dim2 plane that falls outside the mirrored slab |
||
| complex(kind=dp), | public, | device, allocatable, dimension(:, :) | :: | c_plane_recv_dev |
The single dim2 plane that falls outside the mirrored slab |
||
| integer, | public | :: | mirror_slab_rank | = | 0 |
Ranks holding the mirror slab and the extra mirror plane |
|
| integer, | public | :: | mirror_plane_rank | = | 0 |
Ranks holding the mirror slab and the extra mirror plane |
|
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | store_a_odd_re_dev |
Stretching operator matrices stores |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | store_a_odd_im_dev |
Stretching operator matrices stores |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | store_a_even_re_dev |
Stretching operator matrices stores |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | store_a_even_im_dev |
Stretching operator matrices stores |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | store_a_re_dev |
Stretching operator matrices stores |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | store_a_im_dev |
Stretching operator matrices stores |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | a_odd_re_dev |
Stretching operator matrices |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | a_odd_im_dev |
Stretching operator matrices |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | a_even_re_dev |
Stretching operator matrices |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | a_even_im_dev |
Stretching operator matrices |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | a_re_dev |
Stretching operator matrices |
||
| real(kind=dp), | public, | device, allocatable, dimension(:, :, :, :) | :: | a_im_dev |
Stretching operator matrices |
Sets up the state every case shares. The backend's init calls it once it has set bc_code, which the spectral extents it passes in already depend on. The supported BC codes are the cases of the backend factories, create_omp_poisson_fft and create_cuda_poisson_fft.
| Type | Intent | Optional | 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 |
Gathers each non-periodic line into a periodic one, so that a plain FFT can stand in for the cosine transform, solves in spectral space, and scatters the result back. The 000 case has nothing to reorder and overrides this to transform f in place.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(poisson_fft_t) | :: | self | ||||
| class(field_t), | intent(inout) | :: | f | |||
| class(field_t), | intent(inout) | :: | temp |
Stretching necessitates a special operation in spectral space. The coefficients for the operation are stored in matrix form.
| Type | Intent | Optional | 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 |
Spectral equivalence constants
| Type | Intent | Optional | 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 |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(poisson_fft_t) | :: | self | ||||
| integer, | intent(in) | :: | i | |||
| integer, | intent(in) | :: | j | |||
| integer, | intent(in) | :: | k |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(poisson_fft_t) | :: | self | ||||
| integer, | intent(in) | :: | i | |||
| integer, | intent(in) | :: | j | |||
| integer, | intent(in) | :: | k |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(poisson_fft_t) | :: | self | ||||
| integer, | intent(in) | :: | i | |||
| integer, | intent(in) | :: | j | |||
| integer, | intent(in) | :: | k |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_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 | |||
| logical, | intent(in), | optional | :: | lowmem |
Standard R2C/C2R plans on the grid permuted into the spectral layout, with cuFFTMp fallback. This serves the 000, 010 and 100 cases. fft_n and fft_n_loc are the plan dimensions from cuda_fft_plan_setup.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_fft_t) | :: | self | ||||
| type(mesh_t), | intent(in) | :: | mesh | |||
| integer, | intent(in) | :: | fft_n(3) | |||
| integer, | intent(in) | :: | fft_n_loc(2) | |||
| integer, | intent(in) | :: | fw_plan_type | |||
| integer, | intent(in) | :: | bw_plan_type |
The 010, 100 and 110 cases pair each dim2 spectral mode with its mirror, which cuFFTMp may place on another rank. Slab index r of P owns global dim2 modes [rm + 1, (r + 1)m] with m = ny_spec, and the mirror of that range is slab P - 1 - r shifted up by one plane, so the extra plane comes from slab P - r. Both partners are symmetric. A single rank holds every partner itself and allocates nothing. This is the only place c_mirror_dev is allocated, see the cuFFTMp check in init_cuda.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_fft_t) | :: | self | ||||
| type(mesh_t), | intent(in) | :: | mesh |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_fft_t) | :: | self | ||||
| class(field_t), | intent(in) | :: | f |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_fft_t) | :: | self | ||||
| class(field_t), | intent(inout) | :: | f |
Fills c_mirror_dev and c_plane_recv_dev with the dim2 mirror of the local spectral slab, so that the paired split can read its partner mode without going looking for it in another rank's memory.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_fft_t) | :: | self | ||||
| complex(kind=dp), | intent(in), | device, dimension(:, :, :) | :: | c_dev |
if stretching in y is 'bottom'
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_010_t) | :: | self | ||||
| type(mesh_t), | intent(in) | :: | mesh |
if stretching in y is 'bottom'
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_010_t) | :: | self |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_010_t) | :: | self | ||||
| class(field_t), | intent(inout) | :: | f_out | |||
| class(field_t), | intent(in) | :: | f_in |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(cuda_poisson_010_t) | :: | self | ||||
| class(field_t), | intent(inout) | :: | f_out | |||
| class(field_t), | intent(in) | :: | f_in |