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.
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, vcfl, Rc, ccfl)
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), intent(inout) :: icfl
573 real(wp), intent(inout) :: vcfl, rc, ccfl
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 icfl = dt/f_compute_multidim_cfl_terms(vel, c, j, k, l)
581 else
582 icfl = (dt/dx(j))*(abs(vel(1)) + c)
583 end if
584
585 ! Viscous calculations
586 if (viscous) then
587 if (p > 0) then
588# 163 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
589 if (grid_geometry == 3) then
590 fltr_dtheta = f_compute_filtered_dtheta(k, l)
591 vcfl = maxval(dt/re_l/rho)/min(dx(j), dy(k), fltr_dtheta)**2._wp
592 rc = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c), fltr_dtheta*(abs(vel(3)) + c))/maxval(1._wp/re_l)
593 else
594 vcfl = maxval(dt/re_l/rho)/min(dx(j), dy(k), dz(l))**2._wp
595 rc = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c), dz(l)*(abs(vel(3)) + c))/maxval(1._wp/re_l)
596 end if
597# 172 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
598 else if (n > 0) then
599 vcfl = maxval(dt/re_l/rho)/min(dx(j), dy(k))**2._wp
600 rc = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c))/maxval(1._wp/re_l)
601 else
602 vcfl = maxval(dt/re_l/rho)/dx(j)**2._wp
603 rc = dx(j)*(abs(vel(1)) + c)/maxval(1._wp/re_l)
604 end if
605 end if
606
607 ! Capillary CFL calculation
608 if (surface_tension) then
609 if (p > 0) then
610# 185 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
611 if (grid_geometry == 3) then
612 fltr_dtheta = f_compute_filtered_dtheta(k, l)
613 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*min(dx(j), dy(k), fltr_dtheta)**3._wp))
614 else
615 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*min(dx(j), dy(k), dz(l))**3._wp))
616 end if
617# 192 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
618 else if (n > 0) then
619 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*min(dx(j), dy(k))**3._wp))
620 else
621 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*dx(j)**3._wp))
622 end if
623 end if
624
625 end subroutine s_compute_stability_from_dt
626
627 !> Computes dt for a specified CFL number
628 subroutine s_compute_dt_from_cfl(vel, c, max_dt, rho, Re_l, j, k, l)
629
630
631# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
632#if MFC_OpenACC
633# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
634!$acc routine seq
635# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
636#elif MFC_OpenMP
637# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
638
639# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
640
641# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
642!$omp declare target device_type(any)
643# 204 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
644#endif
645 real(wp), dimension(num_vels), intent(in) :: vel
646 real(wp), intent(in) :: c, rho
647 real(wp), intent(inout) :: max_dt
648 real(wp), dimension(2), intent(in) :: re_l
649 integer, intent(in) :: j, k, l
650 real(wp) :: vcfl_dt, ccfl_dt
651 real(wp) :: fltr_dtheta
652
653 ! Inviscid CFL calculation
654 if (p > 0 .or. n > 0) then
655 max_dt = cfl_target*f_compute_multidim_cfl_terms(vel, c, j, k, l)
656 else
657 max_dt = cfl_target*(dx(j)/(abs(vel(1)) + c))
658 end if
659
660 ! Viscous calculations
661 if (viscous) then
662 if (p > 0) then
663 if (grid_geometry == 3) then
664 fltr_dtheta = f_compute_filtered_dtheta(k, l)
665 vcfl_dt = cfl_target*(min(dx(j), dy(k), fltr_dtheta)**2._wp)/maxval(1/(rho*re_l))
666 else
667 vcfl_dt = cfl_target*(min(dx(j), dy(k), dz(l))**2._wp)/maxval(1/(rho*re_l))
668 end if
669 else if (n > 0) then
670 vcfl_dt = cfl_target*(min(dx(j), dy(k))**2._wp)/maxval((1/re_l)/rho)
671 else
672 vcfl_dt = cfl_target*(dx(j)**2._wp)/maxval(1/(rho*re_l))
673 end if
674 max_dt = min(max_dt, vcfl_dt)
675 end if
676
677 ! Capillary CFL calculations
678 if (surface_tension) then
679 if (p > 0) then
680# 241 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
681 if (grid_geometry == 3) then
682 fltr_dtheta = f_compute_filtered_dtheta(k, l)
683 ccfl_dt = cfl_target*sqrt(rho*min(dx(j), dy(k), fltr_dtheta)**3._wp/(2._wp*pi*sigma))
684 else
685 ccfl_dt = cfl_target*sqrt(rho*min(dx(j), dy(k), dz(l))**3._wp/(2._wp*pi*sigma))
686 end if
687# 248 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
688 else if (n > 0) then
689 ccfl_dt = cfl_target*sqrt(rho*min(dx(j), dy(k))**3._wp/(2._wp*pi*sigma))
690 else
691 ccfl_dt = cfl_target*sqrt(rho*dx(j)**3._wp/(2._wp*pi*sigma))
692 end if
693 max_dt = min(max_dt, ccfl_dt)
694 end if
695
696 end subroutine s_compute_dt_from_cfl
697
698end 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...
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.
subroutine, public s_compute_stability_from_dt(vel, c, rho, re_l, j, k, l, icfl, vcfl, rc, ccfl)
Computes stability criterion for a specified dt.
real(wp) function f_compute_filtered_dtheta(k, l)
Computes the modified dtheta for Fourier filtering in azimuthal direction.
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).