MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_bubbles_EL_kernels.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
2!>
3!! @file
4!! @brief Contains module @ref m_bubbles_el_kernels "m_bubbles_EL_kernels"
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32! New line at end of file is required for FYPP
33# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
34# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
35# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
36# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45
46# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59! New line at end of file is required for FYPP
60# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
61
62# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
63# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
64# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
65# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
66# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67
68# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69
70# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 207 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 232 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 243 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 245 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 283 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 293 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 303 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 312 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 329 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 346 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 358 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 364 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 370 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 376 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138! New line at end of file is required for FYPP
139# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
140# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
141# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
142# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
143# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
144# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
145# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
146# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147
148# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153
154# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161
162# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165! New line at end of file is required for FYPP
166# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
167
168# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
169
170# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
171
172# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
173
174# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 192 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 213 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 241 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 256 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 266 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 275 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 291 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 301 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 308 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223! New line at end of file is required for FYPP
224# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
225
226# 21 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
227
228# 37 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
229
230# 50 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
231
232# 76 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
233
234# 91 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
235
236# 102 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238# 115 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
239
240# 143 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
241
242# 154 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244# 165 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245
246# 176 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
247
248# 187 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250# 198 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251
252# 208 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
253
254# 214 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256# 220 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258# 226 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
259
260# 232 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262# 234 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263# 235 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264! New line at end of file is required for FYPP
265# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
266
267# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
268
269! Caution:
270! This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI rank.
271! That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0.
272! For an example see misc/nvidia_uvm/bind.sh.
273# 63 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
274
275# 81 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
276
277# 88 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
278
279# 111 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
280
281# 127 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
282
283# 153 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
284
285# 159 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
286
287# 167 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
288! New line at end of file is required for FYPP
289# 6 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp" 2
290
291!> @brief Kernel functions (Gaussian, delta) that smear Lagrangian bubble effects onto the Eulerian grid
293
294 use m_mpi_proxy !< message passing interface (mpi) module proxy
295
296 implicit none
297
298contains
299
300 !> The purpose of this subroutine is to smear the strength of the lagrangian
301 !! bubbles into the Eulerian framework using different approaches.
302 !! @param nBubs Number of lagrangian bubbles in the current domain
303 !! @param lbk_rad Radius of the bubbles
304 !! @param lbk_vel Interface velocity of the bubbles
305 !! @param lbk_s Computational coordinates of the bubbles
306 !! @param lbk_pos Spatial coordinates of the bubbles
307 !! @param updatedvar Eulerian variable to be updated
308 subroutine s_smoothfunction(nBubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
309
310 integer, intent(in) :: nBubs
311 real(wp), dimension(1:lag_params%nBubs_glb, 1:3, 1:2), intent(in) :: lbk_s, lbk_pos
312 real(wp), dimension(1:lag_params%nBubs_glb, 1:2), intent(in) :: lbk_rad, lbk_vel
313 type(scalar_field), dimension(:), intent(inout) :: updatedvar
314
315 smoothfunc:select case(lag_params%smooth_type)
316 case (1)
317 call s_gaussian(nbubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
318 case (2)
319 call s_deltafunc(nbubs, lbk_rad, lbk_vel, lbk_s, updatedvar)
320 end select smoothfunc
321
322 end subroutine s_smoothfunction
323
324 !> The purpose of this procedure contains the algorithm to use the delta kernel function to map the effect of the bubbles.
325 !! The effect of the bubbles only affects the cell where the bubble is located.
326 subroutine s_deltafunc(nBubs, lbk_rad, lbk_vel, lbk_s, updatedvar)
327
328 integer, intent(in) :: nBubs
329 real(wp), dimension(1:lag_params%nBubs_glb, 1:3, 1:2), intent(in) :: lbk_s
330 real(wp), dimension(1:lag_params%nBubs_glb, 1:2), intent(in) :: lbk_rad, lbk_vel
331 type(scalar_field), dimension(:), intent(inout) :: updatedvar
332
333 integer, dimension(3) :: cell
334 real(wp) :: strength_vel, strength_vol
335
336 real(wp) :: addFun1, addFun2, addFun3
337 real(wp) :: volpart, Vol
338 real(wp), dimension(3) :: s_coord
339 integer :: l
340
341
342# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
343
344# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
345#if defined(MFC_OpenACC)
346# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
347!$acc parallel loop gang vector default(present) private(l, s_coord, cell)
348# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
349#elif defined(MFC_OpenMP)
350# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
351
352# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
353
354# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
355
356# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
357!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(l, s_coord, cell)
358# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
359#endif
360# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
361
362 do l = 1, nbubs
363
364 volpart = 4._wp/3._wp*pi*lbk_rad(l, 2)**3._wp
365 s_coord(1:3) = lbk_s(l, 1:3, 2)
366 call s_get_cell(s_coord, cell)
367
368 strength_vol = volpart
369 strength_vel = 4._wp*pi*lbk_rad(l, 2)**2._wp*lbk_vel(l, 2)
370
371 if (num_dims == 2) then
372 vol = dx(cell(1))*dy(cell(2))*lag_params%charwidth
373 if (cyl_coord) vol = dx(cell(1))*dy(cell(2))*y_cc(cell(2))*2._wp*pi
374 else
375 vol = dx(cell(1))*dy(cell(2))*dz(cell(3))
376 end if
377
378 !Update void fraction field
379 addfun1 = strength_vol/vol
380
381# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
382#if defined(MFC_OpenACC)
383# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
384!$acc atomic update
385# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
386#elif defined(MFC_OpenMP)
387# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
388!$omp atomic update
389# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
390#endif
391 updatedvar(1)%sf(cell(1), cell(2), cell(3)) = updatedvar(1)%sf(cell(1), cell(2), cell(3)) + real(addfun1, kind=stp)
392
393 !Update time derivative of void fraction
394 addfun2 = strength_vel/vol
395
396# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
397#if defined(MFC_OpenACC)
398# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
399!$acc atomic update
400# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
401#elif defined(MFC_OpenMP)
402# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
403!$omp atomic update
404# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
405#endif
406 updatedvar(2)%sf(cell(1), cell(2), cell(3)) = updatedvar(2)%sf(cell(1), cell(2), cell(3)) + real(addfun2, kind=stp)
407
408 !Product of two smeared functions
409 !Update void fraction * time derivative of void fraction
410 if (lag_params%cluster_type >= 4) then
411 addfun3 = (strength_vol*strength_vel)/vol
412
413# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
414#if defined(MFC_OpenACC)
415# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
416!$acc atomic update
417# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
418#elif defined(MFC_OpenMP)
419# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
420!$omp atomic update
421# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
422#endif
423 updatedvar(5)%sf(cell(1), cell(2), cell(3)) = updatedvar(5)%sf(cell(1), cell(2), cell(3)) + real(addfun3, kind=stp)
424 end if
425 end do
426
427# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
428
429# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
430#if defined(MFC_OpenACC)
431# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
432!$acc end parallel loop
433# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
434#elif defined(MFC_OpenMP)
435# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
436
437# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
438
439# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
440!$omp end target teams loop
441# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
442#endif
443# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
444
445
446 end subroutine s_deltafunc
447
448 !> The purpose of this procedure contains the algorithm to use the gaussian kernel function to map the effect of the bubbles.
449 !! The effect of the bubbles affects the 3X3x3 cells that surround the bubble.
450 subroutine s_gaussian(nBubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
451
452 integer, intent(in) :: nBubs
453 real(wp), dimension(1:lag_params%nBubs_glb, 1:3, 1:2), intent(in) :: lbk_s, lbk_pos
454 real(wp), dimension(1:lag_params%nBubs_glb, 1:2), intent(in) :: lbk_rad, lbk_vel
455 type(scalar_field), dimension(:), intent(inout) :: updatedvar
456
457 real(wp), dimension(3) :: center
458 integer, dimension(3) :: cell
459 real(wp) :: stddsv
460 real(wp) :: strength_vel, strength_vol
461
462 real(wp), dimension(3) :: nodecoord
463 real(wp) :: addFun1, addFun2, addFun3
464 real(wp) :: func, func2, volpart
465 integer, dimension(3) :: cellaux
466 real(wp), dimension(3) :: s_coord
467 integer :: l, i, j, k
468 logical :: celloutside
469 integer :: smearGrid, smearGridz
470
471 smeargrid = mapcells - (-mapcells) + 1 ! Include the cell that contains the bubble (3+1+3)
472 smeargridz = smeargrid
473 if (p == 0) smeargridz = 1
474
475
476# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
477
478# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
479#if defined(MFC_OpenACC)
480# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
481!$acc parallel loop gang vector default(present) private(nodecoord, l, s_coord, cell, center) copyin(smearGrid, smearGridz)
482# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
483#elif defined(MFC_OpenMP)
484# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
485
486# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
487
488# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
489
490# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
491!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(nodecoord, l, s_coord, cell, center) map(to:smearGrid, smearGridz)
492# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
493#endif
494# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
495
496 do l = 1, nbubs
497 nodecoord(1:3) = 0
498 center(1:3) = 0._wp
499 volpart = 4._wp/3._wp*pi*lbk_rad(l, 2)**3._wp
500 s_coord(1:3) = lbk_s(l, 1:3, 2)
501 center(1:2) = lbk_pos(l, 1:2, 2)
502 if (p > 0) center(3) = lbk_pos(l, 3, 2)
503 call s_get_cell(s_coord, cell)
504 call s_compute_stddsv(cell, volpart, stddsv)
505
506 strength_vol = volpart
507 strength_vel = 4._wp*pi*lbk_rad(l, 2)**2._wp*lbk_vel(l, 2)
508
509
510# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
511#if defined(MFC_OpenACC)
512# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
513!$acc loop collapse(3) private(cellaux, nodecoord)
514# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
515#elif defined(MFC_OpenMP)
516# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
517
518# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
519#endif
520 do i = 1, smeargrid
521 do j = 1, smeargrid
522 do k = 1, smeargridz
523 cellaux(1) = cell(1) + i - (mapcells + 1)
524 cellaux(2) = cell(2) + j - (mapcells + 1)
525 cellaux(3) = cell(3) + k - (mapcells + 1)
526 if (p == 0) cellaux(3) = 0
527
528 !Check if the cells intended to smear the bubbles in are in the computational domain
529 !and redefine the cells for symmetric boundary
530 call s_check_celloutside(cellaux, celloutside)
531
532 if (.not. celloutside) then
533
534 nodecoord(1) = x_cc(cellaux(1))
535 nodecoord(2) = y_cc(cellaux(2))
536 if (p > 0) nodecoord(3) = z_cc(cellaux(3))
537 call s_applygaussian(center, cellaux, nodecoord, stddsv, 0._wp, func)
538 if (lag_params%cluster_type >= 4) call s_applygaussian(center, cellaux, nodecoord, stddsv, 1._wp, func2)
539
540 ! Relocate cells for bubbles intersecting symmetric boundaries
541 if (any((/bc_x%beg, bc_x%end, bc_y%beg, bc_y%end, bc_z%beg, bc_z%end/) == bc_reflective)) then
542 call s_shift_cell_symmetric_bc(cellaux, cell)
543 end if
544 else
545 func = 0._wp
546 func2 = 0._wp
547 cellaux(1) = cell(1)
548 cellaux(2) = cell(2)
549 cellaux(3) = cell(3)
550 if (p == 0) cellaux(3) = 0
551 end if
552
553 !Update void fraction field
554 addfun1 = func*strength_vol
555
556# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
557#if defined(MFC_OpenACC)
558# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
559!$acc atomic update
560# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
561#elif defined(MFC_OpenMP)
562# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
563!$omp atomic update
564# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
565#endif
566 updatedvar(1)%sf(cellaux(1), cellaux(2), cellaux(3)) = &
567 updatedvar(1)%sf(cellaux(1), cellaux(2), cellaux(3)) &
568 + real(addfun1, kind=stp)
569
570 !Update time derivative of void fraction
571 addfun2 = func*strength_vel
572
573# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
574#if defined(MFC_OpenACC)
575# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
576!$acc atomic update
577# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
578#elif defined(MFC_OpenMP)
579# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
580!$omp atomic update
581# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
582#endif
583 updatedvar(2)%sf(cellaux(1), cellaux(2), cellaux(3)) = &
584 updatedvar(2)%sf(cellaux(1), cellaux(2), cellaux(3)) &
585 + real(addfun2, kind=stp)
586
587 !Product of two smeared functions
588 !Update void fraction * time derivative of void fraction
589 if (lag_params%cluster_type >= 4) then
590 addfun3 = func2*strength_vol*strength_vel
591
592# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
593#if defined(MFC_OpenACC)
594# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
595!$acc atomic update
596# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
597#elif defined(MFC_OpenMP)
598# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
599!$omp atomic update
600# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
601#endif
602 updatedvar(5)%sf(cellaux(1), cellaux(2), cellaux(3)) = &
603 updatedvar(5)%sf(cellaux(1), cellaux(2), cellaux(3)) &
604 + real(addfun3, kind=stp)
605 end if
606 end do
607 end do
608 end do
609 end do
610
611# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
612
613# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
614#if defined(MFC_OpenACC)
615# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
616!$acc end parallel loop
617# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
618#elif defined(MFC_OpenMP)
619# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
620
621# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
622
623# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
624!$omp end target teams loop
625# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
626#endif
627# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
628
629
630 end subroutine s_gaussian
631
632 !> The purpose of this subroutine is to apply the gaussian kernel function for each bubble (Maeda and Colonius, 2018)).
633 subroutine s_applygaussian(center, cellaux, nodecoord, stddsv, strength_idx, func)
634
635# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
636#ifdef _CRAYFTN
637# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
638!DIR$ INLINEALWAYS s_applygaussian
639# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
640#elif MFC_OpenACC
641# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
642!$acc routine seq
643# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
644#elif MFC_OpenMP
645# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
646
647# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
648
649# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
650!$omp declare target device_type(any)
651# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
652#endif
653# 206 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
654
655 real(wp), dimension(3), intent(in) :: center
656 integer, dimension(3), intent(in) :: cellaux
657 real(wp), dimension(3), intent(in) :: nodecoord
658 real(wp), intent(in) :: stddsv
659 real(wp), intent(in) :: strength_idx
660 real(wp), intent(out) :: func
661
662 real(wp) :: distance
663 real(wp) :: theta, dtheta, L2, dzp, Lz2
664 real(wp) :: Nr, Nr_count
665
666 distance = sqrt((center(1) - nodecoord(1))**2._wp + (center(2) - nodecoord(2))**2._wp + (center(3) - nodecoord(3))**2._wp)
667
668 if (num_dims == 3) then
669 !< 3D gaussian function
670 func = exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**3._wp
671 else
672 if (cyl_coord) then
673 !< 2D cylindrical function:
674 ! We smear particles in the azimuthal direction for given r
675 theta = 0._wp
676 nr = ceiling(2._wp*pi*nodecoord(2)/(y_cb(cellaux(2)) - y_cb(cellaux(2) - 1)))
677 dtheta = 2._wp*pi/nr
678 l2 = center(2)**2._wp + nodecoord(2)**2._wp - 2._wp*center(2)*nodecoord(2)*cos(theta)
679 distance = sqrt((center(1) - nodecoord(1))**2._wp + l2)
680 ! Factor 2._wp is for symmetry (upper half of the 2D field (+r) is considered)
681 func = dtheta/2._wp/pi*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**3._wp
682 nr_count = 0._wp
683 do while (nr_count < nr - 1._wp)
684 nr_count = nr_count + 1._wp
685 theta = nr_count*dtheta
686 ! trigonometric relation
687 l2 = center(2)**2._wp + nodecoord(2)**2._wp - 2._wp*center(2)*nodecoord(2)*cos(theta)
688 distance = sqrt((center(1) - nodecoord(1))**2._wp + l2)
689 ! nodecoord(2)*dtheta is the azimuthal width of the cell
690 func = func + &
691 dtheta/2._wp/pi*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**(3._wp*(strength_idx + 1._wp))
692 end do
693 else
694
695 !< 2D cartesian function:
696 ! We smear particles considering a virtual depth (lag_params%charwidth)
697 theta = 0._wp
698 nr = ceiling(lag_params%charwidth/(y_cb(cellaux(2)) - y_cb(cellaux(2) - 1)))
699 nr_count = 1._wp - mapcells*1._wp
700 dzp = y_cb(cellaux(2) + 1) - y_cb(cellaux(2))
701 lz2 = (center(3) - (dzp*(0.5_wp + nr_count) - lag_params%charwidth/2._wp))**2._wp
702 distance = sqrt((center(1) - nodecoord(1))**2._wp + (center(2) - nodecoord(2))**2._wp + lz2)
703 func = dzp/lag_params%charwidth*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**3._wp
704 do while (nr_count < nr - 1._wp + ((mapcells - 1)*1._wp))
705 nr_count = nr_count + 1._wp
706 lz2 = (center(3) - (dzp*(0.5_wp + nr_count) - lag_params%charwidth/2._wp))**2._wp
707 distance = sqrt((center(1) - nodecoord(1))**2._wp + (center(2) - nodecoord(2))**2._wp + lz2)
708 func = func + &
709 dzp/lag_params%charwidth*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**(3._wp*(strength_idx + 1._wp))
710 end do
711 end if
712 end if
713
714 end subroutine s_applygaussian
715
716 !> The purpose of this subroutine is to check if the current cell is outside the computational domain or not (including ghost cells).
717 !! @param cellaux Tested cell to smear the bubble effect in.
718 !! @param celloutside If true, then cellaux is outside the computational domain.
719 subroutine s_check_celloutside(cellaux, celloutside)
720
721# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
722#ifdef _CRAYFTN
723# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
724!DIR$ INLINEALWAYS s_check_celloutside
725# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
726#elif MFC_OpenACC
727# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
728!$acc routine seq
729# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
730#elif MFC_OpenMP
731# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
732
733# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
734
735# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
736!$omp declare target device_type(any)
737# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
738#endif
739# 274 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
740
741 integer, dimension(3), intent(inout) :: cellaux
742 logical, intent(out) :: celloutside
743
744 celloutside = .false.
745
746 if (num_dims == 2) then
747 if ((cellaux(1) < -buff_size) .or. (cellaux(2) < -buff_size)) then
748 celloutside = .true.
749 end if
750 if (cyl_coord .and. y_cc(cellaux(2)) < 0._wp) then
751 celloutside = .true.
752 end if
753 if ((cellaux(2) > n + buff_size) .or. (cellaux(1) > m + buff_size)) then
754 celloutside = .true.
755 end if
756 else
757 if ((cellaux(3) < -buff_size) .or. (cellaux(1) < -buff_size) .or. (cellaux(2) < -buff_size)) then
758 celloutside = .true.
759 end if
760
761 if ((cellaux(3) > p + buff_size) .or. (cellaux(2) > n + buff_size) .or. (cellaux(1) > m + buff_size)) then
762 celloutside = .true.
763 end if
764 end if
765
766 end subroutine s_check_celloutside
767
768 !> This subroutine relocates the current cell, if it intersects a symmetric boundary.
769 !! @param cell Cell of the current bubble
770 !! @param cellaux Cell to map the bubble effect in.
771 subroutine s_shift_cell_symmetric_bc(cellaux, cell)
772
773# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
774#ifdef _CRAYFTN
775# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
776!DIR$ INLINEALWAYS s_shift_cell_symmetric_bc
777# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
778#elif MFC_OpenACC
779# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
780!$acc routine seq
781# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
782#elif MFC_OpenMP
783# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
784
785# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
786
787# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
788!$omp declare target device_type(any)
789# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
790#endif
791# 308 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
792
793 integer, dimension(3), intent(inout) :: cellaux
794 integer, dimension(3), intent(in) :: cell
795
796 ! x-dir
797 if (bc_x%beg == bc_reflective .and. (cell(1) <= mapcells - 1)) then
798 cellaux(1) = abs(cellaux(1)) - 1
799 end if
800 if (bc_x%end == bc_reflective .and. (cell(1) >= m + 1 - mapcells)) then
801 cellaux(1) = cellaux(1) - (2*(cellaux(1) - m) - 1)
802 end if
803
804 !y-dir
805 if (bc_y%beg == bc_reflective .and. (cell(2) <= mapcells - 1)) then
806 cellaux(2) = abs(cellaux(2)) - 1
807 end if
808 if (bc_y%end == bc_reflective .and. (cell(2) >= n + 1 - mapcells)) then
809 cellaux(2) = cellaux(2) - (2*(cellaux(2) - n) - 1)
810 end if
811
812 if (p > 0) then
813 !z-dir
814 if (bc_z%beg == bc_reflective .and. (cell(3) <= mapcells - 1)) then
815 cellaux(3) = abs(cellaux(3)) - 1
816 end if
817 if (bc_z%end == bc_reflective .and. (cell(3) >= p + 1 - mapcells)) then
818 cellaux(3) = cellaux(3) - (2*(cellaux(3) - p) - 1)
819 end if
820 end if
821
822 end subroutine s_shift_cell_symmetric_bc
823
824 !> Calculates the standard deviation of the bubble being smeared in the Eulerian framework.
825 !! @param cell Cell where the bubble is located
826 !! @param volpart Volume of the bubble
827 !! @param stddsv Standard deviaton
828 subroutine s_compute_stddsv(cell, volpart, stddsv)
829
830# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
831#ifdef _CRAYFTN
832# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
833!DIR$ INLINEALWAYS s_compute_stddsv
834# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
835#elif MFC_OpenACC
836# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
837!$acc routine seq
838# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
839#elif MFC_OpenMP
840# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
841
842# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
843
844# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
845!$omp declare target device_type(any)
846# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
847#endif
848# 347 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
849
850 integer, dimension(3), intent(in) :: cell
851 real(wp), intent(in) :: volpart
852 real(wp), intent(out) :: stddsv
853
854 real(wp) :: chardist, charvol
855 real(wp) :: rad
856
857 !< Compute characteristic distance
858 chardist = sqrt(dx(cell(1))*dy(cell(2)))
859 if (p > 0) chardist = (dx(cell(1))*dy(cell(2))*dz(cell(3)))**(1._wp/3._wp)
860
861 !< Compute characteristic volume
862 if (p > 0) then
863 charvol = dx(cell(1))*dy(cell(2))*dz(cell(3))
864 else
865 if (cyl_coord) then
866 charvol = dx(cell(1))*dy(cell(2))*y_cc(cell(2))*2._wp*pi
867 else
868 charvol = dx(cell(1))*dy(cell(2))*lag_params%charwidth
869 end if
870 end if
871
872 !< Compute Standard deviaton
873 if (((volpart/charvol) > 0.5_wp*lag_params%valmaxvoid) .or. (lag_params%smooth_type == 1)) then
874 rad = (3._wp*volpart/(4._wp*pi))**(1._wp/3._wp)
875 stddsv = 1._wp*lag_params%epsilonb*max(chardist, rad)
876 else
877 stddsv = 0._wp
878 end if
879
880 end subroutine s_compute_stddsv
881
882 !> The purpose of this procedure is to calculate the characteristic cell volume
883 !! @param cellx x-direction cell index
884 !! @param celly y-direction cell index
885 !! @param cellz z-direction cell index
886 !! @param Charvol Characteristic volume
887 subroutine s_get_char_vol(cellx, celly, cellz, Charvol)
888
889# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
890#ifdef _CRAYFTN
891# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
892!DIR$ INLINEALWAYS s_get_char_vol
893# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
894#elif MFC_OpenACC
895# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
896!$acc routine seq
897# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
898#elif MFC_OpenMP
899# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
900
901# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
902
903# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
904!$omp declare target device_type(any)
905# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
906#endif
907# 388 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
908
909 integer, intent(in) :: cellx, celly, cellz
910 real(wp), intent(out) :: Charvol
911
912 if (p > 0) then
913 charvol = dx(cellx)*dy(celly)*dz(cellz)
914 else
915 if (cyl_coord) then
916 charvol = dx(cellx)*dy(celly)*y_cc(celly)*2._wp*pi
917 else
918 charvol = dx(cellx)*dy(celly)*lag_params%charwidth
919 end if
920 end if
921
922 end subroutine s_get_char_vol
923
924 !> This subroutine transforms the computational coordinates of the bubble from
925 !! real type into integer.
926 !! @param s_cell Computational coordinates of the bubble, real type
927 !! @param get_cell Computational coordinates of the bubble, integer type
928 subroutine s_get_cell(s_cell, get_cell)
929
930# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
931#ifdef _CRAYFTN
932# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
933!DIR$ INLINEALWAYS s_get_cell
934# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
935#elif MFC_OpenACC
936# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
937!$acc routine seq
938# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
939#elif MFC_OpenMP
940# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
941
942# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
943
944# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
945!$omp declare target device_type(any)
946# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
947#endif
948# 411 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
949
950 real(wp), dimension(3), intent(in) :: s_cell
951 integer, dimension(3), intent(out) :: get_cell
952 integer :: i
953
954 get_cell(:) = int(s_cell(:))
955 do i = 1, num_dims
956 if (s_cell(i) < 0._wp) get_cell(i) = get_cell(i) - 1
957 end do
958
959 end subroutine s_get_cell
960
961end module m_bubbles_el_kernels
Kernel functions (Gaussian, delta) that smear Lagrangian bubble effects onto the Eulerian grid.
subroutine s_smoothfunction(nbubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
The purpose of this subroutine is to smear the strength of the lagrangian bubbles into the Eulerian f...
subroutine s_applygaussian(center, cellaux, nodecoord, stddsv, strength_idx, func)
The purpose of this subroutine is to apply the gaussian kernel function for each bubble (Maeda and Co...
subroutine s_check_celloutside(cellaux, celloutside)
The purpose of this subroutine is to check if the current cell is outside the computational domain or...
subroutine s_gaussian(nbubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
The purpose of this procedure contains the algorithm to use the gaussian kernel function to map the e...
subroutine s_shift_cell_symmetric_bc(cellaux, cell)
This subroutine relocates the current cell, if it intersects a symmetric boundary.
subroutine s_compute_stddsv(cell, volpart, stddsv)
Calculates the standard deviation of the bubble being smeared in the Eulerian framework.
subroutine s_get_char_vol(cellx, celly, cellz, charvol)
The purpose of this procedure is to calculate the characteristic cell volume.
subroutine s_get_cell(s_cell, get_cell)
This subroutine transforms the computational coordinates of the bubble from real type into integer.
subroutine s_deltafunc(nbubs, lbk_rad, lbk_vel, lbk_s, updatedvar)
The purpose of this procedure contains the algorithm to use the delta kernel function to map the effe...
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.