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