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