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