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