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