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