MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_fftw.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
2!>
3!! @file
4!! @brief Contains module m_fftw
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34! New line at end of file is required for FYPP
35# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
36# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
37# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
38# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
42# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63! New line at end of file is required for FYPP
64# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
65
66# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
68# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
70# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142! New line at end of file is required for FYPP
143# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
144# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
145# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
146# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
148# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
154# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161
162# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165
166# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171! New line at end of file is required for FYPP
172# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
173
174# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229! New line at end of file is required for FYPP
230# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
231
232! GPU parallel region (scalar reductions, maxval/minval)
233# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
234
235! GPU parallel loop over threads (most common GPU macro)
236# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238! Required closing for GPU_PARALLEL_LOOP
239# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
240
241! Mark routine for device compilation
242# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244! Declare device-resident data
245# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! Inner loop within a GPU parallel region
248# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Scoped GPU data region
251# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Host code with device pointers (for MPI with GPU buffers)
254# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Allocate device memory (unscoped)
257# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Free device memory
260# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Atomic operation on device
263# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! End atomic capture block
266# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Copy data between host and device
269# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Synchronization barrier
272# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Import GPU library module (openacc or omp_lib)
275# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Emit code only for AMD compiler
278# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Emit code for non-Cray compilers
281# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Emit code only for Cray compiler
284# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Emit code for non-NVIDIA compilers
287# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291! New line at end of file is required for FYPP
292# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
293
294# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
295
296! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
297! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
298! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
299# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
300
301! Allocate and create GPU device memory
302# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
303
304! Free GPU device memory and deallocate
305# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Cray-specific GPU pointer setup for vector fields
308# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
309
310! Cray-specific GPU pointer setup for scalar fields
311# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Cray-specific GPU pointer setup for acoustic source spatials
314# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
319! New line at end of file is required for FYPP
320# 6 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp" 2
321
322!> @brief Forward and inverse FFT wrappers (FFTW/cuFFT/hipFFT) for azimuthal Fourier filtering in cylindrical geometries
323module m_fftw
324
325 use, intrinsic :: iso_c_binding
326
329 use m_mpi_proxy
330#if defined(MFC_GPU) && defined(__PGI)
331 use cufft
332#elif defined(MFC_GPU)
333 use hipfort
334 use hipfort_check
335 use hipfort_hipfft
336#endif
337
338 implicit none
339
341
342#if !defined(MFC_GPU)
343 include 'fftw3.f03'
344#endif
345
346 type(c_ptr) :: fwd_plan, bwd_plan
349 real(c_double), pointer :: data_real(:) !< Real data
350 complex(c_double_complex), pointer :: data_cmplx(:) !< Complex data in Fourier space
351 complex(c_double_complex), pointer :: data_fltr_cmplx(:) !< Filtered complex data in Fourier space
352#if defined(MFC_GPU)
353
354# 38 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
355#if defined(MFC_OpenACC)
356# 38 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
357!$acc declare create(real_size, cmplx_size, x_size, batch_size, Nfq, i2)
358# 38 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
359#elif defined(MFC_OpenMP)
360# 38 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
361!$omp declare target (real_size, cmplx_size, x_size, batch_size, Nfq, i2)
362# 38 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
363#endif
364
365 real(dp), allocatable, target :: data_real_gpu(:)
366 complex(dp), allocatable, target :: data_cmplx_gpu(:)
367 complex(dp), allocatable, target :: data_fltr_cmplx_gpu(:)
368
369# 43 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
370#if defined(MFC_OpenACC)
371# 43 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
372!$acc declare create(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
373# 43 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
374#elif defined(MFC_OpenMP)
375# 43 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
376!$omp declare target (data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
377# 43 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
378#endif
379
380 !> @cond
381#if defined(__PGI)
382 integer :: fwd_plan_gpu, bwd_plan_gpu
383#else
384 !> @endcond
386 !> @cond
387#endif
388 !> @endcond
389
390 integer, allocatable :: gpu_fft_size(:), iembed(:), oembed(:)
391 integer :: istride, ostride, rank
392#endif
393
394contains
395
396 !> Initialize the FFTW module
397 impure subroutine s_initialize_fftw_module
398
399 integer :: ierr !< Generic flag used to identify and report GPU errors
400 ! Size of input array going into DFT
401
402 real_size = p + 1
403 ! Size of output array coming out of DFT
404 cmplx_size = (p + 1)/2 + 1
405
406 x_size = m + 1
407 batch_size = x_size*sys_size
408
409#if defined(MFC_GPU)
410 rank = 1; istride = 1; ostride = 1
411 allocate (gpu_fft_size(1:rank), iembed(1:rank), oembed(1:rank))
412
414 iembed(1) = real_size
415 oembed(1) = cmplx_size
416
417# 81 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
418#if defined(MFC_OpenACC)
419# 81 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
420!$acc enter data copyin(real_size, cmplx_size, x_size, sys_size, batch_size, Nfq)
421# 81 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
422#elif defined(MFC_OpenMP)
423# 81 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
424!$omp target enter data map(to:real_size, cmplx_size, x_size, sys_size, batch_size, Nfq)
425# 81 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
426#endif
427
428# 82 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
429#if defined(MFC_OpenACC)
430# 82 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
431!$acc update device(real_size, cmplx_size, x_size, sys_size, batch_size)
432# 82 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
433#elif defined(MFC_OpenMP)
434# 82 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
435!$omp target update to(real_size, cmplx_size, x_size, sys_size, batch_size)
436# 82 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
437#endif
438#else
439 ! Allocate input and output DFT data sizes
440 fftw_real_data = fftw_alloc_real(int(real_size, c_size_t))
441 fftw_cmplx_data = fftw_alloc_complex(int(cmplx_size, c_size_t))
442 fftw_fltr_cmplx_data = fftw_alloc_complex(int(cmplx_size, c_size_t))
443 ! Associate input and output data pointers with allocated memory
444 call c_f_pointer(fftw_real_data, data_real, [real_size])
445 call c_f_pointer(fftw_cmplx_data, data_cmplx, [cmplx_size])
447
448 ! Generate plans for forward and backward DFTs
449 fwd_plan = fftw_plan_dft_r2c_1d(real_size, data_real, data_cmplx, fftw_estimate)
450 bwd_plan = fftw_plan_dft_c2r_1d(real_size, data_fltr_cmplx, data_real, fftw_estimate)
451#endif
452
453#if defined(MFC_GPU)
454#ifdef MFC_DEBUG
455# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
456 block
457# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
458 use iso_fortran_env, only: output_unit
459# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
460
461# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
462 print *, 'm_fftw.fpp:99: ', '@:ALLOCATE(data_real_gpu(1:real_size*x_size*sys_size))'
463# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
464
465# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
466 call flush (output_unit)
467# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
468 end block
469# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
470#endif
471# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
472 allocate (data_real_gpu(1:real_size*x_size*sys_size))
473# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
474
475# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
476
477# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
478#if defined(MFC_OpenACC)
479# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
480!$acc enter data create(data_real_gpu)
481# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
482#elif defined(MFC_OpenMP)
483# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
484!$omp target enter data map(always,alloc:data_real_gpu)
485# 99 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
486#endif
487#ifdef MFC_DEBUG
488# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
489 block
490# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
491 use iso_fortran_env, only: output_unit
492# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
493
494# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
495 print *, 'm_fftw.fpp:100: ', '@:ALLOCATE(data_cmplx_gpu(1:cmplx_size*x_size*sys_size))'
496# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
497
498# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
499 call flush (output_unit)
500# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
501 end block
502# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
503#endif
504# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
505 allocate (data_cmplx_gpu(1:cmplx_size*x_size*sys_size))
506# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
507
508# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
509
510# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
511#if defined(MFC_OpenACC)
512# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
513!$acc enter data create(data_cmplx_gpu)
514# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
515#elif defined(MFC_OpenMP)
516# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
517!$omp target enter data map(always,alloc:data_cmplx_gpu)
518# 100 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
519#endif
520#ifdef MFC_DEBUG
521# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
522 block
523# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
524 use iso_fortran_env, only: output_unit
525# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
526
527# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
528 print *, 'm_fftw.fpp:101: ', '@:ALLOCATE(data_fltr_cmplx_gpu(1:cmplx_size*x_size*sys_size))'
529# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
530
531# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
532 call flush (output_unit)
533# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
534 end block
535# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
536#endif
537# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
538 allocate (data_fltr_cmplx_gpu(1:cmplx_size*x_size*sys_size))
539# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
540
541# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
542
543# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
544#if defined(MFC_OpenACC)
545# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
546!$acc enter data create(data_fltr_cmplx_gpu)
547# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
548#elif defined(MFC_OpenMP)
549# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
550!$omp target enter data map(always,alloc:data_fltr_cmplx_gpu)
551# 101 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
552#endif
553
554#if defined(__PGI)
556 & cufft_d2z, batch_size)
558 & cufft_z2d, batch_size)
559#else
561 & hipfft_d2z, batch_size)
563 & hipfft_z2d, batch_size)
564#endif
565#endif
566
567 end subroutine s_initialize_fftw_module
568
569 !> Apply a Fourier low-pass filter in the azimuthal direction to remove high-frequency content
570 impure subroutine s_apply_fourier_filter(q_cons_vf)
571
572 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
573 integer :: i, j, k, l !< Generic loop iterators
574 integer :: ierr !< Generic flag used to identify and report GPU errors
575 ! Restrict filter to processors that have cells adjacent to axis
576
577 if (bc_y%beg >= 0) return
578#if defined(MFC_GPU)
579
580# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
581
582# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
583#if defined(MFC_OpenACC)
584# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
585!$acc parallel loop collapse(3) gang vector default(present)
586# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
587#elif defined(MFC_OpenMP)
588# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
589
590# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
591
592# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
593
594# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
595!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
596# 128 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
597#endif
598 do k = 1, sys_size
599 do j = 0, m
600 do l = 1, cmplx_size
601 data_fltr_cmplx_gpu(l + j*cmplx_size + (k - 1)*cmplx_size*x_size) = (0_dp, 0_dp)
602 end do
603 end do
604 end do
605
606# 136 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
607#if defined(MFC_OpenACC)
608# 136 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
609!$acc end parallel loop
610# 136 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
611#elif defined(MFC_OpenMP)
612# 136 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
613
614# 136 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
615!$omp end target teams loop
616# 136 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
617#endif
618
619
620# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
621
622# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
623#if defined(MFC_OpenACC)
624# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
625!$acc parallel loop collapse(3) gang vector default(present)
626# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
627#elif defined(MFC_OpenMP)
628# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
629
630# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
631
632# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
633
634# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
635!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
636# 138 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
637#endif
638 do k = 1, sys_size
639 do j = 0, m
640 do l = 0, p
641 data_real_gpu(l + j*real_size + 1 + (k - 1)*real_size*x_size) = q_cons_vf(k)%sf(j, 0, l)
642 end do
643 end do
644 end do
645
646# 146 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
647#if defined(MFC_OpenACC)
648# 146 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
649!$acc end parallel loop
650# 146 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
651#elif defined(MFC_OpenMP)
652# 146 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
653
654# 146 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
655!$omp end target teams loop
656# 146 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
657#endif
658
659
660# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
661#if defined(MFC_OpenACC)
662# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
663!$acc host_data use_device(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
664# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
665#if defined(__PGI)
666# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
667 ierr = cufftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
668# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
669#else
670# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
671 ierr = hipfftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
672# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
673 call hipcheck(hipdevicesynchronize())
674# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
675#endif
676# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
677!$acc end host_data
678# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
679#elif defined(MFC_OpenMP)
680# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
681!$omp target data use_device_addr(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
682# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
683#if defined(__PGI)
684# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
685 ierr = cufftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
686# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
687#else
688# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
689 ierr = hipfftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
690# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
691 call hipcheck(hipdevicesynchronize())
692# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
693#endif
694# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
695!$omp end target data
696# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
697#else
698# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
699#if defined(__PGI)
700# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
701 ierr = cufftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
702# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
703#else
704# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
705 ierr = hipfftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
706# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
707 call hipcheck(hipdevicesynchronize())
708# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
709#endif
710# 148 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
711#endif
712# 156 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
713 nfq = 3
714
715# 157 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
716#if defined(MFC_OpenACC)
717# 157 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
718!$acc update device(Nfq)
719# 157 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
720#elif defined(MFC_OpenMP)
721# 157 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
722!$omp target update to(Nfq)
723# 157 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
724#endif
725
726
727# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
728
729# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
730#if defined(MFC_OpenACC)
731# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
732!$acc parallel loop collapse(3) gang vector default(present)
733# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
734#elif defined(MFC_OpenMP)
735# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
736
737# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
738
739# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
740
741# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
742!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
743# 159 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
744#endif
745 do k = 1, sys_size
746 do j = 0, m
747 do l = 1, nfq
750 end do
751 end do
752 end do
753
754# 168 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
755#if defined(MFC_OpenACC)
756# 168 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
757!$acc end parallel loop
758# 168 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
759#elif defined(MFC_OpenMP)
760# 168 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
761
762# 168 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
763!$omp end target teams loop
764# 168 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
765#endif
766
767
768# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
769#if defined(MFC_OpenACC)
770# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
771!$acc host_data use_device(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
772# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
773#if defined(__PGI)
774# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
775 ierr = cufftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
776# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
777#else
778# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
779 ierr = hipfftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
780# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
781 call hipcheck(hipdevicesynchronize())
782# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
783#endif
784# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
785!$acc end host_data
786# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
787#elif defined(MFC_OpenMP)
788# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
789!$omp target data use_device_addr(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
790# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
791#if defined(__PGI)
792# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
793 ierr = cufftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
794# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
795#else
796# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
797 ierr = hipfftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
798# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
799 call hipcheck(hipdevicesynchronize())
800# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
801#endif
802# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
803!$omp end target data
804# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
805#else
806# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
807#if defined(__PGI)
808# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
809 ierr = cufftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
810# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
811#else
812# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
813 ierr = hipfftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
814# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
815 call hipcheck(hipdevicesynchronize())
816# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
817#endif
818# 170 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
819#endif
820# 178 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
821
822
823# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
824
825# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
826#if defined(MFC_OpenACC)
827# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
828!$acc parallel loop collapse(3) gang vector default(present)
829# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
830#elif defined(MFC_OpenMP)
831# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
832
833# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
834
835# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
836
837# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
838!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
839# 179 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
840#endif
841 do k = 1, sys_size
842 do j = 0, m
843 do l = 0, p
844 data_real_gpu(l + j*real_size + 1 + (k - 1)*real_size*x_size) = data_real_gpu(l + j*real_size + 1 + (k - 1) &
845 & *real_size*x_size)/real(real_size, dp)
846 q_cons_vf(k)%sf(j, 0, l) = data_real_gpu(l + j*real_size + 1 + (k - 1)*real_size*x_size)
847 end do
848 end do
849 end do
850
851# 189 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
852#if defined(MFC_OpenACC)
853# 189 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
854!$acc end parallel loop
855# 189 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
856#elif defined(MFC_OpenMP)
857# 189 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
858
859# 189 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
860!$omp end target teams loop
861# 189 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
862#endif
863
864 do i = 1, fourier_rings
865 i2 = i
866
867# 193 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
868#if defined(MFC_OpenACC)
869# 193 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
870!$acc update device(i2)
871# 193 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
872#elif defined(MFC_OpenMP)
873# 193 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
874!$omp target update to(i2)
875# 193 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
876#endif
877
878
879# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
880
881# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
882#if defined(MFC_OpenACC)
883# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
884!$acc parallel loop collapse(3) gang vector default(present)
885# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
886#elif defined(MFC_OpenMP)
887# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
888
889# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
890
891# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
892
893# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
894!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
895# 195 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
896#endif
897 do k = 1, sys_size
898 do j = 0, m
899 do l = 1, cmplx_size
900 data_fltr_cmplx_gpu(l + j*cmplx_size + (k - 1)*cmplx_size*x_size) = (0_dp, 0_dp)
901 end do
902 end do
903 end do
904
905# 203 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
906#if defined(MFC_OpenACC)
907# 203 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
908!$acc end parallel loop
909# 203 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
910#elif defined(MFC_OpenMP)
911# 203 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
912
913# 203 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
914!$omp end target teams loop
915# 203 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
916#endif
917
918
919# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
920
921# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
922#if defined(MFC_OpenACC)
923# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
924!$acc parallel loop collapse(3) gang vector default(present)
925# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
926#elif defined(MFC_OpenMP)
927# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
928
929# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
930
931# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
932
933# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
934!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
935# 205 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
936#endif
937 do k = 1, sys_size
938 do j = 0, m
939 do l = 0, p
940 data_real_gpu(l + j*real_size + 1 + (k - 1)*real_size*x_size) = q_cons_vf(k)%sf(j, i2, l)
941 end do
942 end do
943 end do
944
945# 213 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
946#if defined(MFC_OpenACC)
947# 213 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
948!$acc end parallel loop
949# 213 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
950#elif defined(MFC_OpenMP)
951# 213 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
952
953# 213 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
954!$omp end target teams loop
955# 213 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
956#endif
957
958
959# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
960#if defined(MFC_OpenACC)
961# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
962!$acc host_data use_device(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
963# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
964#if defined(__PGI)
965# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
966 ierr = cufftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
967# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
968#else
969# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
970 ierr = hipfftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
971# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
972 call hipcheck(hipdevicesynchronize())
973# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
974#endif
975# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
976!$acc end host_data
977# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
978#elif defined(MFC_OpenMP)
979# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
980!$omp target data use_device_addr(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
981# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
982#if defined(__PGI)
983# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
984 ierr = cufftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
985# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
986#else
987# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
988 ierr = hipfftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
989# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
990 call hipcheck(hipdevicesynchronize())
991# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
992#endif
993# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
994!$omp end target data
995# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
996#else
997# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
998#if defined(__PGI)
999# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1000 ierr = cufftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
1001# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1002#else
1003# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1004 ierr = hipfftexecd2z(fwd_plan_gpu, data_real_gpu, data_cmplx_gpu)
1005# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1006 call hipcheck(hipdevicesynchronize())
1007# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1008#endif
1009# 215 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1010#endif
1011# 223 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1012
1013 nfq = min(floor(2_dp*real(i, dp)*pi), cmplx_size)
1014
1015# 225 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1016#if defined(MFC_OpenACC)
1017# 225 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1018!$acc update device(Nfq)
1019# 225 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1020#elif defined(MFC_OpenMP)
1021# 225 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1022!$omp target update to(Nfq)
1023# 225 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1024#endif
1025
1026
1027# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1028
1029# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1030#if defined(MFC_OpenACC)
1031# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1032!$acc parallel loop collapse(3) gang vector default(present)
1033# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1034#elif defined(MFC_OpenMP)
1035# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1036
1037# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1038
1039# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1040
1041# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1042!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
1043# 227 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1044#endif
1045 do k = 1, sys_size
1046 do j = 0, m
1047 do l = 1, nfq
1049 & - 1)*cmplx_size*x_size)
1050 end do
1051 end do
1052 end do
1053
1054# 236 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1055#if defined(MFC_OpenACC)
1056# 236 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1057!$acc end parallel loop
1058# 236 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1059#elif defined(MFC_OpenMP)
1060# 236 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1061
1062# 236 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1063!$omp end target teams loop
1064# 236 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1065#endif
1066
1067
1068# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1069#if defined(MFC_OpenACC)
1070# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1071!$acc host_data use_device(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
1072# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1073#if defined(__PGI)
1074# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1075 ierr = cufftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
1076# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1077#else
1078# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1079 ierr = hipfftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
1080# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1081 call hipcheck(hipdevicesynchronize())
1082# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1083#endif
1084# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1085!$acc end host_data
1086# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1087#elif defined(MFC_OpenMP)
1088# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1089!$omp target data use_device_addr(data_real_gpu, data_cmplx_gpu, data_fltr_cmplx_gpu)
1090# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1091#if defined(__PGI)
1092# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1093 ierr = cufftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
1094# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1095#else
1096# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1097 ierr = hipfftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
1098# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1099 call hipcheck(hipdevicesynchronize())
1100# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1101#endif
1102# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1103!$omp end target data
1104# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1105#else
1106# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1107#if defined(__PGI)
1108# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1109 ierr = cufftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
1110# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1111#else
1112# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1113 ierr = hipfftexecz2d(bwd_plan_gpu, data_fltr_cmplx_gpu, data_real_gpu)
1114# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1115 call hipcheck(hipdevicesynchronize())
1116# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1117#endif
1118# 238 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1119#endif
1120# 246 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1121
1122
1123# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1124
1125# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1126#if defined(MFC_OpenACC)
1127# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1128!$acc parallel loop collapse(3) gang vector default(present)
1129# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1130#elif defined(MFC_OpenMP)
1131# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1132
1133# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1134
1135# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1136
1137# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1138!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
1139# 247 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1140#endif
1141 do k = 1, sys_size
1142 do j = 0, m
1143 do l = 0, p
1144 data_real_gpu(l + j*real_size + 1 + (k - 1)*real_size*x_size) = data_real_gpu(l + j*real_size + 1 + (k &
1145 & - 1)*real_size*x_size)/real(real_size, dp)
1146 q_cons_vf(k)%sf(j, i2, l) = data_real_gpu(l + j*real_size + 1 + (k - 1)*real_size*x_size)
1147 end do
1148 end do
1149 end do
1150
1151# 257 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1152#if defined(MFC_OpenACC)
1153# 257 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1154!$acc end parallel loop
1155# 257 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1156#elif defined(MFC_OpenMP)
1157# 257 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1158
1159# 257 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1160!$omp end target teams loop
1161# 257 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1162#endif
1163 end do
1164#else
1165 nfq = 3
1166 do j = 0, m
1167 do k = 1, sys_size
1168 data_fltr_cmplx(:) = (0_dp, 0_dp)
1169 data_real(1:p + 1) = q_cons_vf(k)%sf(j, 0,0:p)
1170 call fftw_execute_dft_r2c(fwd_plan, data_real, data_cmplx)
1172 call fftw_execute_dft_c2r(bwd_plan, data_fltr_cmplx, data_real)
1173 data_real(:) = data_real(:)/real(real_size, dp)
1174 q_cons_vf(k)%sf(j, 0,0:p) = data_real(1:p + 1)
1175 end do
1176 end do
1177
1178 ! Apply Fourier filter to additional rings
1179 do i = 1, fourier_rings
1180 nfq = min(floor(2_dp*real(i, dp)*pi), cmplx_size)
1181 do j = 0, m
1182 do k = 1, sys_size
1183 data_fltr_cmplx(:) = (0_dp, 0_dp)
1184 data_real(1:p + 1) = q_cons_vf(k)%sf(j, i,0:p)
1185 call fftw_execute_dft_r2c(fwd_plan, data_real, data_cmplx)
1187 call fftw_execute_dft_c2r(bwd_plan, data_fltr_cmplx, data_real)
1188 data_real(:) = data_real(:)/real(real_size, dp)
1189 q_cons_vf(k)%sf(j, i,0:p) = data_real(1:p + 1)
1190 end do
1191 end do
1192 end do
1193#endif
1194
1195 end subroutine s_apply_fourier_filter
1196
1197 !> Finalize the FFTW module
1198 impure subroutine s_finalize_fftw_module
1199
1200#if defined(MFC_GPU)
1201 integer :: ierr !< Generic flag used to identify and report GPU errors
1202
1203#ifdef MFC_DEBUG
1204# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1205 block
1206# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1207 use iso_fortran_env, only: output_unit
1208# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1209
1210# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1211 print *, 'm_fftw.fpp:298: ', '@:DEALLOCATE(data_real_gpu, data_fltr_cmplx_gpu, data_cmplx_gpu)'
1212# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1213
1214# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1215 call flush (output_unit)
1216# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1217 end block
1218# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1219#endif
1220# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1221
1222# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1223#if defined(MFC_OpenACC)
1224# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1225!$acc exit data delete(data_real_gpu, data_fltr_cmplx_gpu, data_cmplx_gpu)
1226# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1227#elif defined(MFC_OpenMP)
1228# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1229!$omp target exit data map(release:data_real_gpu, data_fltr_cmplx_gpu, data_cmplx_gpu)
1230# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1231#endif
1232# 298 "/home/runner/work/MFC/MFC/src/simulation/m_fftw.fpp"
1234#if defined(__PGI)
1235 ierr = cufftdestroy(fwd_plan_gpu)
1236 ierr = cufftdestroy(bwd_plan_gpu)
1237#else
1238 ierr = hipfftdestroy(fwd_plan_gpu)
1239 ierr = hipfftdestroy(bwd_plan_gpu)
1240#endif
1241#else
1242 call fftw_free(fftw_real_data)
1243 call fftw_free(fftw_cmplx_data)
1244 call fftw_free(fftw_fltr_cmplx_data)
1245
1246 call fftw_destroy_plan(fwd_plan)
1247 call fftw_destroy_plan(bwd_plan)
1248#endif
1249
1250 end subroutine s_finalize_fftw_module
1251
1252end module m_fftw
type(scalar_field), dimension(sys_size), intent(inout) q_cons_vf
integer, intent(in) k
integer, intent(in) j
integer, intent(in) l
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Forward and inverse FFT wrappers (FFTW/cuFFT/hipFFT) for azimuthal Fourier filtering in cylindrical g...
integer rank
type(c_ptr) fftw_real_data
complex(dp), dimension(:), allocatable, target data_fltr_cmplx_gpu
integer x_size
complex(c_double_complex), dimension(:), pointer data_fltr_cmplx
Filtered complex data in Fourier space.
real(dp), dimension(:), allocatable, target data_real_gpu
complex(c_double_complex), dimension(:), pointer data_cmplx
Complex data in Fourier space.
type(c_ptr) bwd_plan
integer ostride
integer batch_size
type(c_ptr) fftw_cmplx_data
real(c_double), dimension(:), pointer data_real
Real data.
impure subroutine, public s_apply_fourier_filter(q_cons_vf)
Apply a Fourier low-pass filter in the azimuthal direction to remove high-frequency content.
integer real_size
integer, dimension(:), allocatable iembed
type(c_ptr) bwd_plan_gpu
integer, dimension(:), allocatable gpu_fft_size
complex(dp), dimension(:), allocatable, target data_cmplx_gpu
type(c_ptr) fftw_fltr_cmplx_data
integer istride
integer nfq
type(c_ptr) fwd_plan_gpu
impure subroutine, public s_initialize_fftw_module
Initialize the FFTW module.
impure subroutine, public s_finalize_fftw_module
Finalize the FFTW module.
integer, dimension(:), allocatable oembed
type(c_ptr) fwd_plan
integer i2
integer cmplx_size
Global parameters for the computational domain, fluid properties, and simulation algorithm configurat...
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.