MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_sim_helpers.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
2!>
3!! @file
4!! @brief Contains module m_sim_helpers
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
7! This file exists so that Fypp can be run without generating case.fpp files for
8! each target. This is useful when generating documentation, for example. This
9! should also let MFC be built with CMake directly, without invoking mfc.sh.
10
11! For pre-process.
12# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
13
14! For moving immersed boundaries in simulation
15# 12 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
16# 6 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp" 2
17# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
18# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
19# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
20# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
23# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
25
26# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
27# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29
30# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31
32# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33
34# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35
36# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39
40# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 145 "/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# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60
61# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
62
63# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
64
65# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
66
67# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68
69# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
70
71# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
72
73# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
74! New line at end of file is required for FYPP
75# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
76
77# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
80# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
82
83# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
84
85# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86
87# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88
89# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90
91# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92
93# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
94
95# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
96
97# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
98
99# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
100
101# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
102
103# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
104
105# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
106
107# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
108
109# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110
111# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112
113# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139
140# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
141
142# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
143
144# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
145
146# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
147
148# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
149
150# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
151
152# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
153! New line at end of file is required for FYPP
154# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
155# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
156# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
157# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
160# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162
163# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
164# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166
167# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
168
169# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170
171# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172
173# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
174
175# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176
177# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
178
179# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
180
181# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
182! New line at end of file is required for FYPP
183# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
184
185# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
186
187# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
188
189# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
190
191# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
192
193# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
194
195# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
196
197# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
198
199# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
200
201# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
202
203# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204
205# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206
207# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234
235# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236
237# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238
239# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240! New line at end of file is required for FYPP
241# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
242
243! GPU parallel region (scalar reductions, maxval/minval)
244# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245
246! GPU parallel loop over threads (most common GPU macro)
247# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
248
249! Required closing for GPU_PARALLEL_LOOP
250# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251
252! Mark routine for device compilation
253# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
254
255! Declare device-resident data
256# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258! Inner loop within a GPU parallel region
259# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261! Scoped GPU data region
262# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264! Host code with device pointers (for MPI with GPU buffers)
265# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267! Allocate device memory (unscoped)
268# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
269
270! Free device memory
271# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273! Atomic operation on device
274# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
275
276! End atomic capture block
277# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
278
279! Copy data between host and device
280# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
281
282! Synchronization barrier
283# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
284
285! Import GPU library module (openacc or omp_lib)
286# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
287
288! Emit code only for AMD compiler
289# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290
291! Emit code for non-Cray compilers
292# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
293
294! Emit code only for Cray compiler
295# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
296
297! Emit code for non-NVIDIA compilers
298# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
299
300# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
301# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302! New line at end of file is required for FYPP
303# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
304
305# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
308! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
309! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
310# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
311
312! Allocate and create GPU device memory
313# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
314
315! Free GPU device memory and deallocate
316# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318! Cray-specific GPU pointer setup for vector fields
319# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
320
321! Cray-specific GPU pointer setup for scalar fields
322# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
323
324! Cray-specific GPU pointer setup for acoustic source spatials
325# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
326
327# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
328
329# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
330! New line at end of file is required for FYPP
331# 7 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp" 2
332
333!> @brief Simulation helper routines for enthalpy computation, CFL calculation, and stability checks
335
339
340 implicit none
341
343
344contains
345
346 !> Computes the modified dtheta for Fourier filtering in azimuthal direction
347 function f_compute_filtered_dtheta(k, l) result(fltr_dtheta)
348
349
350# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
351#if MFC_OpenACC
352# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
353!$acc routine seq
354# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
355#elif MFC_OpenMP
356# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
357
358# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
359
360# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
361!$omp declare target device_type(any)
362# 24 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
363#endif
364 integer, intent(in) :: k, l
365 real(wp) :: fltr_dtheta
366 integer :: nfq
367
368 if (grid_geometry == 3) then
369 if (k == 0) then
370 fltr_dtheta = 2._wp*pi*y_cb(0)/3._wp
371 else if (k <= fourier_rings) then
372 nfq = min(floor(2._wp*real(k, wp)*pi), (p + 1)/2 + 1)
373 fltr_dtheta = 2._wp*pi*y_cb(k - 1)/real(nfq, wp)
374 else
375 fltr_dtheta = y_cb(k - 1)*dz(l)
376 end if
377 else
378 fltr_dtheta = 0._wp
379 end if
380
381 end function f_compute_filtered_dtheta
382
383 !> Computes inviscid CFL terms for multi-dimensional cases (2D/3D only)
384 function f_compute_multidim_cfl_terms(vel, c, j, k, l) result(cfl_terms)
385
386
387# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
388#if MFC_OpenACC
389# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
390!$acc routine seq
391# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
392#elif MFC_OpenMP
393# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
394
395# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
396
397# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
398!$omp declare target device_type(any)
399# 47 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
400#endif
401 real(wp), dimension(num_vels), intent(in) :: vel
402 real(wp), intent(in) :: c
403 integer, intent(in) :: j, k, l
404 real(wp) :: cfl_terms
405 real(wp) :: fltr_dtheta
406
407 fltr_dtheta = f_compute_filtered_dtheta(k, l)
408
409 if (p > 0) then
410 ! 3D
411# 59 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
412 if (grid_geometry == 3) then
413 cfl_terms = min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c), fltr_dtheta/(abs(vel(3)) + c))
414 else
415 cfl_terms = min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c), dz(l)/(abs(vel(3)) + c))
416 end if
417# 65 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
418 else
419 ! 2D
420 cfl_terms = min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c))
421 end if
422
424
425 !> Computes enthalpy
426 subroutine s_compute_enthalpy(q_prim_vf, pres, rho, gamma, pi_inf, Re, H, alpha, vel, vel_sum, qv, j, k, l)
427
428
429# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
430#ifdef _CRAYFTN
431# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
432#if MFC_OpenACC
433# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
434!$acc routine seq
435# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
436#elif MFC_OpenMP
437# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
438
439# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
440
441# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
442!$omp declare target device_type(any)
443# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
444#else
445# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
446!DIR$ INLINEALWAYS s_compute_enthalpy
447# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
448#endif
449# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
450#elif MFC_OpenACC
451# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
452!$acc routine seq
453# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
454#elif MFC_OpenMP
455# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
456
457# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
458
459# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
460!$omp declare target device_type(any)
461# 75 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
462#endif
463
464 type(scalar_field), intent(in), dimension(sys_size) :: q_prim_vf
465# 82 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
466 real(wp), intent(inout), dimension(num_fluids) :: alpha
467 real(wp), intent(inout), dimension(num_vels) :: vel
468# 85 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
469 real(wp), intent(inout) :: rho, gamma, pi_inf, vel_sum, h, pres
470 real(wp), intent(out) :: qv
471 integer, intent(in) :: j, k, l
472 real(wp), dimension(2), intent(inout) :: re
473# 92 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
474 real(wp), dimension(num_fluids) :: alpha_rho, gs
475# 94 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
476 real(wp) :: e, g_local
477 integer :: i
478
479 call s_compute_species_fraction(q_prim_vf, j, k, l, alpha_rho, alpha)
480
481 if (elasticity) then
482 call s_convert_species_to_mixture_variables_acc(rho, gamma, pi_inf, qv, alpha, alpha_rho, re, g_local, gs)
483 else
484 call s_convert_species_to_mixture_variables_acc(rho, gamma, pi_inf, qv, alpha, alpha_rho, re)
485 end if
486
487 if (igr) then
488
489# 106 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
490#if defined(MFC_OpenACC)
491# 106 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
492!$acc loop seq
493# 106 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
494#elif defined(MFC_OpenMP)
495# 106 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
496
497# 106 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
498#endif
499 do i = 1, num_vels
500 vel(i) = q_prim_vf(eqn_idx%cont%end + i)%sf(j, k, l)/rho
501 end do
502 else
503
504# 111 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
505#if defined(MFC_OpenACC)
506# 111 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
507!$acc loop seq
508# 111 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
509#elif defined(MFC_OpenMP)
510# 111 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
511
512# 111 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
513#endif
514 do i = 1, num_vels
515 vel(i) = q_prim_vf(eqn_idx%cont%end + i)%sf(j, k, l)
516 end do
517 end if
518
519 vel_sum = 0._wp
520
521# 118 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
522#if defined(MFC_OpenACC)
523# 118 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
524!$acc loop seq
525# 118 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
526#elif defined(MFC_OpenMP)
527# 118 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
528
529# 118 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
530#endif
531 do i = 1, num_vels
532 vel_sum = vel_sum + vel(i)**2._wp
533 end do
534
535 if (igr) then
536 e = q_prim_vf(eqn_idx%E)%sf(j, k, l)
537 pres = (e - pi_inf - qv - 5.e-1_wp*rho*vel_sum)/gamma
538 else
539 pres = q_prim_vf(eqn_idx%E)%sf(j, k, l)
540 e = gamma*pres + pi_inf + 5.e-1_wp*rho*vel_sum + qv
541 end if
542
543 ! Adjust energy for hyperelasticity
544 if (hyperelasticity) then
545 e = e + g_local*q_prim_vf(eqn_idx%xi%end + 1)%sf(j, k, l)
546 end if
547
548 h = (e + pres)/rho
549
550 end subroutine s_compute_enthalpy
551
552 !> Computes stability criterion for a specified dt
553 subroutine s_compute_stability_from_dt(vel, c, rho, Re_l, j, k, l, icfl_sf, vcfl_sf, Rc_sf)
554
555
556# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
557#if MFC_OpenACC
558# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
559!$acc routine seq
560# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
561#elif MFC_OpenMP
562# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
563
564# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
565
566# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
567!$omp declare target device_type(any)
568# 143 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
569#endif
570 real(wp), intent(in), dimension(num_vels) :: vel
571 real(wp), intent(in) :: c, rho
572 real(wp), dimension(0:m,0:n,0:p), intent(inout) :: icfl_sf
573 real(wp), dimension(0:m,0:n,0:p), intent(inout), optional :: vcfl_sf, rc_sf
574 real(wp), dimension(2), intent(in) :: re_l
575 integer, intent(in) :: j, k, l
576 real(wp) :: fltr_dtheta
577
578 ! Inviscid CFL calculation
579 if (p > 0 .or. n > 0) then
580 ! 2D/3D
581 icfl_sf(j, k, l) = dt/f_compute_multidim_cfl_terms(vel, c, j, k, l)
582 else
583 ! 1D
584 icfl_sf(j, k, l) = (dt/dx(j))*(abs(vel(1)) + c)
585 end if
586
587 ! Viscous calculations
588 if (viscous) then
589 if (p > 0) then
590# 165 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
591 ! 3D
592 if (grid_geometry == 3) then
593 fltr_dtheta = f_compute_filtered_dtheta(k, l)
594 vcfl_sf(j, k, l) = maxval(dt/re_l/rho)/min(dx(j), dy(k), fltr_dtheta)**2._wp
595 rc_sf(j, k, l) = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c), &
596 & fltr_dtheta*(abs(vel(3)) + c))/maxval(1._wp/re_l)
597 else
598 vcfl_sf(j, k, l) = maxval(dt/re_l/rho)/min(dx(j), dy(k), dz(l))**2._wp
599 rc_sf(j, k, l) = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c), &
600 & dz(l)*(abs(vel(3)) + c))/maxval(1._wp/re_l)
601 end if
602# 177 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
603 else if (n > 0) then
604 ! 2D
605 vcfl_sf(j, k, l) = maxval(dt/re_l/rho)/min(dx(j), dy(k))**2._wp
606 rc_sf(j, k, l) = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c))/maxval(1._wp/re_l)
607 else
608 ! 1D
609 vcfl_sf(j, k, l) = maxval(dt/re_l/rho)/dx(j)**2._wp
610 rc_sf(j, k, l) = dx(j)*(abs(vel(1)) + c)/maxval(1._wp/re_l)
611 end if
612 end if
613
614 end subroutine s_compute_stability_from_dt
615
616 !> Computes dt for a specified CFL number
617 subroutine s_compute_dt_from_cfl(vel, c, max_dt, rho, Re_l, j, k, l)
618
619
620# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
621#if MFC_OpenACC
622# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
623!$acc routine seq
624# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
625#elif MFC_OpenMP
626# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
627
628# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
629
630# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
631!$omp declare target device_type(any)
632# 193 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
633#endif
634 real(wp), dimension(num_vels), intent(in) :: vel
635 real(wp), intent(in) :: c, rho
636 real(wp), dimension(0:m,0:n,0:p), intent(inout) :: max_dt
637 real(wp), dimension(2), intent(in) :: re_l
638 integer, intent(in) :: j, k, l
639 real(wp) :: icfl_dt, vcfl_dt
640 real(wp) :: fltr_dtheta
641
642 ! Inviscid CFL calculation
643 if (p > 0 .or. n > 0) then
644 ! 2D/3D cases
645 icfl_dt = cfl_target*f_compute_multidim_cfl_terms(vel, c, j, k, l)
646 else
647 ! 1D case
648 icfl_dt = cfl_target*(dx(j)/(abs(vel(1)) + c))
649 end if
650
651 ! Viscous calculations
652 if (viscous) then
653 if (p > 0) then
654 ! 3D
655 if (grid_geometry == 3) then
656 fltr_dtheta = f_compute_filtered_dtheta(k, l)
657 vcfl_dt = cfl_target*(min(dx(j), dy(k), fltr_dtheta)**2._wp)/maxval(1/(rho*re_l))
658 else
659 vcfl_dt = cfl_target*(min(dx(j), dy(k), dz(l))**2._wp)/maxval(1/(rho*re_l))
660 end if
661 else if (n > 0) then
662 ! 2D
663 vcfl_dt = cfl_target*(min(dx(j), dy(k))**2._wp)/maxval((1/re_l)/rho)
664 else
665 ! 1D
666 vcfl_dt = cfl_target*(dx(j)**2._wp)/maxval(1/(rho*re_l))
667 end if
668 end if
669
670 if (any(re_size > 0)) then
671 max_dt(j, k, l) = min(icfl_dt, vcfl_dt)
672 else
673 max_dt(j, k, l) = icfl_dt
674 end if
675
676 end subroutine s_compute_dt_from_cfl
677
678end module m_sim_helpers
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.
Global parameters for the computational domain, fluid properties, and simulation algorithm configurat...
integer, dimension(2) re_size
real(wp), dimension(:), allocatable, target y_cb
real(wp), dimension(:), allocatable, target dy
real(wp), dimension(:), allocatable, target dz
real(wp), dimension(:), allocatable, target dx
Simulation helper routines for enthalpy computation, CFL calculation, and stability checks.
subroutine, public s_compute_enthalpy(q_prim_vf, pres, rho, gamma, pi_inf, re, h, alpha, vel, vel_sum, qv, j, k, l)
Computes enthalpy.
subroutine, public s_compute_dt_from_cfl(vel, c, max_dt, rho, re_l, j, k, l)
Computes dt for a specified CFL number.
real(wp) function f_compute_filtered_dtheta(k, l)
Computes the modified dtheta for Fourier filtering in azimuthal direction.
subroutine, public s_compute_stability_from_dt(vel, c, rho, re_l, j, k, l, icfl_sf, vcfl_sf, rc_sf)
Computes stability criterion for a specified dt.
real(wp) function f_compute_multidim_cfl_terms(vel, c, j, k, l)
Computes inviscid CFL terms for multi-dimensional cases (2D/3D only).
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
subroutine, public s_compute_species_fraction(q_vf, k, l, r, alpha_rho_k, alpha_k)
Compute partial densities and volume fractions.
subroutine, public s_convert_species_to_mixture_variables_acc(rho_k, gamma_k, pi_inf_k, qv_k, alpha_k, alpha_rho_k, re_k, g_k, g)
GPU-accelerated conversion of species volume fractions and partial densities to mixture density,...
Derived type annexing a scalar field (SF).