MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_bubbles.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
2!>
3!! @file
4!! @brief Contains module m_bubbles
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32! New line at end of file is required for FYPP
33# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
34# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
35# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
36# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45
46# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59! New line at end of file is required for FYPP
60# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
61
62# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
63# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
64# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
65# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
66# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67
68# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69
70# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138! New line at end of file is required for FYPP
139# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
140# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
141# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
142# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
143# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
144# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
145# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
146# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147
148# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153
154# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161
162# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165! New line at end of file is required for FYPP
166# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
167
168# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
169
170# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
171
172# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
173
174# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223! New line at end of file is required for FYPP
224# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
225
226! GPU parallel region (scalar reductions, maxval/minval)
227# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
228
229! GPU parallel loop over threads (most common GPU macro)
230# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
231
232! Required closing for GPU_PARALLEL_LOOP
233# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
234
235! Mark routine for device compilation
236# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238! Declare device-resident data
239# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
240
241! Inner loop within a GPU parallel region
242# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244! Scoped GPU data region
245# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! Host code with device pointers (for MPI with GPU buffers)
248# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Allocate device memory (unscoped)
251# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Free device memory
254# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Atomic operation on device
257# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! End atomic capture block
260# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Copy data between host and device
263# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! Synchronization barrier
266# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Import GPU library module (openacc or omp_lib)
269# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Emit code only for AMD compiler
272# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Emit code for non-Cray compilers
275# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Emit code only for Cray compiler
278# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Emit code for non-NVIDIA compilers
281# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
284# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285! New line at end of file is required for FYPP
286# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
287
288# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
289
290! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
291! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
292! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
293# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
294
295! Allocate and create GPU device memory
296# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
297
298! Free GPU device memory and deallocate
299# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
300
301! Cray-specific GPU pointer setup for vector fields
302# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
303
304! Cray-specific GPU pointer setup for scalar fields
305# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Cray-specific GPU pointer setup for acoustic source spatials
308# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
309
310# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
311
312# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
313! New line at end of file is required for FYPP
314# 6 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp" 2
315
316!> @brief Shared bubble-dynamics procedures (radial acceleration, wall pressure, sound speed) for ensemble- and volume-averaged
317!! models
319
322 use m_mpi_proxy
325
326 implicit none
327
328 real(wp) :: chi_vw !< Bubble wall properties (Ando 2010)
329 real(wp) :: k_mw !< Bubble wall properties (Ando 2010)
330 real(wp) :: rho_mw !< Bubble wall properties (Ando 2010)
331
332# 22 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
333#if defined(MFC_OpenACC)
334# 22 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
335!$acc declare create(chi_vw, k_mw, rho_mw)
336# 22 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
337#elif defined(MFC_OpenMP)
338# 22 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
339!$omp declare target (chi_vw, k_mw, rho_mw)
340# 22 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
341#endif
342
343contains
344
345 !> Compute the bubble radial acceleration based on the selected bubble model
346 elemental function f_rddot(fRho, fP, fR, fV, fR0, fpb, fpbdot, alf, fntait, fBtait, f_bub_adv_src, f_divu, fCson)
347
348
349# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
350#if MFC_OpenACC
351# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
352!$acc routine seq
353# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
354#elif MFC_OpenMP
355# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
356
357# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
358
359# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
360!$omp declare target device_type(any)
361# 29 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
362#endif
363 real(wp), intent(in) :: frho, fp, fr, fv, fr0, fpb, fpbdot, alf
364 real(wp), intent(in) :: fntait, fbtait, f_bub_adv_src, f_divu
365 real(wp), intent(in) :: fcson
366 real(wp) :: fcpbw, fcpinf, fcpinf_dot, fh, fhdot, c_gas, c_liquid
367 real(wp) :: f_rddot
368
369 if (bubble_model == 1) then
370 ! Gilmore bubbles
371 fcpinf = fp - eu
372 fcpbw = f_cpbw(fr0, fr, fv, fpb)
373 fh = f_h(fcpbw, fcpinf, fntait, fbtait)
374 c_gas = f_cgas(fcpinf, fntait, fbtait, fh)
375 fcpinf_dot = f_cpinfdot(frho, fp, alf, fntait, fbtait, f_bub_adv_src, f_divu)
376 fhdot = f_hdot(fcpbw, fcpinf, fcpinf_dot, fntait, fbtait, fr, fv, fr0, fpbdot)
377 f_rddot = f_rddot_g(fcpbw, fr, fv, fh, fhdot, c_gas, fntait, fbtait)
378 else if (bubble_model == 2) then
379 ! Keller-Miksis bubbles
380 fcpinf = fp
381 fcpbw = f_cpbw_km(fr0, fr, fv, fpb)
382 if (bubbles_euler) then
383 c_liquid = sqrt(fntait*(fp + fbtait)/(frho*(1._wp - alf)))
384 else
385 c_liquid = fcson
386 end if
387 f_rddot = f_rddot_km(fpbdot, fcpinf, fcpbw, frho, fr, fv, fr0, c_liquid)
388 else if (bubble_model == 3) then
389 ! Rayleigh-Plesset bubbles
390 fcpbw = f_cpbw_km(fr0, fr, fv, fpb)
391 f_rddot = f_rddot_rp(fp, frho, fr, fv, fcpbw)
392 else
393 ! Default: No bubble dynamics
394 f_rddot = 0._wp
395 end if
396
397 end function f_rddot
398
399 !> Bubble wall pressure: stiffened gas with Laplace pressure and viscous stress
400 elemental function f_cpbw(fR0, fR, fV, fpb)
401
402
403# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
404#if MFC_OpenACC
405# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
406!$acc routine seq
407# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
408#elif MFC_OpenMP
409# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
410
411# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
412
413# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
414!$omp declare target device_type(any)
415# 69 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
416#endif
417 real(wp), intent(in) :: fr0, fr, fv, fpb
418 real(wp) :: f_cpbw
419
420 if (polytropic) then
421 f_cpbw = (ca + 2._wp/web/fr0)*((fr0/fr)**(3._wp*gam)) - ca - 4._wp*re_inv*fv/fr - 2._wp/(fr*web)
422 else
423 f_cpbw = fpb - 1._wp - 4._wp*re_inv*fv/fr - 2._wp/(fr*web)
424 end if
425
426 end function f_cpbw
427
428 !> Compute the bubble enthalpy
429 elemental function f_h(fCpbw, fCpinf, fntait, fBtait)
430
431
432# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
433#if MFC_OpenACC
434# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
435!$acc routine seq
436# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
437#elif MFC_OpenMP
438# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
439
440# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
441
442# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
443!$omp declare target device_type(any)
444# 84 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
445#endif
446 real(wp), intent(in) :: fcpbw, fcpinf, fntait, fbtait
447 real(wp) :: tmp1, tmp2, tmp3
448 real(wp) :: f_h
449
450 tmp1 = (fntait - 1._wp)/fntait
451 tmp2 = (fcpbw/(1._wp + fbtait) + 1._wp)**tmp1
452 tmp3 = (fcpinf/(1._wp + fbtait) + 1._wp)**tmp1
453
454 f_h = (tmp2 - tmp3)*fntait*(1._wp + fbtait)/(fntait - 1._wp)
455
456 end function f_h
457
458 !> Compute the sound speed for the bubble
459 elemental function f_cgas(fCpinf, fntait, fBtait, fH)
460
461
462# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
463#if MFC_OpenACC
464# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
465!$acc routine seq
466# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
467#elif MFC_OpenMP
468# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
469
470# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
471
472# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
473!$omp declare target device_type(any)
474# 100 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
475#endif
476 real(wp), intent(in) :: fcpinf, fntait, fbtait, fh
477 real(wp) :: tmp
478 real(wp) :: f_cgas
479
480 ! get sound speed for Gilmore equations "C" -> c_gas
481 tmp = (fcpinf/(1._wp + fbtait) + 1._wp)**((fntait - 1._wp)/fntait)
482 tmp = fntait*(1._wp + fbtait)*tmp
483
484 f_cgas = sqrt(tmp + (fntait - 1._wp)*fh)
485
486 end function f_cgas
487
488 !> Compute the time derivative of the driving pressure
489 elemental function f_cpinfdot(fRho, fP, falf, fntait, fBtait, advsrc, divu)
490
491
492# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
493#if MFC_OpenACC
494# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
495!$acc routine seq
496# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
497#elif MFC_OpenMP
498# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
499
500# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
501
502# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
503!$omp declare target device_type(any)
504# 116 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
505#endif
506 real(wp), intent(in) :: frho, fp, falf, fntait, fbtait, advsrc, divu
507 real(wp) :: c2_liquid
508 real(wp) :: f_cpinfdot
509
510 ! get sound speed squared for liquid (only needed for pbdot) c_l^2 = gam (p+B) / (rho*(1-alf))
511 if (mpp_lim) then
512 c2_liquid = fntait*(fp + fbtait)/frho
513 else
514 c2_liquid = fntait*(fp + fbtait)/(frho*(1._wp - falf))
515 end if
516
517 ! \dot{Cp_inf} = rho sound^2 (alf_src - divu)
518 f_cpinfdot = frho*c2_liquid*(advsrc - divu)
519
520 end function f_cpinfdot
521
522 !> Enthalpy derivative for Gilmore bubble model, Gilmore (1952)
523 elemental function f_hdot(fCpbw, fCpinf, fCpinf_dot, fntait, fBtait, fR, fV, fR0, fpbdot)
524
525
526# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
527#if MFC_OpenACC
528# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
529!$acc routine seq
530# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
531#elif MFC_OpenMP
532# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
533
534# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
535
536# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
537!$omp declare target device_type(any)
538# 136 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
539#endif
540 real(wp), intent(in) :: fcpbw, fcpinf, fcpinf_dot, fntait, fbtait
541 real(wp), intent(in) :: fr, fv, fr0, fpbdot
542 real(wp) :: tmp1, tmp2
543 real(wp) :: f_hdot
544
545 if (polytropic) then
546 tmp1 = (fr0/fr)**(3._wp*gam)
547 tmp1 = -3._wp*gam*(ca + 2._wp/web/fr0)*tmp1*fv/fr
548 else
549 tmp1 = fpbdot
550 end if
551 tmp2 = (2._wp/web + 4._wp*re_inv*fv)*fv/(fr**2._wp)
552
553 f_hdot = (fcpbw/(1._wp + fbtait) + 1._wp)**(-1._wp/fntait)*(tmp1 + tmp2) - (fcpinf/(1._wp + fbtait) + 1._wp) &
554 & **(-1._wp/fntait)*fcpinf_dot
555
556 end function f_hdot
557
558 !> Rayleigh-Plesset bubble radial acceleration
559 elemental function f_rddot_rp(fCp, fRho, fR, fV, fCpbw)
560
561
562# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
563#if MFC_OpenACC
564# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
565!$acc routine seq
566# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
567#elif MFC_OpenMP
568# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
569
570# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
571
572# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
573!$omp declare target device_type(any)
574# 158 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
575#endif
576 real(wp), intent(in) :: fcp, frho, fr, fv, fcpbw
577 real(wp) :: f_rddot_rp
578
579 f_rddot_rp = (-1.5_wp*(fv**2._wp) + (fcpbw - fcp)/frho)/fr
580
581 end function f_rddot_rp
582
583 !> Compute the Gilmore bubble radial acceleration
584 elemental function f_rddot_g(fCpbw, fR, fV, fH, fHdot, fcgas, fntait, fBtait)
585
586
587# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
588#if MFC_OpenACC
589# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
590!$acc routine seq
591# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
592#elif MFC_OpenMP
593# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
594
595# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
596
597# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
598!$omp declare target device_type(any)
599# 169 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
600#endif
601 real(wp), intent(in) :: fcpbw, fr, fv, fh, fhdot
602 real(wp), intent(in) :: fcgas, fntait, fbtait
603 real(wp) :: tmp1, tmp2, tmp3
604 real(wp) :: f_rddot_g
605
606 tmp1 = fv/fcgas
607 tmp2 = 1._wp + 4._wp*re_inv/fcgas/fr*(fcpbw/(1._wp + fbtait) + 1._wp)**(-1._wp/fntait)
608 tmp3 = 1.5_wp*fv**2._wp*(tmp1/3._wp - 1._wp) + fh*(1._wp + tmp1) + fr*fhdot*(1._wp - tmp1)/fcgas
609
610 f_rddot_g = tmp3/(fr*(1._wp - tmp1)*tmp2)
611
612 end function f_rddot_g
613
614 !> Keller-Miksis bubble wall pressure
615 elemental function f_cpbw_km(fR0, fR, fV, fpb)
616
617
618# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
619#if MFC_OpenACC
620# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
621!$acc routine seq
622# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
623#elif MFC_OpenMP
624# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
625
626# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
627
628# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
629!$omp declare target device_type(any)
630# 186 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
631#endif
632 real(wp), intent(in) :: fr0, fr, fv, fpb
633 real(wp) :: f_cpbw_km
634
635 if (polytropic) then
636 f_cpbw_km = ca*((fr0/fr)**(3._wp*gam)) - ca + eu
637 if (.not. f_is_default(web)) f_cpbw_km = f_cpbw_km + (2._wp/(web*fr0))*((fr0/fr)**(3._wp*gam))
638 else
639 f_cpbw_km = fpb
640 end if
641
642 if (.not. f_is_default(web)) f_cpbw_km = f_cpbw_km - 2._wp/(fr*web)
643 if (.not. f_is_default(re_inv)) f_cpbw_km = f_cpbw_km - 4._wp*re_inv*fv/fr
644
645 end function f_cpbw_km
646
647 !> Keller-Miksis bubble radial acceleration
648 elemental function f_rddot_km(fpbdot, fCp, fCpbw, fRho, fR, fV, fR0, fC)
649
650
651# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
652#if MFC_OpenACC
653# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
654!$acc routine seq
655# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
656#elif MFC_OpenMP
657# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
658
659# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
660
661# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
662!$omp declare target device_type(any)
663# 205 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
664#endif
665 real(wp), intent(in) :: fpbdot, fcp, fcpbw
666 real(wp), intent(in) :: frho, fr, fv, fr0, fc
667 real(wp) :: tmp1, tmp2, cdot_star
668 real(wp) :: f_rddot_km
669 if (polytropic) then
670 cdot_star = -3._wp*gam*ca*((fr0/fr)**(3._wp*gam))*fv/fr
671 if (.not. f_is_default(web)) cdot_star = cdot_star - 3._wp*gam*(2._wp/(web*fr0))*((fr0/fr)**(3._wp*gam))*fv/fr
672 else
673 cdot_star = fpbdot
674 end if
675
676 if (.not. f_is_default(web)) cdot_star = cdot_star + (2._wp/web)*fv/(fr**2._wp)
677 if (.not. f_is_default(re_inv)) cdot_star = cdot_star + 4._wp*re_inv*((fv/fr)**2._wp)
678
679 tmp1 = fv/fc
680 tmp2 = 1.5_wp*(fv**2._wp)*(tmp1/3._wp - 1._wp) + (1._wp + tmp1)*(fcpbw - fcp)/frho + cdot_star*fr/(frho*fc)
681
682 if (f_is_default(re_inv)) then
683 f_rddot_km = tmp2/(fr*(1._wp - tmp1))
684 else
685 f_rddot_km = tmp2/(fr*(1._wp - tmp1) + 4._wp*re_inv/(frho*fc))
686 end if
687
688 end function f_rddot_km
689
690 !> Compute bubble wall properties for vapor bubbles
691 elemental subroutine s_bwproperty(pb_in, iR0, chi_vw_out, k_mw_out, rho_mw_out)
692
693
694# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
695#if MFC_OpenACC
696# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
697!$acc routine seq
698# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
699#elif MFC_OpenMP
700# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
701
702# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
703
704# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
705!$omp declare target device_type(any)
706# 234 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
707#endif
708 real(wp), intent(in) :: pb_in
709 integer, intent(in) :: ir0
710 real(wp), intent(out) :: chi_vw_out !< Bubble wall properties (Ando 2010)
711 real(wp), intent(out) :: k_mw_out !< Bubble wall properties (Ando 2010)
712 real(wp), intent(out) :: rho_mw_out !< Bubble wall properties (Ando 2010)
713 real(wp) :: x_vw
714
715 ! mass fraction of vapor
716 chi_vw_out = 1._wp/(1._wp + r_v/r_g*(pb_in/pv - 1._wp))
717 ! mole fraction of vapor & thermal conductivity of gas mixture
718 x_vw = m_g*chi_vw_out/(m_v + (m_g - m_v)*chi_vw_out)
719 k_mw_out = x_vw*k_v(ir0)/(x_vw + (1._wp - x_vw)*phi_vg) + (1._wp - x_vw)*k_g(ir0)/(x_vw*phi_gv + 1._wp - x_vw)
720 ! gas mixture density
721 rho_mw_out = pv/(chi_vw_out*r_v*tw)
722
723 end subroutine s_bwproperty
724
725 !> Compute the vapour flux
726 elemental subroutine s_vflux(fR, fV, fpb, fmass_v, iR0, vflux, fmass_g, fbeta_c, fR_m, fgamma_m)
727
728
729# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
730#if MFC_OpenACC
731# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
732!$acc routine seq
733# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
734#elif MFC_OpenMP
735# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
736
737# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
738
739# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
740!$omp declare target device_type(any)
741# 255 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
742#endif
743 real(wp), intent(in) :: fr
744 real(wp), intent(in) :: fv
745 real(wp), intent(in) :: fpb
746 real(wp), intent(in) :: fmass_v
747 integer, intent(in) :: ir0
748 real(wp), intent(out) :: vflux
749 real(wp), intent(in), optional :: fmass_g, fbeta_c
750 real(wp), intent(out), optional :: fr_m, fgamma_m
751 real(wp) :: chi_bar
752 real(wp) :: rho_mw_lag
753 real(wp) :: grad_chi
754 real(wp) :: conc_v
755
756 if (thermal == 3) then ! transfer
757 ! constant transfer model
758 if (bubbles_lagrange) then
759 ! Mixture properties (gas+vapor) in the bubble
760 conc_v = fmass_v/(fmass_v + fmass_g)
761 if (lag_params%massTransfer_model) then
762 conc_v = 1._wp/(1._wp + (r_v/r_g)*(fpb/pv - 1._wp))
763 end if
764 fr_m = (fmass_g*r_g + fmass_v*r_v)
765 fgamma_m = conc_v*gam_v + (1._wp - conc_v)*gam_g
766
767 ! Vapor flux
768 chi_bar = fmass_v/(fmass_v + fmass_g)
769 grad_chi = (chi_bar - conc_v)
770 rho_mw_lag = (fmass_g + fmass_v)/(4._wp/3._wp*pi*fr**3._wp)
771 vflux = 0._wp
772 if (lag_params%massTransfer_model) then
773 vflux = -fbeta_c*rho_mw_lag*grad_chi/(1._wp - conc_v)/fr
774 end if
775 else
776 chi_bar = fmass_v/(fmass_v + mass_g0(ir0))
777 grad_chi = -re_trans_c(ir0)*(chi_bar - chi_vw)
778 vflux = rho_mw*grad_chi/pe_c/(1._wp - chi_vw)/fr
779 end if
780 else
781 ! polytropic
782 vflux = pv*fv/(r_v*tw)
783 end if
784
785 end subroutine s_vflux
786
787 !> Compute the time derivative of the internal bubble pressure
788 elemental function f_bpres_dot(fvflux, fR, fV, fpb, fmass_v, iR0, fbeta_t, fR_m, fgamma_m)
789
790
791# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
792#if MFC_OpenACC
793# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
794!$acc routine seq
795# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
796#elif MFC_OpenMP
797# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
798
799# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
800
801# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
802!$omp declare target device_type(any)
803# 303 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
804#endif
805 real(wp), intent(in) :: fvflux
806 real(wp), intent(in) :: fr
807 real(wp), intent(in) :: fv
808 real(wp), intent(in) :: fpb
809 real(wp), intent(in) :: fmass_v
810 integer, intent(in) :: ir0
811 real(wp), intent(in), optional :: fbeta_t, fr_m, fgamma_m
812 real(wp) :: t_bar
813 real(wp) :: grad_t
814 real(wp) :: f_bpres_dot
815 real(wp) :: heatflux
816
817 if (thermal == 3) then
818 if (bubbles_lagrange) then
819 t_bar = fpb*(4._wp/3._wp*pi*fr**3._wp)/fr_m
820 grad_t = -fbeta_t*(t_bar - tw)
821 heatflux = (fgamma_m - 1._wp)/fgamma_m*grad_t/fr
822 f_bpres_dot = 3._wp*fgamma_m*(-fv*fpb + fvflux*r_v*tw + heatflux)/fr
823 return
824 end if
825 grad_t = -re_trans_t(ir0)*((fpb/pb0(ir0))*(fr/r0(ir0))**3*(mass_g0(ir0) + mass_v0(ir0))/(mass_g0(ir0) + fmass_v) &
826 & - 1._wp)
827 f_bpres_dot = 3._wp*gam_m*(-fv*fpb + fvflux*r_v*tw + pb0(ir0)*k_mw*grad_t/pe_t(ir0)/fr)/fr
828 else
829 f_bpres_dot = -3._wp*gam_m*fv/fr*(fpb - pv)
830 end if
831
832 end function f_bpres_dot
833
834 !> Adaptive time stepping routine for subgrid bubbles (See Heirer, E. Hairer S.P.Norsett G. Wanner, Solving Ordinary
835 !! Differential Equations I, Chapter II.4)
836 subroutine s_advance_step(fRho, fP, fR, fV, fR0, fpb, fpbdot, alf, fntait, fBtait, f_bub_adv_src, f_divu, bub_id, fmass_v, &
837
838 & fmass_g, fbeta_c, fbeta_t, fCson, adap_dt_stop)
839
840# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
841#ifdef _CRAYFTN
842# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
843#if MFC_OpenACC
844# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
845!$acc routine seq
846# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
847#elif MFC_OpenMP
848# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
849
850# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
851
852# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
853!$omp declare target device_type(any)
854# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
855#else
856# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
857!DIR$ INLINEALWAYS s_advance_step
858# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
859#endif
860# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
861#elif MFC_OpenACC
862# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
863!$acc routine seq
864# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
865#elif MFC_OpenMP
866# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
867
868# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
869
870# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
871!$omp declare target device_type(any)
872# 338 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
873#endif
874
875 real(wp), intent(inout) :: fR, fV, fpb, fmass_v
876 real(wp), intent(in) :: fRho, fP, fR0, fpbdot, alf
877 real(wp), intent(in) :: fntait, fBtait, f_bub_adv_src, f_divu
878 integer, intent(in) :: bub_id
879 real(wp), intent(in) :: fmass_g, fbeta_c, fbeta_t, fCson
880 integer, intent(inout) :: adap_dt_stop
881 real(wp), dimension(5) :: err !< Error estimates for adaptive time stepping
882 real(wp) :: t_new !< Updated time step size
883 real(wp) :: h0, h !< Time step size
884 !> Bubble radius, radial velocity, and radial acceleration for the inner loop
885 real(wp), dimension(4) :: myR_tmp1, myV_tmp1, myR_tmp2, myV_tmp2
886 real(wp), dimension(4) :: myPb_tmp1, myMv_tmp1, myPb_tmp2, myMv_tmp2 !< Gas pressure and vapor mass for the inner loop (EL)
887 real(wp) :: fR2, fV2, fpb2, fmass_v2
888 integer :: iter_count
889
890 call s_initial_substep_h(frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, fcson, h0)
891 h = h0
892 ! Advancing one step
893 t_new = 0._wp
894 iter_count = 0
895 adap_dt_stop = 0
896
897 do
898 if (t_new + h > 0.5_wp*dt) then
899 h = 0.5_wp*dt - t_new
900 end if
901
902 ! Advancing one sub-step
903 do while (iter_count < adap_dt_max_iters)
904 iter_count = iter_count + 1
905
906 ! Advance one sub-step
907 call s_advance_substep(err(1), frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, &
908 & bub_id, fmass_v, fmass_g, fbeta_c, fbeta_t, fcson, h, myr_tmp1, myv_tmp1, mypb_tmp1, &
909 & mymv_tmp1)
910 if (err(1) > adap_dt_tol) then
911 h = 0.25_wp*h
912 cycle
913 end if
914
915 ! Advance one sub-step by advancing two half steps
916 call s_advance_substep(err(2), frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, &
917 & bub_id, fmass_v, fmass_g, fbeta_c, fbeta_t, fcson, 0.5_wp*h, myr_tmp2, myv_tmp2, &
918 & mypb_tmp2, mymv_tmp2)
919 if (err(2) > adap_dt_tol) then
920 h = 0.25_wp*h
921 cycle
922 end if
923
924 fr2 = myr_tmp2(4); fv2 = myv_tmp2(4)
925 fpb2 = mypb_tmp2(4); fmass_v2 = mymv_tmp2(4)
926
927 call s_advance_substep(err(3), frho, fp, fr2, fv2, fr0, fpb2, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, &
928 & bub_id, fmass_v2, fmass_g, fbeta_c, fbeta_t, fcson, 0.5_wp*h, myr_tmp2, myv_tmp2, &
929 & mypb_tmp2, mymv_tmp2)
930 if (err(3) > adap_dt_tol) then
931 h = 0.5_wp*h
932 cycle
933 end if
934
935 err(4) = abs((myr_tmp1(4) - myr_tmp2(4))/myr_tmp1(4))
936 err(5) = abs((myv_tmp1(4) - myv_tmp2(4))/myv_tmp1(4))
937 if (abs(myv_tmp1(4)) < verysmall) err(5) = 0._wp
938
939 ! Determine acceptance/rejection and update step size Rule 1: err1, err2, err3 < tol Rule 2: myR_tmp1(4) > 0._wp
940 ! Rule 3: abs((myR_tmp1(4) - myR_tmp2(4))/fR) < tol Rule 4: abs((myV_tmp1(4) - myV_tmp2(4))/fV) < tol
941 if ((err(1) <= adap_dt_tol) .and. (err(2) <= adap_dt_tol) .and. (err(3) <= adap_dt_tol) .and. (err(4) &
942 & <= adap_dt_tol) .and. (err(5) <= adap_dt_tol) .and. myr_tmp1(4) > 0._wp) then
943 ! Accepted. Finalize the sub-step
944 t_new = t_new + h
945
946 ! Update R and V
947 fr = myr_tmp1(4)
948 fv = myv_tmp1(4)
949
950 if (bubbles_lagrange) then
951 ! Update pb and mass_v
952 fpb = mypb_tmp1(4)
953 fmass_v = mymv_tmp1(4)
954 end if
955
956 ! Update step size for the next sub-step
957 h = h*min(2._wp, max(0.5_wp, (adap_dt_tol/err(1))**(1._wp/3._wp)))
958
959 exit
960 else
961 ! Rejected. Update step size for the next try on sub-step
962 if (err(2) <= adap_dt_tol) then
963 h = 0.5_wp*h
964 else
965 h = 0.25_wp*h
966 end if
967 end if
968 end do
969
970 ! Exit the loop if the final time reached dt
971 if (f_approx_equal(t_new, 0.5_wp*dt) .or. iter_count >= adap_dt_max_iters) exit
972 end do
973
974 if (iter_count >= adap_dt_max_iters) adap_dt_stop = 1
975
976 end subroutine s_advance_step
977
978 !> Choose the initial time step size for the adaptive time stepping routine (See Heirer, E. Hairer S.P.Norsett G. Wanner,
979 !! Solving Ordinary Differential Equations I, Chapter II.4)
980 subroutine s_initial_substep_h(fRho, fP, fR, fV, fR0, fpb, fpbdot, alf, fntait, fBtait, f_bub_adv_src, f_divu, fCson, h)
981
982
983# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
984#ifdef _CRAYFTN
985# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
986#if MFC_OpenACC
987# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
988!$acc routine seq
989# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
990#elif MFC_OpenMP
991# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
992
993# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
994
995# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
996!$omp declare target device_type(any)
997# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
998#else
999# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1000!DIR$ INLINEALWAYS s_initial_substep_h
1001# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1002#endif
1003# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1004#elif MFC_OpenACC
1005# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1006!$acc routine seq
1007# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1008#elif MFC_OpenMP
1009# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1010
1011# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1012
1013# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1014!$omp declare target device_type(any)
1015# 447 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1016#endif
1017
1018 real(wp), intent(in) :: fRho, fP, fR, fV, fR0, fpb, fpbdot, alf
1019 real(wp), intent(in) :: fntait, fBtait, f_bub_adv_src, f_divu
1020 real(wp), intent(in) :: fCson
1021 real(wp), intent(out) :: h
1022 real(wp), dimension(2) :: h_size !< Time step size (h0, h1)
1023 real(wp), dimension(3) :: d_norms !< norms (d_0, d_1, d_2)
1024 real(wp), dimension(2) :: myR_tmp, myV_tmp, myA_tmp !< Bubble radius, radial velocity, and radial acceleration
1025 ! Determine the starting time step Evaluate f(x0,y0)
1026 myr_tmp(1) = fr
1027 myv_tmp(1) = fv
1028 mya_tmp(1) = f_rddot(frho, fp, myr_tmp(1), myv_tmp(1), fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, fcson)
1029
1030 ! Compute d_0 = ||y0|| and d_1 = ||f(x0,y0)||
1031 d_norms(1) = sqrt((myr_tmp(1)**2._wp + myv_tmp(1)**2._wp)/2._wp)
1032 d_norms(2) = sqrt((myv_tmp(1)**2._wp + mya_tmp(1)**2._wp)/2._wp)
1033 if (d_norms(1) < threshold_first_guess .or. d_norms(2) < threshold_first_guess) then
1034 h_size(1) = small_guess
1035 else
1036 h_size(1) = scale_guess*(d_norms(1)/d_norms(2))
1037 end if
1038
1039 ! Evaluate f(x0+h0,y0+h0*f(x0,y0))
1040 myr_tmp(2) = myr_tmp(1) + h_size(1)*myv_tmp(1)
1041 myv_tmp(2) = myv_tmp(1) + h_size(1)*mya_tmp(1)
1042 mya_tmp(2) = f_rddot(frho, fp, myr_tmp(2), myv_tmp(2), fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, fcson)
1043
1044 ! Compute d_2 = ||f(x0+h0,y0+h0*f(x0,y0))-f(x0,y0)||/h0
1045 d_norms(3) = sqrt(((myv_tmp(2) - myv_tmp(1))**2._wp + (mya_tmp(2) - mya_tmp(1))**2._wp)/2._wp)/h_size(1)
1046
1047 ! Set h1 = (0.01/max(d_1,d_2))^{1/(p+1)} if max(d_1,d_2) < 1.e-15_wp, h_size(2) = max(1.e-6_wp, h0*1.e-3_wp)
1048 if (max(d_norms(2), d_norms(3)) < threshold_second_guess) then
1049 h_size(2) = max(small_guess, h_size(1)*scale_first_guess)
1050 else
1051 h_size(2) = (scale_guess/max(d_norms(2), d_norms(3)))**(1._wp/3._wp)
1052 end if
1053
1054 h = min(h_size(1)/scale_guess, h_size(2))
1055
1056 end subroutine s_initial_substep_h
1057
1058 !> Integrate bubble variables over the given time step size, h, using a third-order accurate embedded Runge-Kutta scheme.
1059 subroutine s_advance_substep(err, fRho, fP, fR, fV, fR0, fpb, fpbdot, alf, fntait, fBtait, f_bub_adv_src, f_divu, bub_id, &
1060
1061 & fmass_v, fmass_g, fbeta_c, fbeta_t, fCson, h, myR_tmp, myV_tmp, myPb_tmp, myMv_tmp)
1062
1063# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1064#ifdef _CRAYFTN
1065# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1066#if MFC_OpenACC
1067# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1068!$acc routine seq
1069# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1070#elif MFC_OpenMP
1071# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1072
1073# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1074
1075# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1076!$omp declare target device_type(any)
1077# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1078#else
1079# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1080!DIR$ INLINEALWAYS s_advance_substep
1081# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1082#endif
1083# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1084#elif MFC_OpenACC
1085# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1086!$acc routine seq
1087# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1088#elif MFC_OpenMP
1089# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1090
1091# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1092
1093# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1094!$omp declare target device_type(any)
1095# 493 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1096#endif
1097
1098 real(wp), intent(out) :: err
1099 real(wp), intent(in) :: fRho, fP, fR, fV, fR0, fpb, fpbdot, alf
1100 real(wp), intent(in) :: fntait, fBtait, f_bub_adv_src, f_divu, h
1101 integer, intent(in) :: bub_id
1102 real(wp), intent(in) :: fmass_v, fmass_g, fbeta_c, fbeta_t, fCson
1103 real(wp), dimension(4), intent(out) :: myR_tmp, myV_tmp, myPb_tmp, myMv_tmp
1104 real(wp), dimension(4) :: myA_tmp, mydPbdt_tmp, mydMvdt_tmp
1105 real(wp) :: err_R, err_V
1106
1107 mypb_tmp(1:4) = fpb
1108 mydpbdt_tmp(1:4) = fpbdot
1109
1110 ! Stage 0
1111 myr_tmp(1) = fr
1112 myv_tmp(1) = fv
1113 if (bubbles_lagrange) then
1114 mypb_tmp(1) = fpb
1115 mymv_tmp(1) = fmass_v
1116 call s_advance_el(myr_tmp(1), myv_tmp(1), mypb_tmp(1), mymv_tmp(1), bub_id, fmass_g, fbeta_c, fbeta_t, &
1117 & mydpbdt_tmp(1), mydmvdt_tmp(1))
1118 end if
1119 mya_tmp(1) = f_rddot(frho, fp, myr_tmp(1), myv_tmp(1), fr0, mypb_tmp(1), mydpbdt_tmp(1), alf, fntait, fbtait, &
1120 & f_bub_adv_src, f_divu, fcson)
1121
1122 ! Stage 1
1123 myr_tmp(2) = myr_tmp(1) + h*myv_tmp(1)
1124 if (myr_tmp(2) < 0._wp) then
1125 err = adap_dt_tol + 1._wp; return
1126 end if
1127 myv_tmp(2) = myv_tmp(1) + h*mya_tmp(1)
1128 if (bubbles_lagrange) then
1129 mypb_tmp(2) = mypb_tmp(1) + h*mydpbdt_tmp(1)
1130 mymv_tmp(2) = mymv_tmp(1) + h*mydmvdt_tmp(1)
1131 call s_advance_el(myr_tmp(2), myv_tmp(2), mypb_tmp(2), mymv_tmp(2), bub_id, fmass_g, fbeta_c, fbeta_t, &
1132 & mydpbdt_tmp(2), mydmvdt_tmp(2))
1133 end if
1134 mya_tmp(2) = f_rddot(frho, fp, myr_tmp(2), myv_tmp(2), fr0, mypb_tmp(2), mydpbdt_tmp(2), alf, fntait, fbtait, &
1135 & f_bub_adv_src, f_divu, fcson)
1136
1137 ! Stage 2
1138 myr_tmp(3) = myr_tmp(1) + (h/4._wp)*(myv_tmp(1) + myv_tmp(2))
1139 if (myr_tmp(3) < 0._wp) then
1140 err = adap_dt_tol + 1._wp; return
1141 end if
1142 myv_tmp(3) = myv_tmp(1) + (h/4._wp)*(mya_tmp(1) + mya_tmp(2))
1143 if (bubbles_lagrange) then
1144 mypb_tmp(3) = mypb_tmp(1) + (h/4._wp)*(mydpbdt_tmp(1) + mydpbdt_tmp(2))
1145 mymv_tmp(3) = mymv_tmp(1) + (h/4._wp)*(mydmvdt_tmp(1) + mydmvdt_tmp(2))
1146 call s_advance_el(myr_tmp(3), myv_tmp(3), mypb_tmp(3), mymv_tmp(3), bub_id, fmass_g, fbeta_c, fbeta_t, &
1147 & mydpbdt_tmp(3), mydmvdt_tmp(3))
1148 end if
1149 mya_tmp(3) = f_rddot(frho, fp, myr_tmp(3), myv_tmp(3), fr0, mypb_tmp(3), mydpbdt_tmp(3), alf, fntait, fbtait, &
1150 & f_bub_adv_src, f_divu, fcson)
1151
1152 ! Stage 3
1153 myr_tmp(4) = myr_tmp(1) + (h/6._wp)*(myv_tmp(1) + myv_tmp(2) + 4._wp*myv_tmp(3))
1154 if (myr_tmp(4) < 0._wp) then
1155 err = adap_dt_tol + 1._wp; return
1156 end if
1157 myv_tmp(4) = myv_tmp(1) + (h/6._wp)*(mya_tmp(1) + mya_tmp(2) + 4._wp*mya_tmp(3))
1158 if (bubbles_lagrange) then
1159 mypb_tmp(4) = mypb_tmp(1) + (h/6._wp)*(mydpbdt_tmp(1) + mydpbdt_tmp(2) + 4._wp*mydpbdt_tmp(3))
1160 mymv_tmp(4) = mymv_tmp(1) + (h/6._wp)*(mydmvdt_tmp(1) + mydmvdt_tmp(2) + 4._wp*mydmvdt_tmp(3))
1161 call s_advance_el(myr_tmp(4), myv_tmp(4), mypb_tmp(4), mymv_tmp(4), bub_id, fmass_g, fbeta_c, fbeta_t, &
1162 & mydpbdt_tmp(4), mydmvdt_tmp(4))
1163 end if
1164 mya_tmp(4) = f_rddot(frho, fp, myr_tmp(4), myv_tmp(4), fr0, mypb_tmp(4), mydpbdt_tmp(4), alf, fntait, fbtait, &
1165 & f_bub_adv_src, f_divu, fcson)
1166
1167 ! Estimate error
1168 err_r = (-5._wp*h/24._wp)*(myv_tmp(2) + myv_tmp(3) - 2._wp*myv_tmp(4))/max(abs(myr_tmp(1)), abs(myr_tmp(4)))
1169 err_v = (-5._wp*h/24._wp)*(mya_tmp(2) + mya_tmp(3) - 2._wp*mya_tmp(4))/max(abs(myv_tmp(1)), abs(myv_tmp(4)))
1170 ! Error correction for non-oscillating bubbles
1171 if (max(abs(myv_tmp(1)), abs(myv_tmp(4))) < 1.e-12_wp) then
1172 err_v = 0._wp
1173 end if
1174 if (bubbles_lagrange .and. f_approx_equal(mya_tmp(1), 0._wp) .and. f_approx_equal(mya_tmp(2), &
1175 & 0._wp) .and. f_approx_equal(mya_tmp(3), 0._wp) .and. f_approx_equal(mya_tmp(4), 0._wp)) then
1176 err_v = 0._wp
1177 end if
1178 err = sqrt((err_r**2._wp + err_v**2._wp)/2._wp)
1179
1180 end subroutine s_advance_substep
1181
1182 !> Changes of pressure and vapor mass in the lagrange bubbles.
1183 elemental subroutine s_advance_el(fR_tmp, fV_tmp, fPb_tmp, fMv_tmp, bub_id, fmass_g, fbeta_c, fbeta_t, fdPbdt_tmp, advance_EL)
1184
1185
1186# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1187#if MFC_OpenACC
1188# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1189!$acc routine seq
1190# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1191#elif MFC_OpenMP
1192# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1193
1194# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1195
1196# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1197!$omp declare target device_type(any)
1198# 582 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles.fpp"
1199#endif
1200 real(wp), intent(in) :: fr_tmp, fv_tmp, fpb_tmp, fmv_tmp
1201 real(wp), intent(in) :: fmass_g, fbeta_c, fbeta_t
1202 integer, intent(in) :: bub_id
1203 real(wp), intent(inout) :: fdpbdt_tmp
1204 real(wp), intent(out) :: advance_el
1205 real(wp) :: fvapflux, myr_m, mygamma_m
1206
1207 call s_vflux(fr_tmp, fv_tmp, fpb_tmp, fmv_tmp, bub_id, fvapflux, fmass_g, fbeta_c, myr_m, mygamma_m)
1208 fdpbdt_tmp = f_bpres_dot(fvapflux, fr_tmp, fv_tmp, fpb_tmp, fmv_tmp, bub_id, fbeta_t, myr_m, mygamma_m)
1209 advance_el = 4._wp*pi*fr_tmp**2._wp*fvapflux
1210
1211 end subroutine s_advance_el
1212
1213end module m_bubbles
Shared bubble-dynamics procedures (radial acceleration, wall pressure, sound speed) for ensemble- and...
elemental real(wp) function f_cpinfdot(frho, fp, falf, fntait, fbtait, advsrc, divu)
Compute the time derivative of the driving pressure.
elemental real(wp) function f_cpbw(fr0, fr, fv, fpb)
Bubble wall pressure: stiffened gas with Laplace pressure and viscous stress.
elemental real(wp) function f_h(fcpbw, fcpinf, fntait, fbtait)
Compute the bubble enthalpy.
subroutine s_advance_step(frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, bub_id, fmass_v, fmass_g, fbeta_c, fbeta_t, fcson, adap_dt_stop)
Adaptive time stepping routine for subgrid bubbles (See Heirer, E. Hairer S.P.Norsett G....
subroutine s_initial_substep_h(frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, fcson, h)
Choose the initial time step size for the adaptive time stepping routine (See Heirer,...
elemental subroutine s_bwproperty(pb_in, ir0, chi_vw_out, k_mw_out, rho_mw_out)
Compute bubble wall properties for vapor bubbles.
real(wp) k_mw
Bubble wall properties (Ando 2010).
elemental real(wp) function f_rddot(frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, fcson)
Compute the bubble radial acceleration based on the selected bubble model.
elemental real(wp) function f_rddot_g(fcpbw, fr, fv, fh, fhdot, fcgas, fntait, fbtait)
Compute the Gilmore bubble radial acceleration.
elemental real(wp) function f_cpbw_km(fr0, fr, fv, fpb)
Keller-Miksis bubble wall pressure.
elemental real(wp) function f_rddot_km(fpbdot, fcp, fcpbw, frho, fr, fv, fr0, fc)
Keller-Miksis bubble radial acceleration.
real(wp) rho_mw
Bubble wall properties (Ando 2010).
elemental subroutine s_advance_el(fr_tmp, fv_tmp, fpb_tmp, fmv_tmp, bub_id, fmass_g, fbeta_c, fbeta_t, fdpbdt_tmp, advance_el)
Changes of pressure and vapor mass in the lagrange bubbles.
elemental subroutine s_vflux(fr, fv, fpb, fmass_v, ir0, vflux, fmass_g, fbeta_c, fr_m, fgamma_m)
Compute the vapour flux.
elemental real(wp) function f_cgas(fcpinf, fntait, fbtait, fh)
Compute the sound speed for the bubble.
elemental real(wp) function f_hdot(fcpbw, fcpinf, fcpinf_dot, fntait, fbtait, fr, fv, fr0, fpbdot)
Enthalpy derivative for Gilmore bubble model, Gilmore (1952).
subroutine s_advance_substep(err, frho, fp, fr, fv, fr0, fpb, fpbdot, alf, fntait, fbtait, f_bub_adv_src, f_divu, bub_id, fmass_v, fmass_g, fbeta_c, fbeta_t, fcson, h, myr_tmp, myv_tmp, mypb_tmp, mymv_tmp)
Integrate bubble variables over the given time step size, h, using a third-order accurate embedded Ru...
real(wp) chi_vw
Bubble wall properties (Ando 2010).
elemental real(wp) function f_bpres_dot(fvflux, fr, fv, fpb, fmass_v, ir0, fbeta_t, fr_m, fgamma_m)
Compute the time derivative of the internal bubble pressure.
elemental real(wp) function f_rddot_rp(fcp, frho, fr, fv, fcpbw)
Rayleigh-Plesset bubble radial acceleration.
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...
logical bubbles_euler
Bubbles euler on/off.
integer thermal
Thermal behavior. 1 = adiabatic, 2 = isotherm, 3 = transfer.
real(wp), dimension(:), allocatable pb0
type(bubbles_lagrange_parameters) lag_params
Lagrange bubbles' parameters.
real(wp), dimension(:), allocatable re_trans_t
real(wp), dimension(:), allocatable k_v
real(wp) re_inv
Inverse Reynolds number.
real(wp), dimension(:), allocatable r0
Bubble sizes.
real(wp), dimension(:), allocatable k_g
logical bubbles_lagrange
Lagrangian subgrid bubble model switch.
real(wp) ca
Cavitation number.
logical polytropic
Polytropic switch.
integer adap_dt_max_iters
Maximum number of iterations.
real(wp) adap_dt_tol
Tolerance to control adaptive step size.
real(wp), dimension(:), allocatable mass_g0
logical mpp_lim
Mixture physical parameters (MPP) limits.
real(wp), dimension(:), allocatable re_trans_c
real(wp) dt
Size of the time-step.
integer bubble_model
Gilmore or Keller–Miksis bubble model.
real(wp), dimension(:), allocatable pe_t
real(wp), dimension(:), allocatable mass_v0
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
logical elemental function, public f_approx_equal(a, b, tol_input)
Check if two floating point numbers of wp are within tolerance.
logical elemental function, public f_is_default(var)
Checks if a real(wp) variable is of default value.
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.