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# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33
34# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35
36# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39
40# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45
46# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49! New line at end of file is required for FYPP
50# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
51# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
52# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
53# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58
59# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
62
63# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
64# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
65# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
66
67# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68
69# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
70
71# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
72
73# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
74
75# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
76
77# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
78
79# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
80
81# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
82! New line at end of file is required for FYPP
83# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
84
85# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90
91# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92
93# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
94
95# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
96
97# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
98
99# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
100
101# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
102
103# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
104
105# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
106
107# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
108
109# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110
111# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112
113# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 126 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 156 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 197 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 211 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 236 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 247 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 249 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136# 260 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 310 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139
140# 320 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
141
142# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
143
144# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
145
146# 356 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
147
148# 366 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
149
150# 373 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
151
152# 379 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
153
154# 385 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
155
156# 391 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
157
158# 397 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
159
160# 403 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
161! New line at end of file is required for FYPP
162# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
163# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
164# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
165# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
168# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170
171# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
174
175# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
178
179# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
180
181# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
182
183# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
184
185# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
186
187# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
188
189# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
190
191# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
192
193# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
194! New line at end of file is required for FYPP
195# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
196
197# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
198
199# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
200
201# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
202
203# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204
205# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206
207# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234
235# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236
237# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238
239# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240
241# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
242
243# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
244
245# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
246
247# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
248
249# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
250
251# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
252! New line at end of file is required for FYPP
253# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
254
255! GPU parallel region (scalar reductions, maxval/minval)
256# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258! GPU parallel loop over threads (most common GPU macro)
259# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261! Required closing for GPU_PARALLEL_LOOP
262# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264! Mark routine for device compilation
265# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267! Declare device-resident data
268# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
269
270! Inner loop within a GPU parallel region
271# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273! Scoped GPU data region
274# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
275
276! Host code with device pointers (for MPI with GPU buffers)
277# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
278
279! Allocate device memory (unscoped)
280# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
281
282! Free device memory
283# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
284
285! Atomic operation on device
286# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
287
288! End atomic capture block
289# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290
291! Copy data between host and device
292# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
293
294! Synchronization barrier
295# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
296
297! Import GPU library module (openacc or omp_lib)
298# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
299
300! Emit code only for AMD compiler
301# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302
303! Emit code for non-Cray compilers
304# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
305
306! Emit code only for Cray compiler
307# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
308
309! Emit code for non-NVIDIA compilers
310# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
311
312# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
313# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
314! New line at end of file is required for FYPP
315# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
316
317# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
318
319! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
320! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
321! example see misc/nvidia_uvm/bind.sh.
322# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
323
324! Allocate and create GPU device memory
325# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
326
327! Free GPU device memory and deallocate
328# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
329
330! Cray-specific GPU pointer setup for vector fields
331# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
332
333! Cray-specific GPU pointer setup for scalar fields
334# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
335
336! Cray-specific GPU pointer setup for acoustic source spatials
337# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
338
339# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
340
341# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
342! New line at end of file is required for FYPP
343# 7 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp" 2
344
345!> @brief Simulation helper routines for cell state, CFL calculation, and stability checks
347
351
352 implicit none
353
355
356 !> Criterion currently limiting the adaptive time step (ICFL, VCFL, CCFL, TCFL, the collision cap, or the ramp limiter)
357 character(len=4) :: dt_limiter = 'none'
358 character(len=4), dimension(5), parameter :: dt_limiter_names = (/'ICFL', 'VCFL', 'CCFL', 'TCFL', 'COLL'/)
359
360contains
361
362 !> Computes the modified dtheta for Fourier filtering in azimuthal direction
363 function f_compute_filtered_dtheta(k, l) result(fltr_dtheta)
364
365
366# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
367#if MFC_OpenACC
368# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
369!$acc routine seq
370# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
371#elif MFC_OpenMP
372# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
373
374# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
375
376# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
377!$omp declare target device_type(any)
378# 28 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
379#endif
380 integer, intent(in) :: k, l
381 real(wp) :: fltr_dtheta
382 integer :: nfq
383
384 if (grid_geometry == 3) then
385 if (k == 0) then
386 fltr_dtheta = 2._wp*pi*y_cb(0)/3._wp
387 else if (k <= fourier_rings) then
388 nfq = min(floor(2._wp*real(k, wp)*pi), (p + 1)/2 + 1)
389 fltr_dtheta = 2._wp*pi*y_cb(k - 1)/real(nfq, wp)
390 else
391 fltr_dtheta = y_cb(k - 1)*dz(l)
392 end if
393 else
394 fltr_dtheta = 0._wp
395 end if
396
397 end function f_compute_filtered_dtheta
398
399 !> Computes the mixture coefficients, velocity and pressure of one cell
400 subroutine s_compute_cell_state(q_prim_vf, pres, rho, gamma, pi_inf, Re, alpha, alpha_rho, vel, vel_sum, qv, j, k, l)
401
402
403# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
404#ifdef _CRAYFTN
405# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
406#if MFC_OpenACC
407# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
408!$acc routine seq
409# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
410#elif MFC_OpenMP
411# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
412
413# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
414
415# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
416!$omp declare target device_type(any)
417# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
418#else
419# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
420!DIR$ INLINEALWAYS s_compute_cell_state
421# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
422#endif
423# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
424#elif MFC_OpenACC
425# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
426!$acc routine seq
427# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
428#elif MFC_OpenMP
429# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
430
431# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
432
433# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
434!$omp declare target device_type(any)
435# 51 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
436#endif
437
438 type(scalar_field), intent(in), dimension(sys_size) :: q_prim_vf
439# 58 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
440 real(wp), intent(inout), dimension(num_fluids) :: alpha, alpha_rho
441 real(wp), intent(inout), dimension(num_vels) :: vel
442# 61 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
443 real(wp), intent(inout) :: rho, gamma, pi_inf, vel_sum, pres
444 real(wp), intent(out) :: qv
445 integer, intent(in) :: j, k, l
446 real(wp), dimension(2), intent(inout) :: re
447# 68 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
448 real(wp), dimension(num_fluids) :: gs
449# 70 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
450 real(wp) :: g_local
451 integer :: i
452
453 call s_compute_species_fraction(q_prim_vf, j, k, l, alpha_rho, alpha)
454
455 if (hypoelasticity) then
456 call s_convert_species_to_mixture_variables_kernel(rho, gamma, pi_inf, qv, alpha, alpha_rho, re, g_local, gs)
457 else
458 call s_convert_species_to_mixture_variables_kernel(rho, gamma, pi_inf, qv, alpha, alpha_rho, re)
459 end if
460
461 if (igr) then
462
463# 82 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
464#if defined(MFC_OpenACC)
465# 82 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
466!$acc loop seq
467# 82 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
468#elif defined(MFC_OpenMP)
469# 82 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
470
471# 82 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
472#endif
473 do i = 1, num_vels
474 vel(i) = q_prim_vf(eqn_idx%cont%end + i)%sf(j, k, l)/rho
475 end do
476 else
477
478# 87 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
479#if defined(MFC_OpenACC)
480# 87 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
481!$acc loop seq
482# 87 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
483#elif defined(MFC_OpenMP)
484# 87 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
485
486# 87 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
487#endif
488 do i = 1, num_vels
489 vel(i) = q_prim_vf(eqn_idx%cont%end + i)%sf(j, k, l)
490 end do
491 end if
492
493 vel_sum = 0._wp
494
495# 94 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
496#if defined(MFC_OpenACC)
497# 94 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
498!$acc loop seq
499# 94 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
500#elif defined(MFC_OpenMP)
501# 94 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
502
503# 94 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
504#endif
505 do i = 1, num_vels
506 vel_sum = vel_sum + vel(i)**2._wp
507 end do
508
509 if (igr) then
510 pres = (q_prim_vf(eqn_idx%E)%sf(j, k, l) - pi_inf - qv - 5.e-1_wp*rho*vel_sum)/gamma
511 else
512 pres = q_prim_vf(eqn_idx%E)%sf(j, k, l)
513 end if
514
515 end subroutine s_compute_cell_state
516
517 !> Computes stability criterion for a specified dt
518 subroutine s_compute_stability_from_dt(vel, c, rho, Re_l, alpha, alpha_rho, j, k, l, icfl, vcfl, Rc, ccfl, tcfl)
519
520
521# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
522#if MFC_OpenACC
523# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
524!$acc routine seq
525# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
526#elif MFC_OpenMP
527# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
528
529# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
530
531# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
532!$omp declare target device_type(any)
533# 110 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
534#endif
535 real(wp), intent(in), dimension(num_vels) :: vel
536 real(wp), intent(in) :: c, rho
537 real(wp), intent(inout) :: icfl
538 real(wp), intent(inout) :: vcfl, rc, ccfl, tcfl
539 real(wp), dimension(2), intent(in) :: re_l
540# 119 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
541 real(wp), dimension(num_fluids), intent(in) :: alpha, alpha_rho
542# 121 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
543 integer, intent(in) :: j, k, l
544 real(wp) :: fltr_dtheta
545 real(wp) :: k_mix, rho_cv
546 integer :: i
547
548 ! Inviscid CFL calculation
549 ! The multi-dimensional CFL terms are written out here rather than
550 ! obtained from a shared helper procedure: NVHPC 25.5's fort2 segfaults
551 ! when a routine containing a call to that helper is cross-file inlined
552 ! by -Minline (the IPO setup in cmake/MFCTargets.cmake).
553 if (p > 0) then
554# 133 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
555 if (grid_geometry == 3) then
556 fltr_dtheta = f_compute_filtered_dtheta(k, l)
557 icfl = dt/min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c), fltr_dtheta/(abs(vel(3)) + c))
558 else
559 icfl = dt/min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c), dz(l)/(abs(vel(3)) + c))
560 end if
561# 140 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
562 else if (n > 0) then
563 icfl = dt/min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c))
564 else
565 icfl = (dt/dx(j))*(abs(vel(1)) + c)
566 end if
567
568 ! Viscous calculations
569 if (viscous) then
570 if (p > 0) then
571# 150 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
572 if (grid_geometry == 3) then
573 fltr_dtheta = f_compute_filtered_dtheta(k, l)
574 vcfl = maxval(dt/re_l/rho)/min(dx(j), dy(k), fltr_dtheta)**2._wp
575 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)
576 else
577 vcfl = maxval(dt/re_l/rho)/min(dx(j), dy(k), dz(l))**2._wp
578 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)
579 end if
580# 159 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
581 else if (n > 0) then
582 vcfl = maxval(dt/re_l/rho)/min(dx(j), dy(k))**2._wp
583 rc = min(dx(j)*(abs(vel(1)) + c), dy(k)*(abs(vel(2)) + c))/maxval(1._wp/re_l)
584 else
585 vcfl = maxval(dt/re_l/rho)/dx(j)**2._wp
586 rc = dx(j)*(abs(vel(1)) + c)/maxval(1._wp/re_l)
587 end if
588 end if
589
590 ! Capillary CFL calculation
591 if (surface_tension) then
592 if (p > 0) then
593# 172 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
594 if (grid_geometry == 3) then
595 fltr_dtheta = f_compute_filtered_dtheta(k, l)
596 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*min(dx(j), dy(k), fltr_dtheta)**3._wp))
597 else
598 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*min(dx(j), dy(k), dz(l))**3._wp))
599 end if
600# 179 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
601 else if (n > 0) then
602 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*min(dx(j), dy(k))**3._wp))
603 else
604 ccfl = dt*sqrt(2._wp*pi*sigma/(rho*dx(j)**3._wp))
605 end if
606 end if
607
608 ! Thermal diffusion CFL
609 if (heat_conduction) then
610 k_mix = 0._wp
611 rho_cv = 0._wp
612
613# 190 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
614#if defined(MFC_OpenACC)
615# 190 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
616!$acc loop seq
617# 190 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
618#elif defined(MFC_OpenMP)
619# 190 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
620
621# 190 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
622#endif
623 do i = 1, num_fluids
624 k_mix = k_mix + alpha(i)*fluid_k_therm(i)
625 rho_cv = rho_cv + alpha_rho(i)*cvs(i)
626 end do
627
628 if (p > 0) then
629 if (grid_geometry == 3) then
630 fltr_dtheta = f_compute_filtered_dtheta(k, l)
631 tcfl = dt*k_mix/(rho_cv*min(dx(j), dy(k), fltr_dtheta)**2._wp)
632 else
633 tcfl = dt*k_mix/(rho_cv*min(dx(j), dy(k), dz(l))**2._wp)
634 end if
635 else if (n > 0) then
636 tcfl = dt*k_mix/(rho_cv*min(dx(j), dy(k))**2._wp)
637 else
638 tcfl = dt*k_mix/(rho_cv*dx(j)**2._wp)
639 end if
640 end if
641
642 end subroutine s_compute_stability_from_dt
643
644 !> Computes the candidate dts for a specified CFL number: max_dt(1) from the inviscid, max_dt(2) the viscous, max_dt(3) the
645 !! capillary, and max_dt(4) the thermal diffusion criterion (huge where the criterion is inactive)
646 subroutine s_compute_dt_from_cfl(vel, c, max_dt, rho, Re_l, alpha, alpha_rho, j, k, l)
647
648
649# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
650#if MFC_OpenACC
651# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
652!$acc routine seq
653# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
654#elif MFC_OpenMP
655# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
656
657# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
658
659# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
660!$omp declare target device_type(any)
661# 216 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
662#endif
663 real(wp), dimension(num_vels), intent(in) :: vel
664 real(wp), intent(in) :: c, rho
665 real(wp), dimension(4), intent(out) :: max_dt
666 real(wp), dimension(2), intent(in) :: re_l
667# 224 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
668 real(wp), dimension(num_fluids), intent(in) :: alpha, alpha_rho
669# 226 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
670 integer, intent(in) :: j, k, l
671 real(wp) :: vcfl_dt, ccfl_dt, tcfl_dt
672 real(wp) :: fltr_dtheta
673 real(wp) :: k_mix, rho_cv
674 integer :: i
675
676 max_dt(2) = huge(1._wp)
677 max_dt(3) = huge(1._wp)
678 max_dt(4) = huge(1._wp)
679
680 ! Inviscid CFL calculation
681 ! The multi-dimensional CFL terms are written out here rather than
682 ! obtained from a shared helper procedure: NVHPC 25.5's fort2 segfaults
683 ! when a routine containing a call to that helper is cross-file inlined
684 ! by -Minline (the IPO setup in cmake/MFCTargets.cmake).
685 if (p > 0) then
686# 243 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
687 if (grid_geometry == 3) then
688 fltr_dtheta = f_compute_filtered_dtheta(k, l)
689 max_dt(1) = cfl_target*min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c), fltr_dtheta/(abs(vel(3)) + c))
690 else
691 max_dt(1) = cfl_target*min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c), dz(l)/(abs(vel(3)) + c))
692 end if
693# 250 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
694 else if (n > 0) then
695 max_dt(1) = cfl_target*min(dx(j)/(abs(vel(1)) + c), dy(k)/(abs(vel(2)) + c))
696 else
697 max_dt(1) = cfl_target*(dx(j)/(abs(vel(1)) + c))
698 end if
699
700 ! Viscous calculations
701 if (viscous) then
702 if (p > 0) then
703 if (grid_geometry == 3) then
704 fltr_dtheta = f_compute_filtered_dtheta(k, l)
705 vcfl_dt = cfl_target*(min(dx(j), dy(k), fltr_dtheta)**2._wp)/maxval(1/(rho*re_l))
706 else
707 vcfl_dt = cfl_target*(min(dx(j), dy(k), dz(l))**2._wp)/maxval(1/(rho*re_l))
708 end if
709 else if (n > 0) then
710 vcfl_dt = cfl_target*(min(dx(j), dy(k))**2._wp)/maxval((1/re_l)/rho)
711 else
712 vcfl_dt = cfl_target*(dx(j)**2._wp)/maxval(1/(rho*re_l))
713 end if
714 max_dt(2) = vcfl_dt
715 end if
716
717 ! Capillary CFL calculations
718 if (surface_tension) then
719 if (p > 0) then
720# 277 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
721 if (grid_geometry == 3) then
722 fltr_dtheta = f_compute_filtered_dtheta(k, l)
723 ccfl_dt = cfl_target*sqrt(rho*min(dx(j), dy(k), fltr_dtheta)**3._wp/(2._wp*pi*sigma))
724 else
725 ccfl_dt = cfl_target*sqrt(rho*min(dx(j), dy(k), dz(l))**3._wp/(2._wp*pi*sigma))
726 end if
727# 284 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
728 else if (n > 0) then
729 ccfl_dt = cfl_target*sqrt(rho*min(dx(j), dy(k))**3._wp/(2._wp*pi*sigma))
730 else
731 ccfl_dt = cfl_target*sqrt(rho*dx(j)**3._wp/(2._wp*pi*sigma))
732 end if
733 max_dt(3) = ccfl_dt
734 end if
735
736 ! Thermal diffusion CFL: dt <= cfl * dx^2 * rho * cv / k
737 if (heat_conduction) then
738 k_mix = 0._wp
739 rho_cv = 0._wp
740
741# 296 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
742#if defined(MFC_OpenACC)
743# 296 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
744!$acc loop seq
745# 296 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
746#elif defined(MFC_OpenMP)
747# 296 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
748
749# 296 "/home/runner/work/MFC/MFC/src/simulation/m_sim_helpers.fpp"
750#endif
751 do i = 1, num_fluids
752 k_mix = k_mix + alpha(i)*fluid_k_therm(i)
753 rho_cv = rho_cv + alpha_rho(i)*cvs(i)
754 end do
755
756 if (p > 0) then
757 if (grid_geometry == 3) then
758 fltr_dtheta = f_compute_filtered_dtheta(k, l)
759 tcfl_dt = cfl_target*(min(dx(j), dy(k), fltr_dtheta)**2._wp)*rho_cv/max(k_mix, sgm_eps)
760 else
761 tcfl_dt = cfl_target*(min(dx(j), dy(k), dz(l))**2._wp)*rho_cv/max(k_mix, sgm_eps)
762 end if
763 else if (n > 0) then
764 tcfl_dt = cfl_target*(min(dx(j), dy(k))**2._wp)*rho_cv/max(k_mix, sgm_eps)
765 else
766 tcfl_dt = cfl_target*(dx(j)**2._wp)*rho_cv/max(k_mix, sgm_eps)
767 end if
768 max_dt(4) = tcfl_dt
769 end if
770
771 end subroutine s_compute_dt_from_cfl
772
773end 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 cell state, CFL calculation, and stability checks.
subroutine, public s_compute_stability_from_dt(vel, c, rho, re_l, alpha, alpha_rho, j, k, l, icfl, vcfl, rc, ccfl, tcfl)
Computes stability criterion for a specified dt.
subroutine, public s_compute_cell_state(q_prim_vf, pres, rho, gamma, pi_inf, re, alpha, alpha_rho, vel, vel_sum, qv, j, k, l)
Computes the mixture coefficients, velocity and pressure of one cell.
subroutine, public s_compute_dt_from_cfl(vel, c, max_dt, rho, re_l, alpha, alpha_rho, j, k, l)
Computes the candidate dts for a specified CFL number: max_dt(1) from the inviscid,...
character(len=4), public dt_limiter
Criterion currently limiting the adaptive time step (ICFL, VCFL, CCFL, TCFL, the collision cap,...
character(len=4), dimension(5), parameter, public dt_limiter_names
real(wp) function f_compute_filtered_dtheta(k, l)
Computes the modified dtheta for Fourier filtering in azimuthal direction.
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_kernel(rho_k, gamma_k, pi_inf_k, qv_k, alpha_k, alpha_rho_k, re_k, g_k, g)
Host- and device-callable conversion kernel for species and mixture variables.
Derived type annexing a scalar field (SF).