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