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