MONC
|
This Pencil FFT performs 3D forward and backwards FFTs using pencil decomposition. It uses FFTW for the actual FFT kernel and this module contains all the data decomposition around this. There is no FFT required in Z, so this performs FFTs in Y and X (in that order forward and reversed backwards.) The data decomposition is the complex aspect, there is the concept of forward and backwards transformations. Forward transformations will go from pencil Z to Y to X and the backwards transformations undo these, so go from X to Y to Z. Note that we use quite a lot of buffer space here, this could be cut down if Y=X dimensions so some optimisation on memory could be done there in that case. More...
Data Types | |
type | pencil_transposition |
Describes a specific pencil transposition, from one pencil decomposition to another. More... | |
Functions/Subroutines | |
integer function, dimension(3), public | initialise_pencil_fft (current_state, my_y_start, my_x_start) |
Initialises the pencil FFT functionality, this will create the transposition structures needed. More... | |
subroutine, public | finalise_pencil_fft (monc_communicator) |
Cleans up allocated buffer memory. More... | |
subroutine, public | perform_forward_3dfft (current_state, source_data, target_data) |
Performs a forward 3D FFT and currently results in target data which is the X, Z, Y oriented pencil Note that the source_data here takes no account for the halo, it is up to caller to exclude this. This does no FFT in Z, but transposes to Y, does FFT in Y, then transposes to X and performs an FFT in that dimension. Pencil decomposition is used which has already been set up. More... | |
subroutine, public | perform_backwards_3dfft (current_state, source_data, target_data) |
Performs a backwards 3D FFT and currently results in target data which is the X, Z, Y oriented pencil Note that the source_data here takes no account for the halo, it is up to caller to exclude this. This does no FFT in Z, but transposes to Y, does FFT in Y, then transposes to X and performs an FFT in that dimension. Pencil decomposition is used which has already been set up. More... | |
subroutine | initialise_buffers () |
Initialises memory for the buffers used in the FFT. More... | |
subroutine | initialise_transpositions (current_state, y_distinct_sizes, x_distinct_sizes) |
Initialises the pencil transpositions, from a pencil in one dimension to that in another. More... | |
type(pencil_transposition) function | create_transposition (global_grid, existing_transposition, new_pencil_dim, process_dim_sizes, direction, extended_dimensions) |
Creates a specific pencil transposition description. It is maybe more a decomposition description, but the main complexity comes from the transposition from existing decomposition to new decomposition so therefore it is called transposition. The new pencil decomposition depends not only on the dimension to split on, but also the existing pencil decomposition. The new decomposed dimension (i.e. the existing pencil dimension) * other local dimensions is used as the sending size, receiving though requires knowledge about the data size on the source process so others will send their pencil dimension size to this process. More... | |
subroutine | transpose_and_forward_fft_in_y (current_state, source_data, buffer, real_buffer) |
Performs the transposition and forward FFT in the y dimension then converts back to real numbers. The Y size is (n/2+1)*2 due to the complex to real transformation after the FFT. More... | |
subroutine | transpose_and_backward_fft_in_x (current_state, source_data, buffer, real_buffer) |
Performs the backwards FFT in X and then transposes to Y pencil. The FFT requires complex numbers which are converted to real, so the this real to complex operation is performed first. If n is the logical size of the FFT row, then the input size is n+2, complex number size is n/2+1 and we get n reals out. More... | |
subroutine | transpose_and_forward_fft_in_x (current_state, buffer1, buffer2, buffer3) |
Performs the transposition and forward FFT in the x dimension. After the FFT the complex space is converted back into real numbers. The X size is (n/2+1)*2 due to this transformation. More... | |
subroutine | transpose_and_backward_fft_in_y (current_state, source_data, buffer, real_buffer) |
Performs the backwards FFT in Y and then transposes to Z pencil. The FFT requires complex numbers which are converted to real, so the this real to complex operation is performed first. If n is the logical size of the FFT row, then the input size is n+2, complex number size is n/2+1 and we get n reals out. More... | |
subroutine | transpose_to_pencil (transposition_description, source_dims, communicator, direction, source_data, target_data) |
Transposes globally to a new pencil decomposition. This goes from the source dimensions a,b,c to b,c,a (forwards) or c,a,b (backwards.) It requires multiple steps, first the local data is transposed to c,b,a regardless of direction. then it is communicated via alltoall, each process then assembles its own b,c,a or c,a,b data via contiguising across blocks as the data layout is nonlinear. More... | |
subroutine | contiguise_data (transposition_description, source_dims, direction, source_real_buffer, target_real_buffer) |
Contiguises from c,b,a to b,c,a (forwards) or c,a,b (backwards) where these are defined by the source_dims argument. It is not as simple as just swapping the required dimensions, as this is after the mpi alltoall and each block lies after the previous block running sequentially in a. More... | |
subroutine | perform_r2c_fft (source_data, transformed_data, row_size, num_rows, plan_id) |
Actually performs a forward real to complex FFT. More... | |
subroutine | perform_c2r_fft (source_data, transformed_data, row_size, num_rows, plan_id) |
Performs the complex to real (backwards) FFT. More... | |
subroutine | rearrange_data_for_sending (real_source, real_target) |
Rearranges data for sending, transposing a,b,c into c,b,a . This is done as alltoall splits on dimension c so to go from one pencil to another we assume here that a is the existing pencil as it is contiguous. More... | |
subroutine | determine_my_process_sizes_per_dim (existing_pencil_dim, existing_pencil_size, new_pencil_procs_per_dim, global_grid, extended_dimensions, specific_sizes_per_dim) |
Determines the number of elements to on my process per dimension which either need to be sent to (forwards transformation) or received from (backwards) each target process (in the row or column) This depends on the existing pencil decomposition, as effectively we are breaking that contigulity and decomposing it into n blocks in that dimension now (provided by new_pencil_procs_per_dim) More... | |
subroutine | determine_offsets_from_size (source_sizes, determined_offsets) |
Simple helper function to deduce send or receive offsets from the sizes. More... | |
integer function, dimension(3) | determine_pencil_process_dimensions (new_pencil_dim, existing_pencil_dim, existing_pencil_procs) |
Determines the number of processes in each dimension for the target decomposition. This depends heavily on the existing decomposition, as we basically contiguise our pencil dimension and decompose the existing pencil dimension. The third dimension remains unchanged. More... | |
integer function, dimension(3) | determine_my_pencil_location (new_pencil_dim, existing_pencil_dim, existing_locations) |
Determines my location for each dimension in the new pencil decomposition. I.e. which block I am operating on. More... | |
subroutine | concatenate_dimension_sizes (dims, concatenated_dim_sizes) |
Concatenates sizes in multiple dimensions for each target process (in a row or column) into a product of that. This represents all the dimension sizes per process. More... | |
subroutine | determine_matching_process_dimensions (new_pencil_dim, existing_pencil_dim, proc_sizes, my_pencil_size, pencil_processes_per_dim, specific_sizes_per_dim) |
Determines the sizes per dimension on the matching process either to receive from (forward transposition) or send to (backwards transposition) each source process. Not only does this depend on the my pencil sizes, but it also depends on the amount of data that the source process has to send over. More... | |
type(pencil_transposition) function | create_initial_transposition_description (current_state) |
Creates an initial transposition representation of the Z pencil that MONC is normally decomposed in. This is then fed into the create transposition procedure which will generate transpositions to other pencils. More... | |
integer function, dimension(3) | determine_pencil_size (new_pencil_dim, pencil_process_layout, my_pencil_location, existing_transposition, global_grid, extended_dimensions) |
Deduces the size of my (local) pencil based upon the new decomposition. This depends heavily on the current pencil decomposition, the new pencil dimension is the global size, the existing pencil dimension becomes decomposed based on the number of processes in that dimension. The third dimension remains unchanged. More... | |
logical function | is_extended_dimension (dimension, extended_dimensions) |
Determines whether or not the specific dimension is in the list of extended dimensions. More... | |
integer function, dimension(size(process_dim_sizes)) | normal_to_extended_process_dim_sizes (process_dim_sizes) |
Transforms real process dimension sizes into their real after FFT complex->real transformation. The way this works is that it goes from n to (n/2+1)*2 numbers which is distributed amongst the processes deterministically. More... | |
subroutine | convert_complex_to_real (complex_data, real_data) |
Converts complex representation to its real data counterpart and is called after each forward FFT. After a r2c FFT, there are n/2+1 complex numbers - which means that there will be more real numbers in Fourier space than are provided into the forward FFT call (due to the extra +1). Note that the real size n will always be complex size * 2 This always unpacks the complex dimension in the first dimension. More... | |
subroutine | convert_real_to_complex (real_data, complex_data) |
Converts reals into their complex representation, this is called for backwards FFTs as we need to feed in complex numbers to force FFTW to do a backwards. It is a relatively simple transformation, as n goes into n/2 complex numbers and as this is the result of the convert_complex_to_real procedure, n always divides evenly. This is always applied to the first dimension of the real data. More... | |
integer function | deduce_my_global_start (current_state, dimension) |
Determines my global start coordinate in Fourier space. This is required for cos y and cos x calculation which is fed into the tridiagonal solver. After the forward FFTs, each process has ((n/2+1)/p+r) * 2 elements, where p is the number of processes and r is the uneven process remainder (1 or 0 depending on p). Therefore some processes will have t elements, and some t-2 elements to feed into the solver. More... | |
Variables | |
integer, parameter | forward =1 |
integer, parameter | backward =2 |
Transposition directions. More... | |
integer | dim_y_comm |
integer | dim_x_comm |
Communicators for each dimension. More... | |
type(pencil_transposition) | y_from_z_transposition |
type(pencil_transposition) | x_from_y_transposition |
type(pencil_transposition) | y_from_x_transposition |
type(pencil_transposition) | z_from_y_transposition |
type(pencil_transposition) | y_from_z_2_transposition |
type(pencil_transposition) | x_from_y_2_transposition |
type(pencil_transposition) | y_from_x_2_transposition |
type(pencil_transposition) | z_from_y_2_transposition |
real(kind=default_precision), dimension(:,:,:), pointer, contiguous | real_buffer1 |
real(kind=default_precision), dimension(:,:,:), pointer, contiguous | real_buffer2 |
real(kind=default_precision), dimension(:,:,:), pointer, contiguous | real_buffer3 |
real(kind=default_precision), dimension(:,:,:), pointer, contiguous | fft_in_y_buffer |
real(kind=default_precision), dimension(:,:,:), pointer, contiguous | fft_in_x_buffer |
complex(c_double_complex), dimension(:,:,:), pointer, contiguous | buffer1 |
complex(c_double_complex), dimension(:,:,:), pointer, contiguous | buffer2 |
type(c_ptr), dimension(4) | fftw_plan |
logical, dimension(4) | fftw_plan_initialised =.false. |
This Pencil FFT performs 3D forward and backwards FFTs using pencil decomposition. It uses FFTW for the actual FFT kernel and this module contains all the data decomposition around this. There is no FFT required in Z, so this performs FFTs in Y and X (in that order forward and reversed backwards.) The data decomposition is the complex aspect, there is the concept of forward and backwards transformations. Forward transformations will go from pencil Z to Y to X and the backwards transformations undo these, so go from X to Y to Z. Note that we use quite a lot of buffer space here, this could be cut down if Y=X dimensions so some optimisation on memory could be done there in that case.
|
private |
Concatenates sizes in multiple dimensions for each target process (in a row or column) into a product of that. This represents all the dimension sizes per process.
dims | The sizes, per dimension and per process that we will fold into target process |
Definition at line 573 of file pencilfft.F90.
|
private |
Contiguises from c,b,a to b,c,a (forwards) or c,a,b (backwards) where these are defined by the source_dims argument. It is not as simple as just swapping the required dimensions, as this is after the mpi alltoall and each block lies after the previous block running sequentially in a.
transposition_description | Transposition descriptor |
source_dims | Representation a,b,c of source data, will contiguise to b,a,c |
direction | Whether we wish to contiguise forwards or backwards |
source_real_buffer | Source real data to transform |
target_real_buffer | Target real data which is the result of the operation |
Definition at line 389 of file pencilfft.F90.
|
private |
Converts complex representation to its real data counterpart and is called after each forward FFT. After a r2c FFT, there are n/2+1 complex numbers - which means that there will be more real numbers in Fourier space than are provided into the forward FFT call (due to the extra +1). Note that the real size n will always be complex size * 2 This always unpacks the complex dimension in the first dimension.
complex_data | Complex data in Z,Y,X orientation to be unpacked into its real representation |
real_data | The real representation is written into here |
Definition at line 704 of file pencilfft.F90.
|
private |
Converts reals into their complex representation, this is called for backwards FFTs as we need to feed in complex numbers to force FFTW to do a backwards. It is a relatively simple transformation, as n goes into n/2 complex numbers and as this is the result of the convert_complex_to_real
procedure, n always divides evenly. This is always applied to the first dimension of the real data.
real_data | The source real data to pack into the complex data, it is oriented Z,Y,X |
complex_data | Target complex data which the real data is packaged into |
Definition at line 726 of file pencilfft.F90.
|
private |
Creates an initial transposition representation of the Z pencil that MONC is normally decomposed in. This is then fed into the create transposition procedure which will generate transpositions to other pencils.
current_state | The current model state |
Definition at line 613 of file pencilfft.F90.
|
private |
Creates a specific pencil transposition description. It is maybe more a decomposition description, but the main complexity comes from the transposition from existing decomposition to new decomposition so therefore it is called transposition. The new pencil decomposition depends not only on the dimension to split on, but also the existing pencil decomposition. The new decomposed dimension (i.e. the existing pencil dimension) * other local dimensions is used as the sending size, receiving though requires knowledge about the data size on the source process so others will send their pencil dimension size to this process.
new_pencil_dim | The dimension to use as the new pencil decomposition |
existing_pencil_dim | The dimension used in the current decomposition |
existing_pencil_process_layout | Number of processes per dimension for the current decomposition |
existing_my_location | The current processes block location per dimension for the current decomposition |
existing_pencil_size | Pencil size per dimension for the current decomposition |
process_dim_sizes | Sizes of the pencil dimension from other processes that is used to calculate receive count |
direction | Whether we are transposing forwards or backwards, backwards is just an inverse |
extended_dimensions | The dimensions that this process extends from n to (n/2+1)*2 (i.e. result of fft complex->real) |
Definition at line 215 of file pencilfft.F90.
|
private |
Determines my global start coordinate in Fourier space. This is required for cos y and cos x calculation which is fed into the tridiagonal solver. After the forward FFTs, each process has ((n/2+1)/p+r) * 2 elements, where p is the number of processes and r is the uneven process remainder (1 or 0 depending on p). Therefore some processes will have t elements, and some t-2 elements to feed into the solver.
current_state | The current model state |
dimension | The dimension that we are calculating this for (Y or X) |
Definition at line 751 of file pencilfft.F90.
|
private |
Determines the sizes per dimension on the matching process either to receive from (forward transposition) or send to (backwards transposition) each source process. Not only does this depend on the my pencil sizes, but it also depends on the amount of data that the source process has to send over.
new_pencil_dim | The dimension for the new pencil decomposition |
existing_pencil_dim | Dimension for the existing pencil decomposition |
proc_sizes | Size of dimension on the source processes (index in array corresponds to source PID) |
my_pencil_size | My (new) pencil size per dimension |
pencil_processes_per_dim | The process layout per dimension |
Definition at line 592 of file pencilfft.F90.
|
private |
Determines my location for each dimension in the new pencil decomposition. I.e. which block I am operating on.
new_pencil_dim | New pencil decomposition dimension |
existing_pencil_dim | Current pencil dimension |
existing_locations | Location for the current decomposition |
Definition at line 553 of file pencilfft.F90.
|
private |
Determines the number of elements to on my process per dimension which either need to be sent to (forwards transformation) or received from (backwards) each target process (in the row or column) This depends on the existing pencil decomposition, as effectively we are breaking that contigulity and decomposing it into n blocks in that dimension now (provided by new_pencil_procs_per_dim)
existing_pencil_dim | The pencil dimension that we are transforming from |
existing_pencil_size | Existing pencil decomposition sizes per dimension |
new_pencil_procs_per_dim | For the target decomposition the number of processes per dimension |
global_grid | Description of the global grid which we use for sizing information |
extended_dimensions | List of dimensions where we extend from n to n+2 (i.e. result of FFT complex-> real transformation) |
Definition at line 488 of file pencilfft.F90.
|
private |
Simple helper function to deduce send or receive offsets from the sizes.
source_sizes | Sizes that we are using to build the offsets |
Definition at line 513 of file pencilfft.F90.
|
private |
Determines the number of processes in each dimension for the target decomposition. This depends heavily on the existing decomposition, as we basically contiguise our pencil dimension and decompose the existing pencil dimension. The third dimension remains unchanged.
new_pencil_dim | New pencil dimension |
existing_pencil_dim | Current decomposition pencil dimension |
existing_pencil_procs | Current decomposition process layout |
Definition at line 531 of file pencilfft.F90.
|
private |
Deduces the size of my (local) pencil based upon the new decomposition. This depends heavily on the current pencil decomposition, the new pencil dimension is the global size, the existing pencil dimension becomes decomposed based on the number of processes in that dimension. The third dimension remains unchanged.
new_pencil_dim | Dimension for the new pencil decomposition |
pencil_process_layout | The processes per dimension layout for the new decomposition |
my_pencil_location | My location in the block layout |
existing_pencil_dim | Current decomposition dimension |
existing_pencil_size | Current decomposition sizes |
global_grid | Description of the global grid which we use for sizing information |
extended_dimensions | List of dimensions where we extend from n to n+2 (i.e. result of FFT complex-> real transformation) |
Definition at line 632 of file pencilfft.F90.
subroutine, public pencil_fft_mod::finalise_pencil_fft | ( | integer, intent(in) | monc_communicator | ) |
Cleans up allocated buffer memory.
Definition at line 92 of file pencilfft.F90.
|
private |
Initialises memory for the buffers used in the FFT.
Definition at line 152 of file pencilfft.F90.
integer function, dimension(3), public pencil_fft_mod::initialise_pencil_fft | ( | type(model_state_type), intent(inout) | current_state, |
integer, intent(out) | my_y_start, | ||
integer, intent(out) | my_x_start | ||
) |
Initialises the pencil FFT functionality, this will create the transposition structures needed.
current_state | The current model state |
my_y_start | My global start in fourier space for Y |
my_x_start | My global start in fourier space for X |
Definition at line 51 of file pencilfft.F90.
|
private |
Initialises the pencil transpositions, from a pencil in one dimension to that in another.
current_state | The current model state |
y_distinct_sizes | Y sizes per process |
x_distinct_sizes | X sizes per process |
Definition at line 173 of file pencilfft.F90.
|
private |
Determines whether or not the specific dimension is in the list of extended dimensions.
dimension | The dimension to test for |
extended_dimensions | Array of dimensions that will be searched |
Definition at line 667 of file pencilfft.F90.
|
private |
Transforms real process dimension sizes into their real after FFT complex->real transformation. The way this works is that it goes from n to (n/2+1)*2 numbers which is distributed amongst the processes deterministically.
process_dim_sizes | Real process dimension sizes |
Definition at line 684 of file pencilfft.F90.
subroutine, public pencil_fft_mod::perform_backwards_3dfft | ( | type(model_state_type), intent(inout), target | current_state, |
real(kind=default_precision), dimension(:,:,:), intent(in) | source_data, | ||
real(kind=default_precision), dimension(:,:,:), intent(out) | target_data | ||
) |
Performs a backwards 3D FFT and currently results in target data which is the X, Z, Y oriented pencil Note that the source_data here takes no account for the halo, it is up to caller to exclude this. This does no FFT in Z, but transposes to Y, does FFT in Y, then transposes to X and performs an FFT in that dimension. Pencil decomposition is used which has already been set up.
current_state | The current model state |
source_data | The source real data to in the frequency domain |
target_data | Time domain complex representation of the frequency domain source |
Definition at line 137 of file pencilfft.F90.
|
private |
Performs the complex to real (backwards) FFT.
source_data | Source (complex) data in the frequency domain |
transformed_data | Resulting real data in the time domain |
row_size | Number of elements for each FFT |
num_rows | The number of FFTs to perform on the next data elements in the source_data |
plan_id | Id number of the plan that tracks whether we need to create it or can reuse the existing one |
Definition at line 449 of file pencilfft.F90.
subroutine, public pencil_fft_mod::perform_forward_3dfft | ( | type(model_state_type), intent(inout), target | current_state, |
real(kind=default_precision), dimension(:,:,:), intent(inout) | source_data, | ||
real(kind=default_precision), dimension(:,:,:), intent(out) | target_data | ||
) |
Performs a forward 3D FFT and currently results in target data which is the X, Z, Y oriented pencil Note that the source_data here takes no account for the halo, it is up to caller to exclude this. This does no FFT in Z, but transposes to Y, does FFT in Y, then transposes to X and performs an FFT in that dimension. Pencil decomposition is used which has already been set up.
current_state | The current model state |
source_data | The source real data to in the time domain |
target_data | Frequency domain real representation of the time domain source which is allocated here |
Definition at line 114 of file pencilfft.F90.
|
private |
Actually performs a forward real to complex FFT.
source_data | Source (real) data in the time domain |
transformed_data | Resulting complex data in the frequency domain |
row_size | Number of elements for each FFT |
num_rows | The number of FFTs to perform on the next data elements in the source_data |
plan_id | Id number of the plan that tracks whether we need to create it or can reuse the existing one |
Definition at line 430 of file pencilfft.F90.
|
private |
Rearranges data for sending, transposing a,b,c into c,b,a . This is done as alltoall splits on dimension c so to go from one pencil to another we assume here that a is the existing pencil as it is contiguous.
real_source | Source data to transpose from |
real_target | Target data to transpose to |
Definition at line 468 of file pencilfft.F90.
|
private |
Performs the backwards FFT in X and then transposes to Y pencil. The FFT requires complex numbers which are converted to real, so the this real to complex operation is performed first. If n is the logical size of the FFT row, then the input size is n+2, complex number size is n/2+1 and we get n reals out.
current_state | The current model state |
source_data | Input buffer, X pencil oriented x,z,y |
buffer | Complex buffer which is fed into the FFT |
real_buffer | Output buffer, Y pencil, oriented y,x,z |
Definition at line 288 of file pencilfft.F90.
|
private |
Performs the backwards FFT in Y and then transposes to Z pencil. The FFT requires complex numbers which are converted to real, so the this real to complex operation is performed first. If n is the logical size of the FFT row, then the input size is n+2, complex number size is n/2+1 and we get n reals out.
current_state | The current model state |
source_data | Input buffer, Y pencil oriented y,x,z |
buffer | Complex buffer which is fed into the FFT |
real_buffer | Output buffer, Z pencil, oriented z,y,x |
Definition at line 331 of file pencilfft.F90.
|
private |
Performs the transposition and forward FFT in the x dimension. After the FFT the complex space is converted back into real numbers. The X size is (n/2+1)*2 due to this transformation.
current_state | The current model state |
buffer1 | Input buffer, Y pencil after the Y dimension FFT oriented y,x,z |
buffer | Complex buffer which results from the FFT |
buffer2 | Output buffer, X pencil after this X FFT, oriented x,z,y |
Definition at line 309 of file pencilfft.F90.
|
private |
Performs the transposition and forward FFT in the y dimension then converts back to real numbers. The Y size is (n/2+1)*2 due to the complex to real transformation after the FFT.
current_state | The current model state |
source_data | Input buffer, Z pencil oriented z,y,x |
buffer | Complex buffer which the FFT writes into |
real_buffer | Output buffer, Y pencil, oriented y,x,z |
Definition at line 266 of file pencilfft.F90.
|
private |
Transposes globally to a new pencil decomposition. This goes from the source dimensions a,b,c to b,c,a (forwards) or c,a,b (backwards.) It requires multiple steps, first the local data is transposed to c,b,a regardless of direction. then it is communicated via alltoall, each process then assembles its own b,c,a or c,a,b data via contiguising across blocks as the data layout is nonlinear.
transposition_description | Description of the transposition |
source_dims | Dimensions of the current pencil that we wish to transpose from, will go from abc to bca |
communicator | The MPI communicator associated with the group of processes who will swap data |
direction | Whether this is going forwards or backwards, it makes a difference to the data arrangement |
source_data | Source data (abc) |
target_data | Target data (bca) |
Definition at line 357 of file pencilfft.F90.
|
private |
Transposition directions.
Definition at line 28 of file pencilfft.F90.
|
private |
Definition at line 37 of file pencilfft.F90.
|
private |
Definition at line 37 of file pencilfft.F90.
|
private |
Communicators for each dimension.
Definition at line 29 of file pencilfft.F90.
|
private |
Definition at line 29 of file pencilfft.F90.
|
private |
Definition at line 35 of file pencilfft.F90.
|
private |
Definition at line 35 of file pencilfft.F90.
|
private |
Definition at line 40 of file pencilfft.F90.
|
private |
Definition at line 41 of file pencilfft.F90.
|
private |
Definition at line 28 of file pencilfft.F90.
|
private |
Definition at line 35 of file pencilfft.F90.
|
private |
Definition at line 35 of file pencilfft.F90.
|
private |
Definition at line 35 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.
|
private |
Definition at line 31 of file pencilfft.F90.