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# 104 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
233
234# 119 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
235
236# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238# 143 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
239
240# 171 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
241
242# 182 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245
246# 204 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
247
248# 214 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250# 225 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251
252# 236 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
253
254# 246 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256# 252 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258# 258 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
259
260# 264 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262# 270 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264# 272 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
265# 273 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266! New line at end of file is required for FYPP
267# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
268
269# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
270
271! Caution:
272! This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI rank.
273! That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0.
274! For an example see misc/nvidia_uvm/bind.sh.
275# 63 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
276
277# 81 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
278
279# 88 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
280
281# 111 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
282
283# 127 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
284
285# 153 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
286
287# 159 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
288
289# 167 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
290! New line at end of file is required for FYPP
291# 6 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp" 2
292
293!> @brief Kernel functions (Gaussian, delta) that smear Lagrangian bubble effects onto the Eulerian grid
295
296 use m_mpi_proxy !< message passing interface (mpi) module proxy
297
298 implicit none
299
300contains
301
302 !> The purpose of this subroutine is to smear the strength of the lagrangian
303 !! bubbles into the Eulerian framework using different approaches.
304 !! @param nBubs Number of lagrangian bubbles in the current domain
305 !! @param lbk_rad Radius of the bubbles
306 !! @param lbk_vel Interface velocity of the bubbles
307 !! @param lbk_s Computational coordinates of the bubbles
308 !! @param lbk_pos Spatial coordinates of the bubbles
309 !! @param updatedvar Eulerian variable to be updated
310 subroutine s_smoothfunction(nBubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
311
312 integer, intent(in) :: nBubs
313 real(wp), dimension(1:lag_params%nBubs_glb, 1:3, 1:2), intent(in) :: lbk_s, lbk_pos
314 real(wp), dimension(1:lag_params%nBubs_glb, 1:2), intent(in) :: lbk_rad, lbk_vel
315 type(scalar_field), dimension(:), intent(inout) :: updatedvar
316
317 smoothfunc:select case(lag_params%smooth_type)
318 case (1)
319 call s_gaussian(nbubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
320 case (2)
321 call s_deltafunc(nbubs, lbk_rad, lbk_vel, lbk_s, updatedvar)
322 end select smoothfunc
323
324 end subroutine s_smoothfunction
325
326 !> The purpose of this procedure contains the algorithm to use the delta kernel function to map the effect of the bubbles.
327 !! The effect of the bubbles only affects the cell where the bubble is located.
328 subroutine s_deltafunc(nBubs, lbk_rad, lbk_vel, lbk_s, updatedvar)
329
330 integer, intent(in) :: nBubs
331 real(wp), dimension(1:lag_params%nBubs_glb, 1:3, 1:2), intent(in) :: lbk_s
332 real(wp), dimension(1:lag_params%nBubs_glb, 1:2), intent(in) :: lbk_rad, lbk_vel
333 type(scalar_field), dimension(:), intent(inout) :: updatedvar
334
335 integer, dimension(3) :: cell
336 real(wp) :: strength_vel, strength_vol
337
338 real(wp) :: addFun1, addFun2, addFun3
339 real(wp) :: volpart, Vol
340 real(wp), dimension(3) :: s_coord
341 integer :: l
342
343
344# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
345
346# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
347#if defined(MFC_OpenACC)
348# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
349!$acc parallel loop gang vector default(present) private(l, s_coord, cell)
350# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
351#elif defined(MFC_OpenMP)
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
358# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
359!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(l, s_coord, cell)
360# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
361#endif
362# 57 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
363
364 do l = 1, nbubs
365
366 volpart = 4._wp/3._wp*pi*lbk_rad(l, 2)**3._wp
367 s_coord(1:3) = lbk_s(l, 1:3, 2)
368 call s_get_cell(s_coord, cell)
369
370 strength_vol = volpart
371 strength_vel = 4._wp*pi*lbk_rad(l, 2)**2._wp*lbk_vel(l, 2)
372
373 if (num_dims == 2) then
374 vol = dx(cell(1))*dy(cell(2))*lag_params%charwidth
375 if (cyl_coord) vol = dx(cell(1))*dy(cell(2))*y_cc(cell(2))*2._wp*pi
376 else
377 vol = dx(cell(1))*dy(cell(2))*dz(cell(3))
378 end if
379
380 !Update void fraction field
381 addfun1 = strength_vol/vol
382
383# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
384#if defined(MFC_OpenACC)
385# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
386!$acc atomic update
387# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
388#elif defined(MFC_OpenMP)
389# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
390!$omp atomic update
391# 76 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
392#endif
393 updatedvar(1)%sf(cell(1), cell(2), cell(3)) = updatedvar(1)%sf(cell(1), cell(2), cell(3)) + real(addfun1, kind=stp)
394
395 !Update time derivative of void fraction
396 addfun2 = strength_vel/vol
397
398# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
399#if defined(MFC_OpenACC)
400# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
401!$acc atomic update
402# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
403#elif defined(MFC_OpenMP)
404# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
405!$omp atomic update
406# 81 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
407#endif
408 updatedvar(2)%sf(cell(1), cell(2), cell(3)) = updatedvar(2)%sf(cell(1), cell(2), cell(3)) + real(addfun2, kind=stp)
409
410 !Product of two smeared functions
411 !Update void fraction * time derivative of void fraction
412 if (lag_params%cluster_type >= 4) then
413 addfun3 = (strength_vol*strength_vel)/vol
414
415# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
416#if defined(MFC_OpenACC)
417# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
418!$acc atomic update
419# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
420#elif defined(MFC_OpenMP)
421# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
422!$omp atomic update
423# 88 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
424#endif
425 updatedvar(5)%sf(cell(1), cell(2), cell(3)) = updatedvar(5)%sf(cell(1), cell(2), cell(3)) + real(addfun3, kind=stp)
426 end if
427 end do
428
429# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
430
431# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
432#if defined(MFC_OpenACC)
433# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
434!$acc end parallel loop
435# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
436#elif defined(MFC_OpenMP)
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
441# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
442!$omp end target teams loop
443# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
444#endif
445# 92 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
446
447
448 end subroutine s_deltafunc
449
450 !> The purpose of this procedure contains the algorithm to use the gaussian kernel function to map the effect of the bubbles.
451 !! The effect of the bubbles affects the 3X3x3 cells that surround the bubble.
452 subroutine s_gaussian(nBubs, lbk_rad, lbk_vel, lbk_s, lbk_pos, updatedvar)
453
454 integer, intent(in) :: nBubs
455 real(wp), dimension(1:lag_params%nBubs_glb, 1:3, 1:2), intent(in) :: lbk_s, lbk_pos
456 real(wp), dimension(1:lag_params%nBubs_glb, 1:2), intent(in) :: lbk_rad, lbk_vel
457 type(scalar_field), dimension(:), intent(inout) :: updatedvar
458
459 real(wp), dimension(3) :: center
460 integer, dimension(3) :: cell
461 real(wp) :: stddsv
462 real(wp) :: strength_vel, strength_vol
463
464 real(wp), dimension(3) :: nodecoord
465 real(wp) :: addFun1, addFun2, addFun3
466 real(wp) :: func, func2, volpart
467 integer, dimension(3) :: cellaux
468 real(wp), dimension(3) :: s_coord
469 integer :: l, i, j, k
470 logical :: celloutside
471 integer :: smearGrid, smearGridz
472
473 smeargrid = mapcells - (-mapcells) + 1 ! Include the cell that contains the bubble (3+1+3)
474 smeargridz = smeargrid
475 if (p == 0) smeargridz = 1
476
477
478# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
479
480# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
481#if defined(MFC_OpenACC)
482# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
483!$acc parallel loop gang vector default(present) private(nodecoord, l, s_coord, cell, center) copyin(smearGrid, smearGridz)
484# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
485#elif defined(MFC_OpenMP)
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
492# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
493!$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)
494# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
495#endif
496# 123 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
497
498 do l = 1, nbubs
499 nodecoord(1:3) = 0
500 center(1:3) = 0._wp
501 volpart = 4._wp/3._wp*pi*lbk_rad(l, 2)**3._wp
502 s_coord(1:3) = lbk_s(l, 1:3, 2)
503 center(1:2) = lbk_pos(l, 1:2, 2)
504 if (p > 0) center(3) = lbk_pos(l, 3, 2)
505 call s_get_cell(s_coord, cell)
506 call s_compute_stddsv(cell, volpart, stddsv)
507
508 strength_vol = volpart
509 strength_vel = 4._wp*pi*lbk_rad(l, 2)**2._wp*lbk_vel(l, 2)
510
511
512# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
513#if defined(MFC_OpenACC)
514# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
515!$acc loop collapse(3) private(cellaux, nodecoord)
516# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
517#elif defined(MFC_OpenMP)
518# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
519
520# 137 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
521#endif
522 do i = 1, smeargrid
523 do j = 1, smeargrid
524 do k = 1, smeargridz
525 cellaux(1) = cell(1) + i - (mapcells + 1)
526 cellaux(2) = cell(2) + j - (mapcells + 1)
527 cellaux(3) = cell(3) + k - (mapcells + 1)
528 if (p == 0) cellaux(3) = 0
529
530 !Check if the cells intended to smear the bubbles in are in the computational domain
531 !and redefine the cells for symmetric boundary
532 call s_check_celloutside(cellaux, celloutside)
533
534 if (.not. celloutside) then
535
536 nodecoord(1) = x_cc(cellaux(1))
537 nodecoord(2) = y_cc(cellaux(2))
538 if (p > 0) nodecoord(3) = z_cc(cellaux(3))
539 call s_applygaussian(center, cellaux, nodecoord, stddsv, 0._wp, func)
540 if (lag_params%cluster_type >= 4) call s_applygaussian(center, cellaux, nodecoord, stddsv, 1._wp, func2)
541
542 ! Relocate cells for bubbles intersecting symmetric boundaries
543 if (any((/bc_x%beg, bc_x%end, bc_y%beg, bc_y%end, bc_z%beg, bc_z%end/) == bc_reflective)) then
544 call s_shift_cell_symmetric_bc(cellaux, cell)
545 end if
546 else
547 func = 0._wp
548 func2 = 0._wp
549 cellaux(1) = cell(1)
550 cellaux(2) = cell(2)
551 cellaux(3) = cell(3)
552 if (p == 0) cellaux(3) = 0
553 end if
554
555 !Update void fraction field
556 addfun1 = func*strength_vol
557
558# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
559#if defined(MFC_OpenACC)
560# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
561!$acc atomic update
562# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
563#elif defined(MFC_OpenMP)
564# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
565!$omp atomic update
566# 173 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
567#endif
568 updatedvar(1)%sf(cellaux(1), cellaux(2), cellaux(3)) = &
569 updatedvar(1)%sf(cellaux(1), cellaux(2), cellaux(3)) &
570 + real(addfun1, kind=stp)
571
572 !Update time derivative of void fraction
573 addfun2 = func*strength_vel
574
575# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
576#if defined(MFC_OpenACC)
577# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
578!$acc atomic update
579# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
580#elif defined(MFC_OpenMP)
581# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
582!$omp atomic update
583# 180 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
584#endif
585 updatedvar(2)%sf(cellaux(1), cellaux(2), cellaux(3)) = &
586 updatedvar(2)%sf(cellaux(1), cellaux(2), cellaux(3)) &
587 + real(addfun2, kind=stp)
588
589 !Product of two smeared functions
590 !Update void fraction * time derivative of void fraction
591 if (lag_params%cluster_type >= 4) then
592 addfun3 = func2*strength_vol*strength_vel
593
594# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
595#if defined(MFC_OpenACC)
596# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
597!$acc atomic update
598# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
599#elif defined(MFC_OpenMP)
600# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
601!$omp atomic update
602# 189 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
603#endif
604 updatedvar(5)%sf(cellaux(1), cellaux(2), cellaux(3)) = &
605 updatedvar(5)%sf(cellaux(1), cellaux(2), cellaux(3)) &
606 + real(addfun3, kind=stp)
607 end if
608 end do
609 end do
610 end do
611 end do
612
613# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
614
615# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
616#if defined(MFC_OpenACC)
617# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
618!$acc end parallel loop
619# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
620#elif defined(MFC_OpenMP)
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
625# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
626!$omp end target teams loop
627# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
628#endif
629# 198 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
630
631
632 end subroutine s_gaussian
633
634 !> The purpose of this subroutine is to apply the gaussian kernel function for each bubble (Maeda and Colonius, 2018)).
635 subroutine s_applygaussian(center, cellaux, nodecoord, stddsv, strength_idx, func)
636
637# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
638#ifdef _CRAYFTN
639# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
640#if 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#else
653# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
654!DIR$ INLINEALWAYS s_applygaussian
655# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
656#endif
657# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
658#elif MFC_OpenACC
659# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
660!$acc routine seq
661# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
662#elif MFC_OpenMP
663# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
664
665# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
666
667# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
668!$omp declare target device_type(any)
669# 204 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
670#endif
671# 206 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
672
673 real(wp), dimension(3), intent(in) :: center
674 integer, dimension(3), intent(in) :: cellaux
675 real(wp), dimension(3), intent(in) :: nodecoord
676 real(wp), intent(in) :: stddsv
677 real(wp), intent(in) :: strength_idx
678 real(wp), intent(out) :: func
679
680 real(wp) :: distance
681 real(wp) :: theta, dtheta, L2, dzp, Lz2
682 real(wp) :: Nr, Nr_count
683
684 distance = sqrt((center(1) - nodecoord(1))**2._wp + (center(2) - nodecoord(2))**2._wp + (center(3) - nodecoord(3))**2._wp)
685
686 if (num_dims == 3) then
687 !< 3D gaussian function
688 func = exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**3._wp
689 else
690 if (cyl_coord) then
691 !< 2D cylindrical function:
692 ! We smear particles in the azimuthal direction for given r
693 theta = 0._wp
694 nr = ceiling(2._wp*pi*nodecoord(2)/(y_cb(cellaux(2)) - y_cb(cellaux(2) - 1)))
695 dtheta = 2._wp*pi/nr
696 l2 = center(2)**2._wp + nodecoord(2)**2._wp - 2._wp*center(2)*nodecoord(2)*cos(theta)
697 distance = sqrt((center(1) - nodecoord(1))**2._wp + l2)
698 ! Factor 2._wp is for symmetry (upper half of the 2D field (+r) is considered)
699 func = dtheta/2._wp/pi*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**3._wp
700 nr_count = 0._wp
701 do while (nr_count < nr - 1._wp)
702 nr_count = nr_count + 1._wp
703 theta = nr_count*dtheta
704 ! trigonometric relation
705 l2 = center(2)**2._wp + nodecoord(2)**2._wp - 2._wp*center(2)*nodecoord(2)*cos(theta)
706 distance = sqrt((center(1) - nodecoord(1))**2._wp + l2)
707 ! nodecoord(2)*dtheta is the azimuthal width of the cell
708 func = func + &
709 dtheta/2._wp/pi*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**(3._wp*(strength_idx + 1._wp))
710 end do
711 else
712
713 !< 2D cartesian function:
714 ! We smear particles considering a virtual depth (lag_params%charwidth)
715 theta = 0._wp
716 nr = ceiling(lag_params%charwidth/(y_cb(cellaux(2)) - y_cb(cellaux(2) - 1)))
717 nr_count = 1._wp - mapcells*1._wp
718 dzp = y_cb(cellaux(2) + 1) - y_cb(cellaux(2))
719 lz2 = (center(3) - (dzp*(0.5_wp + nr_count) - lag_params%charwidth/2._wp))**2._wp
720 distance = sqrt((center(1) - nodecoord(1))**2._wp + (center(2) - nodecoord(2))**2._wp + lz2)
721 func = dzp/lag_params%charwidth*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**3._wp
722 do while (nr_count < nr - 1._wp + ((mapcells - 1)*1._wp))
723 nr_count = nr_count + 1._wp
724 lz2 = (center(3) - (dzp*(0.5_wp + nr_count) - lag_params%charwidth/2._wp))**2._wp
725 distance = sqrt((center(1) - nodecoord(1))**2._wp + (center(2) - nodecoord(2))**2._wp + lz2)
726 func = func + &
727 dzp/lag_params%charwidth*exp(-0.5_wp*(distance/stddsv)**2._wp)/(sqrt(2._wp*pi)*stddsv)**(3._wp*(strength_idx + 1._wp))
728 end do
729 end if
730 end if
731
732 end subroutine s_applygaussian
733
734 !> The purpose of this subroutine is to check if the current cell is outside the computational domain or not (including ghost cells).
735 !! @param cellaux Tested cell to smear the bubble effect in.
736 !! @param celloutside If true, then cellaux is outside the computational domain.
737 subroutine s_check_celloutside(cellaux, celloutside)
738
739# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
740#ifdef _CRAYFTN
741# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
742#if MFC_OpenACC
743# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
744!$acc routine seq
745# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
746#elif MFC_OpenMP
747# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
748
749# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
750
751# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
752!$omp declare target device_type(any)
753# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
754#else
755# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
756!DIR$ INLINEALWAYS s_check_celloutside
757# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
758#endif
759# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
760#elif MFC_OpenACC
761# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
762!$acc routine seq
763# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
764#elif MFC_OpenMP
765# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
766
767# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
768
769# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
770!$omp declare target device_type(any)
771# 272 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
772#endif
773# 274 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
774
775 integer, dimension(3), intent(inout) :: cellaux
776 logical, intent(out) :: celloutside
777
778 celloutside = .false.
779
780 if (num_dims == 2) then
781 if ((cellaux(1) < -buff_size) .or. (cellaux(2) < -buff_size)) then
782 celloutside = .true.
783 end if
784 if (cyl_coord .and. y_cc(cellaux(2)) < 0._wp) then
785 celloutside = .true.
786 end if
787 if ((cellaux(2) > n + buff_size) .or. (cellaux(1) > m + buff_size)) then
788 celloutside = .true.
789 end if
790 else
791 if ((cellaux(3) < -buff_size) .or. (cellaux(1) < -buff_size) .or. (cellaux(2) < -buff_size)) then
792 celloutside = .true.
793 end if
794
795 if ((cellaux(3) > p + buff_size) .or. (cellaux(2) > n + buff_size) .or. (cellaux(1) > m + buff_size)) then
796 celloutside = .true.
797 end if
798 end if
799
800 end subroutine s_check_celloutside
801
802 !> This subroutine relocates the current cell, if it intersects a symmetric boundary.
803 !! @param cell Cell of the current bubble
804 !! @param cellaux Cell to map the bubble effect in.
805 subroutine s_shift_cell_symmetric_bc(cellaux, cell)
806
807# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
808#ifdef _CRAYFTN
809# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
810#if MFC_OpenACC
811# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
812!$acc routine seq
813# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
814#elif MFC_OpenMP
815# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
816
817# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
818
819# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
820!$omp declare target device_type(any)
821# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
822#else
823# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
824!DIR$ INLINEALWAYS s_shift_cell_symmetric_bc
825# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
826#endif
827# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
828#elif MFC_OpenACC
829# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
830!$acc routine seq
831# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
832#elif MFC_OpenMP
833# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
834
835# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
836
837# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
838!$omp declare target device_type(any)
839# 306 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
840#endif
841# 308 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
842
843 integer, dimension(3), intent(inout) :: cellaux
844 integer, dimension(3), intent(in) :: cell
845
846 ! x-dir
847 if (bc_x%beg == bc_reflective .and. (cell(1) <= mapcells - 1)) then
848 cellaux(1) = abs(cellaux(1)) - 1
849 end if
850 if (bc_x%end == bc_reflective .and. (cell(1) >= m + 1 - mapcells)) then
851 cellaux(1) = cellaux(1) - (2*(cellaux(1) - m) - 1)
852 end if
853
854 !y-dir
855 if (bc_y%beg == bc_reflective .and. (cell(2) <= mapcells - 1)) then
856 cellaux(2) = abs(cellaux(2)) - 1
857 end if
858 if (bc_y%end == bc_reflective .and. (cell(2) >= n + 1 - mapcells)) then
859 cellaux(2) = cellaux(2) - (2*(cellaux(2) - n) - 1)
860 end if
861
862 if (p > 0) then
863 !z-dir
864 if (bc_z%beg == bc_reflective .and. (cell(3) <= mapcells - 1)) then
865 cellaux(3) = abs(cellaux(3)) - 1
866 end if
867 if (bc_z%end == bc_reflective .and. (cell(3) >= p + 1 - mapcells)) then
868 cellaux(3) = cellaux(3) - (2*(cellaux(3) - p) - 1)
869 end if
870 end if
871
872 end subroutine s_shift_cell_symmetric_bc
873
874 !> Calculates the standard deviation of the bubble being smeared in the Eulerian framework.
875 !! @param cell Cell where the bubble is located
876 !! @param volpart Volume of the bubble
877 !! @param stddsv Standard deviaton
878 subroutine s_compute_stddsv(cell, volpart, stddsv)
879
880# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
881#ifdef _CRAYFTN
882# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
883#if MFC_OpenACC
884# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
885!$acc routine seq
886# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
887#elif MFC_OpenMP
888# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
889
890# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
891
892# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
893!$omp declare target device_type(any)
894# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
895#else
896# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
897!DIR$ INLINEALWAYS s_compute_stddsv
898# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
899#endif
900# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
901#elif MFC_OpenACC
902# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
903!$acc routine seq
904# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
905#elif MFC_OpenMP
906# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
907
908# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
909
910# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
911!$omp declare target device_type(any)
912# 345 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
913#endif
914# 347 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
915
916 integer, dimension(3), intent(in) :: cell
917 real(wp), intent(in) :: volpart
918 real(wp), intent(out) :: stddsv
919
920 real(wp) :: chardist, charvol
921 real(wp) :: rad
922
923 !< Compute characteristic distance
924 chardist = sqrt(dx(cell(1))*dy(cell(2)))
925 if (p > 0) chardist = (dx(cell(1))*dy(cell(2))*dz(cell(3)))**(1._wp/3._wp)
926
927 !< Compute characteristic volume
928 if (p > 0) then
929 charvol = dx(cell(1))*dy(cell(2))*dz(cell(3))
930 else
931 if (cyl_coord) then
932 charvol = dx(cell(1))*dy(cell(2))*y_cc(cell(2))*2._wp*pi
933 else
934 charvol = dx(cell(1))*dy(cell(2))*lag_params%charwidth
935 end if
936 end if
937
938 !< Compute Standard deviaton
939 if (((volpart/charvol) > 0.5_wp*lag_params%valmaxvoid) .or. (lag_params%smooth_type == 1)) then
940 rad = (3._wp*volpart/(4._wp*pi))**(1._wp/3._wp)
941 stddsv = 1._wp*lag_params%epsilonb*max(chardist, rad)
942 else
943 stddsv = 0._wp
944 end if
945
946 end subroutine s_compute_stddsv
947
948 !> The purpose of this procedure is to calculate the characteristic cell volume
949 !! @param cellx x-direction cell index
950 !! @param celly y-direction cell index
951 !! @param cellz z-direction cell index
952 !! @param Charvol Characteristic volume
953 subroutine s_get_char_vol(cellx, celly, cellz, Charvol)
954
955# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
956#ifdef _CRAYFTN
957# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
958#if MFC_OpenACC
959# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
960!$acc routine seq
961# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
962#elif MFC_OpenMP
963# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
964
965# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
966
967# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
968!$omp declare target device_type(any)
969# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
970#else
971# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
972!DIR$ INLINEALWAYS s_get_char_vol
973# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
974#endif
975# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
976#elif MFC_OpenACC
977# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
978!$acc routine seq
979# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
980#elif MFC_OpenMP
981# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
982
983# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
984
985# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
986!$omp declare target device_type(any)
987# 386 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
988#endif
989# 388 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
990
991 integer, intent(in) :: cellx, celly, cellz
992 real(wp), intent(out) :: Charvol
993
994 if (p > 0) then
995 charvol = dx(cellx)*dy(celly)*dz(cellz)
996 else
997 if (cyl_coord) then
998 charvol = dx(cellx)*dy(celly)*y_cc(celly)*2._wp*pi
999 else
1000 charvol = dx(cellx)*dy(celly)*lag_params%charwidth
1001 end if
1002 end if
1003
1004 end subroutine s_get_char_vol
1005
1006 !> This subroutine transforms the computational coordinates of the bubble from
1007 !! real type into integer.
1008 !! @param s_cell Computational coordinates of the bubble, real type
1009 !! @param get_cell Computational coordinates of the bubble, integer type
1010 subroutine s_get_cell(s_cell, get_cell)
1011
1012# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1013#ifdef _CRAYFTN
1014# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1015#if MFC_OpenACC
1016# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1017!$acc routine seq
1018# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1019#elif MFC_OpenMP
1020# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1021
1022# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1023
1024# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1025!$omp declare target device_type(any)
1026# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1027#else
1028# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1029!DIR$ INLINEALWAYS s_get_cell
1030# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1031#endif
1032# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1033#elif MFC_OpenACC
1034# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1035!$acc routine seq
1036# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1037#elif MFC_OpenMP
1038# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1039
1040# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1041
1042# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1043!$omp declare target device_type(any)
1044# 409 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1045#endif
1046# 411 "/home/runner/work/MFC/MFC/src/simulation/m_bubbles_EL_kernels.fpp"
1047
1048 real(wp), dimension(3), intent(in) :: s_cell
1049 integer, dimension(3), intent(out) :: get_cell
1050 integer :: i
1051
1052 get_cell(:) = int(s_cell(:))
1053 do i = 1, num_dims
1054 if (s_cell(i) < 0._wp) get_cell(i) = get_cell(i) - 1
1055 end do
1056
1057 end subroutine s_get_cell
1058
1059end 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.