MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_assign_variables.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
2!>
3!! @file
4!! @brief Contains module m_assign_variables
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
7! This file exists so that Fypp can be run without generating case.fpp files for
8! each target. This is useful when generating documentation, for example. This
9! should also let MFC be built with CMake directly, without invoking mfc.sh.
10
11! For pre-process.
12# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
13
14! For moving immersed boundaries in simulation
15# 12 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
16# 6 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp" 2
17# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
18# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
19# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
20# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
23# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
25
26# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
27# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29
30# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31
32# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33
34# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35
36# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39
40# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 145 "/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# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60
61# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
62
63# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
64
65# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
66
67# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68
69# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
70
71# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
72
73# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
74! New line at end of file is required for FYPP
75# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
76
77# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
80# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
82
83# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
84
85# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86
87# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88
89# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90
91# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92
93# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
94
95# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
96
97# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
98
99# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
100
101# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
102
103# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
104
105# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
106
107# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
108
109# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110
111# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112
113# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139
140# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
141
142# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
143
144# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
145
146# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
147
148# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
149
150# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
151
152# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
153! New line at end of file is required for FYPP
154# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
155# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
156# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
157# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
160# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162
163# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
164# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166
167# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
168
169# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170
171# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172
173# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
174
175# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176
177# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
178
179# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
180
181# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
182! New line at end of file is required for FYPP
183# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
184
185# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
186
187# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
188
189# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
190
191# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
192
193# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
194
195# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
196
197# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
198
199# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
200
201# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
202
203# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204
205# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206
207# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234
235# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236
237# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238
239# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240! New line at end of file is required for FYPP
241# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
242
243! GPU parallel region (scalar reductions, maxval/minval)
244# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245
246! GPU parallel loop over threads (most common GPU macro)
247# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
248
249! Required closing for GPU_PARALLEL_LOOP
250# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251
252! Mark routine for device compilation
253# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
254
255! Declare device-resident data
256# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258! Inner loop within a GPU parallel region
259# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261! Scoped GPU data region
262# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264! Host code with device pointers (for MPI with GPU buffers)
265# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267! Allocate device memory (unscoped)
268# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
269
270! Free device memory
271# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273! Atomic operation on device
274# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
275
276! End atomic capture block
277# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
278
279! Copy data between host and device
280# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
281
282! Synchronization barrier
283# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
284
285! Import GPU library module (openacc or omp_lib)
286# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
287
288! Emit code only for AMD compiler
289# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290
291! Emit code for non-Cray compilers
292# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
293
294! Emit code only for Cray compiler
295# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
296
297! Emit code for non-NVIDIA compilers
298# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
299
300# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
301# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302! New line at end of file is required for FYPP
303# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
304
305# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
308! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
309! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
310# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
311
312! Allocate and create GPU device memory
313# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
314
315! Free GPU device memory and deallocate
316# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318! Cray-specific GPU pointer setup for vector fields
319# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
320
321! Cray-specific GPU pointer setup for scalar fields
322# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
323
324! Cray-specific GPU pointer setup for acoustic source spatials
325# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
326
327# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
328
329# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
330! New line at end of file is required for FYPP
331# 7 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp" 2
332
333!> @brief Assigns initial primitive variables to computational cells based on patch geometry
335
340 use m_thermochem, only: num_species, gas_constant, get_mixture_molecular_weight
342
343 implicit none
344
345 public :: s_perturb_primitive
346
348
349 !> Pointer to mixture or species patch assignment routine
351 !> Abstract interface to the two subroutines that assign the patch primitive variables, either mixture or species, depending on
352 !! the subroutine, to a particular cell in the computational domain
353 abstract interface
354
355 !> Skeleton of s_assign_patch_mixture_primitive_variables and s_assign_patch_species_primitive_variables
356 subroutine s_assign_patch_xxxxx_primitive_variables(patch_id, j, k, l, eta, q_prim_vf, patch_id_fp)
357
358 import :: scalar_field, sys_size, n, m, p, wp
359
360 integer, intent(in) :: patch_id
361 integer, intent(in) :: j, k, l
362 real(wp), intent(in) :: eta
363 type(scalar_field), dimension(1:sys_size), intent(inout) :: q_prim_vf
364
365#ifdef MFC_MIXED_PRECISION
366 integer(kind=1), dimension(0:m,0:n,0:p), intent(inout) :: patch_id_fp
367#else
368 integer, dimension(0:m,0:n,0:p), intent(inout) :: patch_id_fp
369#endif
370
372 end interface
373
374 private
377
378contains
379
380 !> Allocate volume fraction sum and set the patch primitive variable assignment procedure pointer.
382
383 if (.not. igr) then
384 allocate (alf_sum%sf(0:m,0:n,0:p))
385 end if
386
387 ! Select procedure pointer based on multicomponent flow model
388
389 if (model_eqns == model_eqns_gamma_law) then ! Gamma/pi_inf model
391 else ! Volume fraction model
393 end if
394
396
397 !> Assign the mixture primitive variables of the patch designated by the patch_id to the cell that is designated by the indexes
398 !! (j,k,l). In addition, the variable bookkeeping the patch identities in the entire domain is updated with the new assignment.
399 !! Note that if the smoothing of the patch's boundaries is employed, the ensuing primitive variables in the cell will be a type
400 !! of combination of the current patch's primitive variables with those of the smoothing patch. The specific details of the
401 !! combination may be found in Shyue's work (1998).
402 subroutine s_assign_patch_mixture_primitive_variables(patch_id, j, k, l, eta, q_prim_vf, patch_id_fp)
403
404
405# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
406#if MFC_OpenACC
407# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
408!$acc routine seq
409# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
410#elif MFC_OpenMP
411# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
412
413# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
414
415# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
416!$omp declare target device_type(any)
417# 79 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
418#endif
419
420 integer, intent(in) :: patch_id
421 integer, intent(in) :: j, k, l
422 real(wp), intent(in) :: eta
423 type(scalar_field), dimension(1:sys_size), intent(inout) :: q_prim_vf
424#ifdef MFC_MIXED_PRECISION
425 integer(kind=1), dimension(0:m,0:n,0:p), intent(inout) :: patch_id_fp
426#else
427 integer, dimension(0:m,0:n,0:p), intent(inout) :: patch_id_fp
428#endif
429
430 real(wp) :: ys(1:num_species)
431 integer :: smooth_patch_id
432 integer :: i
433
434 smooth_patch_id = patch_icpp(patch_id)%smooth_patch_id
435
436 q_prim_vf(1)%sf(j, k, l) = eta*patch_icpp(patch_id)%rho + (1._wp - eta)*patch_icpp(smooth_patch_id)%rho
437
438 do i = 1, eqn_idx%E - eqn_idx%mom%beg
439 q_prim_vf(i + 1)%sf(j, k, l) = 1._wp/q_prim_vf(1)%sf(j, k, &
440 & l)*(eta*patch_icpp(patch_id)%rho*patch_icpp(patch_id)%vel(i) + (1._wp - eta) &
441 & *patch_icpp(smooth_patch_id)%rho*patch_icpp(smooth_patch_id)%vel(i))
442 end do
443
444 q_prim_vf(eqn_idx%gamma)%sf(j, k, l) = eta*patch_icpp(patch_id)%gamma + (1._wp - eta)*patch_icpp(smooth_patch_id)%gamma
445
446 q_prim_vf(eqn_idx%E)%sf(j, k, l) = 1._wp/q_prim_vf(eqn_idx%gamma)%sf(j, k, &
447 & l)*(eta*patch_icpp(patch_id)%gamma*patch_icpp(patch_id)%pres + (1._wp - eta) &
448 & *patch_icpp(smooth_patch_id)%gamma*patch_icpp(smooth_patch_id)%pres)
449
450 q_prim_vf(eqn_idx%pi_inf)%sf(j, k, l) = eta*patch_icpp(patch_id)%pi_inf + (1._wp - eta)*patch_icpp(smooth_patch_id)%pi_inf
451
452 if (chemistry) then
453 block
454 real(wp) :: sum, term
455
456 sum = 0._wp
457 do i = 1, num_species
458 term = eta*patch_icpp(patch_id)%Y(i) + (1._wp - eta)*patch_icpp(smooth_patch_id)%Y(i)
459 q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l) = term
460 sum = sum + term
461 end do
462
463 sum = max(sum, verysmall)
464
465 do i = 1, num_species
466 q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l) = q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l)/sum
467 ys(i) = q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l)
468 end do
469 end block
470 end if
471
472 if (1._wp - eta < 1.e-16_wp) patch_id_fp(j, k, l) = patch_id
473
475
476 !> Apply a stable pressure perturbation following Ando's method for bubble-laden flows.
477 subroutine s_perturb_primitive(j, k, l, q_prim_vf)
478
479 integer, intent(in) :: j, k, l
480 type(scalar_field), dimension(1:sys_size), intent(inout) :: q_prim_vf
481 integer :: i
482 real(wp) :: n_tait, b_tait, p0
483 real(wp) :: r3bar, n0, ratio, nh, vfh, velh, rhoh, deno
484
485 p0 = 101325._wp
486 n_tait = gs_min(1)
487 b_tait = ps_inf(1)
488
489 if (j < 177) then
490 q_prim_vf(eqn_idx%E)%sf(j, k, l) = 0.5_wp*q_prim_vf(eqn_idx%E)%sf(j, k, l)
491 end if
492
493 if (qbmm) then
494 do i = 1, nb
495 q_prim_vf(eqn_idx%bub%beg + 1 + (i - 1)*nmom)%sf(j, k, l) = q_prim_vf(eqn_idx%bub%beg + 1 + (i - 1)*nmom)%sf(j, &
496 & k, l)*((p0 - bub_pp%pv)/(q_prim_vf(eqn_idx%E)%sf(j, k, l)*p0 - bub_pp%pv))**(1._wp/3._wp)
497 end do
498 end if
499
500 r3bar = 0._wp
501
502 if (qbmm) then
503 do i = 1, nb
504 r3bar = r3bar + weight(i)*0.5_wp*(q_prim_vf(eqn_idx%bub%beg + 1 + (i - 1)*nmom)%sf(j, k, l))**3._wp
505 end do
506 else
507 do i = 1, nb
508 if (polytropic) then
509 r3bar = r3bar + weight(i)*(q_prim_vf(eqn_idx%bub%beg + (i - 1)*2)%sf(j, k, l))**3._wp
510 else
511 r3bar = r3bar + weight(i)*(q_prim_vf(eqn_idx%bub%beg + (i - 1)*4)%sf(j, k, l))**3._wp
512 end if
513 end do
514 end if
515
516 n0 = 3._wp*q_prim_vf(eqn_idx%alf)%sf(j, k, l)/(4._wp*pi*r3bar)
517
518 ratio = ((1._wp + b_tait)/(q_prim_vf(eqn_idx%E)%sf(j, k, l) + b_tait))**(1._wp/n_tait)
519
520 nh = n0/((1._wp - q_prim_vf(eqn_idx%alf)%sf(j, k, l))*ratio + (4._wp*pi/3._wp)*n0*r3bar)
521 vfh = (4._wp*pi/3._wp)*nh*r3bar
522 rhoh = (1._wp - vfh)/ratio
523 deno = 1._wp - (1._wp - q_prim_vf(eqn_idx%alf)%sf(j, k, l))/rhoh
524
525 if (f_approx_equal(deno, 0._wp)) then
526 velh = 0._wp
527 else
528 velh = (q_prim_vf(eqn_idx%E)%sf(j, k, l) - 1._wp)/(1._wp - q_prim_vf(eqn_idx%alf)%sf(j, k, l))/deno
529 velh = sqrt(velh)
530 velh = velh*deno
531 end if
532
533 do i = eqn_idx%cont%beg, eqn_idx%cont%end
534 q_prim_vf(i)%sf(j, k, l) = rhoh
535 end do
536
537 do i = eqn_idx%mom%beg, eqn_idx%mom%end
538 q_prim_vf(i)%sf(j, k, l) = velh
539 end do
540
541 q_prim_vf(eqn_idx%alf)%sf(j, k, l) = vfh
542
543 end subroutine s_perturb_primitive
544
545 !> Assign the species primitive variables, following s_assign_patch_species_primitive_variables with adaptation for
546 !! ensemble-averaged bubble modeling
547 impure subroutine s_assign_patch_species_primitive_variables(patch_id, j, k, l, eta, q_prim_vf, patch_id_fp)
548
549
550# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
551#if MFC_OpenACC
552# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
553!$acc routine seq
554# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
555#elif MFC_OpenMP
556# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
557
558# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
559
560# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
561!$omp declare target device_type(any)
562# 210 "/home/runner/work/MFC/MFC/src/pre_process/m_assign_variables.fpp"
563#endif
564
565 integer, intent(in) :: patch_id
566 integer, intent(in) :: j, k, l
567 real(wp), intent(in) :: eta
568#ifdef MFC_MIXED_PRECISION
569 integer(kind=1), dimension(0:m,0:n,0:p), intent(inout) :: patch_id_fp
570#else
571 integer, dimension(0:m,0:n,0:p), intent(inout) :: patch_id_fp
572#endif
573 type(scalar_field), dimension(1:sys_size), intent(inout) :: q_prim_vf
574
575 ! Density, gamma, and liquid stiffness from current and smoothing patches
576 real(wp) :: rho !< density
577 real(wp) :: gamma
578 real(wp) :: lit_gamma !< specific heat ratio
579 real(wp) :: pi_inf !< stiffness from SEOS
580 real(wp) :: qv !< reference energy from SEOS
581 real(wp) :: orig_rho
582 real(wp) :: orig_gamma
583 real(wp) :: orig_pi_inf
584 real(wp) :: orig_qv
585 real(wp) :: mur, muv
586 real(wp) :: r3bar
587 real(wp) :: rcoord, theta, phi, xi_sph
588 real(wp), dimension(3) :: xi_cart
589 real(wp) :: ys(1:num_species)
590 real(stp), dimension(sys_size) :: orig_prim_vf !< Vector to hold original values of cell for smoothing purposes
591 integer :: i
592 integer :: smooth_patch_id
593
594 smooth_patch_id = patch_icpp(patch_id)%smooth_patch_id
595
596 do i = 1, sys_size
597 orig_prim_vf(i) = q_prim_vf(i)%sf(j, k, l)
598 end do
599
600 if (mpp_lim .and. bubbles_euler) then
601 ! adjust volume fractions, according to modeled gas void fraction
602 alf_sum%sf = 0._wp
603 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
604 alf_sum%sf = alf_sum%sf + q_prim_vf(i)%sf
605 end do
606
607 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
608 q_prim_vf(i)%sf = q_prim_vf(i)%sf*(1._wp - q_prim_vf(eqn_idx%alf)%sf)/alf_sum%sf
609 end do
610 end if
611
612 call s_convert_to_mixture_variables(q_prim_vf, j, k, l, orig_rho, orig_gamma, orig_pi_inf, orig_qv)
613
614 if (.not. igr .or. num_fluids > 1) then
615 do i = eqn_idx%adv%beg, eqn_idx%adv%end
616 q_prim_vf(i)%sf(j, k, l) = patch_icpp(patch_id)%alpha(i - eqn_idx%E)
617 end do
618 end if
619
620 if (mpp_lim .and. bubbles_euler) then
621 ! adjust volume fractions, according to modeled gas void fraction
622 alf_sum%sf = 0._wp
623 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
624 alf_sum%sf = alf_sum%sf + q_prim_vf(i)%sf
625 end do
626
627 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
628 q_prim_vf(i)%sf = q_prim_vf(i)%sf*(1._wp - q_prim_vf(eqn_idx%alf)%sf)/alf_sum%sf
629 end do
630 end if
631
632 if (model_eqns /= model_eqns_4eq) then
633 do i = 1, eqn_idx%cont%end
634 q_prim_vf(i)%sf(j, k, l) = patch_icpp(patch_id)%alpha_rho(i)
635 end do
636 end if
637
638 call s_convert_to_mixture_variables(q_prim_vf, j, k, l, patch_icpp(patch_id)%rho, patch_icpp(patch_id)%gamma, &
639 & patch_icpp(patch_id)%pi_inf, patch_icpp(patch_id)%qv)
640
641 if (model_eqns /= model_eqns_4eq) then
642 do i = 1, eqn_idx%cont%end
643 q_prim_vf(i)%sf(j, k, l) = patch_icpp(smooth_patch_id)%alpha_rho(i)
644 end do
645 end if
646
647 if (.not. igr .or. num_fluids > 1) then
648 do i = eqn_idx%adv%beg, eqn_idx%adv%end
649 q_prim_vf(i)%sf(j, k, l) = patch_icpp(smooth_patch_id)%alpha(i - eqn_idx%E)
650 end do
651 end if
652
653 if (mpp_lim .and. bubbles_euler) then
654 ! adjust volume fractions, according to modeled gas void fraction
655 alf_sum%sf = 0._wp
656 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
657 alf_sum%sf = alf_sum%sf + q_prim_vf(i)%sf
658 end do
659
660 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
661 q_prim_vf(i)%sf = q_prim_vf(i)%sf*(1._wp - q_prim_vf(eqn_idx%alf)%sf)/alf_sum%sf
662 end do
663 end if
664
665 if (bubbles_euler) then
666 do i = 1, nb
667 mur = r0(i)*patch_icpp(smooth_patch_id)%r0/r0ref
668 muv = patch_icpp(smooth_patch_id)%v0
669 if (qbmm) then
670 ! Initialize the moment set
671 if (dist_type == 1) then
672 q_prim_vf(qbmm_idx%fullmom(i, 0, 0))%sf(j, k, l) = 1._wp
673 q_prim_vf(qbmm_idx%fullmom(i, 1, 0))%sf(j, k, l) = mur
674 q_prim_vf(qbmm_idx%fullmom(i, 0, 1))%sf(j, k, l) = muv
675 q_prim_vf(qbmm_idx%fullmom(i, 2, 0))%sf(j, k, l) = mur**2 + (sigr*r0ref)**2
676 q_prim_vf(qbmm_idx%fullmom(i, 1, 1))%sf(j, k, l) = mur*muv + rhorv*(sigr*r0ref)*(sigv*sqrt(p0ref/rho0ref))
677 q_prim_vf(qbmm_idx%fullmom(i, 0, 2))%sf(j, k, l) = muv**2 + (sigv*sqrt(p0ref/rho0ref))**2
678 else if (dist_type == 2) then
679 q_prim_vf(qbmm_idx%fullmom(i, 0, 0))%sf(j, k, l) = 1._wp
680 q_prim_vf(qbmm_idx%fullmom(i, 1, 0))%sf(j, k, l) = exp((sigr**2)/2._wp)*mur
681 q_prim_vf(qbmm_idx%fullmom(i, 0, 1))%sf(j, k, l) = muv
682 q_prim_vf(qbmm_idx%fullmom(i, 2, 0))%sf(j, k, l) = exp((sigr**2)*2._wp)*(mur**2)
683 q_prim_vf(qbmm_idx%fullmom(i, 1, 1))%sf(j, k, l) = exp((sigr**2)/2._wp)*mur*muv
684 q_prim_vf(qbmm_idx%fullmom(i, 0, 2))%sf(j, k, l) = muv**2 + (sigv*sqrt(p0ref/rho0ref))**2
685 end if
686 else
687 q_prim_vf(qbmm_idx%rs(i))%sf(j, k, l) = mur
688 q_prim_vf(qbmm_idx%vs(i))%sf(j, k, l) = muv
689 if (.not. polytropic) then
690 q_prim_vf(qbmm_idx%ps(i))%sf(j, k, l) = patch_icpp(patch_id)%p0
691 q_prim_vf(qbmm_idx%ms(i))%sf(j, k, l) = patch_icpp(patch_id)%m0
692 end if
693 end if
694 end do
695
696 if (adv_n) then
697 ! Initialize number density
698 r3bar = 0._wp
699 do i = 1, nb
700 r3bar = r3bar + weight(i)*(q_prim_vf(qbmm_idx%rs(i))%sf(j, k, l))**3._wp
701 end do
702 q_prim_vf(eqn_idx%n)%sf(j, k, l) = 3*q_prim_vf(eqn_idx%alf)%sf(j, k, l)/(4*pi*r3bar)
703 end if
704 end if
705
706 call s_convert_to_mixture_variables(q_prim_vf, j, k, l, patch_icpp(smooth_patch_id)%rho, &
707 & patch_icpp(smooth_patch_id)%gamma, patch_icpp(smooth_patch_id)%pi_inf, &
708 & patch_icpp(smooth_patch_id)%qv)
709
710 q_prim_vf(eqn_idx%E)%sf(j, k, l) = (eta*patch_icpp(patch_id)%pres + (1._wp - eta)*orig_prim_vf(eqn_idx%E))
711
712 if (.not. igr .or. num_fluids > 1) then
713 do i = eqn_idx%adv%beg, eqn_idx%adv%end
714 q_prim_vf(i)%sf(j, k, l) = eta*patch_icpp(patch_id)%alpha(i - eqn_idx%E) + (1._wp - eta)*orig_prim_vf(i)
715 end do
716 end if
717
718 if (mhd) then
719 if (n == 0) then ! 1D: By, Bz
720 q_prim_vf(eqn_idx%B%beg)%sf(j, k, l) = eta*patch_icpp(patch_id)%By + (1._wp - eta)*orig_prim_vf(eqn_idx%B%beg)
721 q_prim_vf(eqn_idx%B%beg + 1)%sf(j, k, &
722 & l) = eta*patch_icpp(patch_id)%Bz + (1._wp - eta)*orig_prim_vf(eqn_idx%B%beg + 1)
723 else ! 2D/3D: Bx, By, Bz
724 q_prim_vf(eqn_idx%B%beg)%sf(j, k, l) = eta*patch_icpp(patch_id)%Bx + (1._wp - eta)*orig_prim_vf(eqn_idx%B%beg)
725 q_prim_vf(eqn_idx%B%beg + 1)%sf(j, k, &
726 & l) = eta*patch_icpp(patch_id)%By + (1._wp - eta)*orig_prim_vf(eqn_idx%B%beg + 1)
727 q_prim_vf(eqn_idx%B%beg + 2)%sf(j, k, &
728 & l) = eta*patch_icpp(patch_id)%Bz + (1._wp - eta)*orig_prim_vf(eqn_idx%B%beg + 2)
729 end if
730 end if
731
732 if (elasticity) then
733 do i = 1, (eqn_idx%stress%end - eqn_idx%stress%beg) + 1
734 q_prim_vf(i + eqn_idx%stress%beg - 1)%sf(j, k, &
735 & l) = (eta*patch_icpp(patch_id)%tau_e(i) + (1._wp - eta)*orig_prim_vf(i + eqn_idx%stress%beg - 1))
736 end do
737 end if
738
739 if (hyperelasticity) then
740 if (pre_stress) then ! pre stressed initial condition in spatial domain
741 rcoord = sqrt((x_cc(j)**2 + y_cc(k)**2 + z_cc(l)**2))
742 theta = atan2(y_cc(k), x_cc(j))
743 phi = atan2(sqrt(x_cc(j)**2 + y_cc(k)**2), z_cc(l))
744 ! spherical coord, assuming Rmax=1
745 xi_sph = (rcoord**3 - r0ref**3 + 1._wp)**(1._wp/3._wp)
746 xi_cart(1) = xi_sph*sin(phi)*cos(theta)
747 xi_cart(2) = xi_sph*sin(phi)*sin(theta)
748 xi_cart(3) = xi_sph*cos(phi)
749 else
750 xi_cart(1) = x_cc(j)
751 xi_cart(2) = y_cc(k)
752 xi_cart(3) = z_cc(l)
753 end if
754
755 ! assigning the reference map to the q_prim vector field
756 do i = 1, num_dims
757 q_prim_vf(i + eqn_idx%xi%beg - 1)%sf(j, k, l) = eta*xi_cart(i) + (1._wp - eta)*orig_prim_vf(i + eqn_idx%xi%beg - 1)
758 end do
759 end if
760
761 if (mpp_lim .and. bubbles_euler) then
762 ! adjust volume fractions, according to modeled gas void fraction
763 alf_sum%sf = 0._wp
764 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
765 alf_sum%sf = alf_sum%sf + q_prim_vf(i)%sf
766 end do
767
768 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
769 q_prim_vf(i)%sf = q_prim_vf(i)%sf*(1._wp - q_prim_vf(eqn_idx%alf)%sf)/alf_sum%sf
770 end do
771 end if
772
773 if (model_eqns /= model_eqns_4eq) then
774 ! mixture density is an input
775 do i = 1, eqn_idx%cont%end
776 q_prim_vf(i)%sf(j, k, l) = eta*patch_icpp(patch_id)%alpha_rho(i) + (1._wp - eta)*orig_prim_vf(i)
777 end do
778 else
779 ! get mixture density from pressure via Tait EOS
780 pi_inf = pi_infs(1)
781 gamma = gammas(1)
782 lit_gamma = gs_min(1)
783
784 ! \rho = (( p_l + pi_inf)/( p_ref + pi_inf))**(1/little_gam) * rhoref(1-alf)
785 q_prim_vf(1)%sf(j, k, l) = (((q_prim_vf(eqn_idx%E)%sf(j, k, &
786 & l) + pi_inf)/(pref + pi_inf))**(1/lit_gamma))*rhoref*(1 - q_prim_vf(eqn_idx%alf)%sf(j, k, l))
787 end if
788
789 call s_convert_to_mixture_variables(q_prim_vf, j, k, l, rho, gamma, pi_inf, qv)
790
791 do i = 1, eqn_idx%E - eqn_idx%mom%beg
792 q_prim_vf(i + eqn_idx%cont%end)%sf(j, k, &
793 & l) = (eta*patch_icpp(patch_id)%vel(i) + (1._wp - eta)*orig_prim_vf(i + eqn_idx%cont%end))
794 end do
795
796 if (chemistry) then
797 block
798 real(wp) :: sum, term
799
800 sum = 0._wp
801 do i = 1, num_species
802 term = eta*patch_icpp(patch_id)%Y(i) + (1._wp - eta)*patch_icpp(smooth_patch_id)%Y(i)
803 q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l) = term
804 sum = sum + term
805 end do
806
807 if (sum < verysmall) then
808 sum = 1._wp
809 end if
810
811 do i = 1, num_species
812 q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l) = q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l)/sum
813 ys(i) = q_prim_vf(eqn_idx%species%beg + i - 1)%sf(j, k, l)
814 end do
815 end block
816 end if
817
818 ! Set streamwise velocity to hyperbolic tangent function of y
819 if (mixlayer_vel_profile) then
820 q_prim_vf(1 + eqn_idx%cont%end)%sf(j, k, &
821 & l) = (eta*patch_icpp(patch_id)%vel(1)*tanh(y_cc(k)*mixlayer_vel_coef) + (1._wp - eta)*orig_prim_vf(1 &
822 & + eqn_idx%cont%end))
823 end if
824
825 ! Set partial pressures to mixture pressure for the 6-eqn model
826 if (model_eqns == model_eqns_6eq) then
827 do i = eqn_idx%int_en%beg, eqn_idx%int_en%end
828 q_prim_vf(i)%sf(j, k, l) = q_prim_vf(eqn_idx%E)%sf(j, k, l)
829 end do
830 end if
831
832 if (bubbles_euler) then
833 do i = 1, nb
834 mur = r0(i)*patch_icpp(patch_id)%r0/r0ref
835 muv = patch_icpp(patch_id)%v0
836 if (qbmm) then
837 ! Initialize the moment set
838 if (dist_type == 1) then
839 q_prim_vf(qbmm_idx%fullmom(i, 0, 0))%sf(j, k, l) = 1._wp
840 q_prim_vf(qbmm_idx%fullmom(i, 1, 0))%sf(j, k, l) = mur
841 q_prim_vf(qbmm_idx%fullmom(i, 0, 1))%sf(j, k, l) = muv
842 q_prim_vf(qbmm_idx%fullmom(i, 2, 0))%sf(j, k, l) = mur**2 + (sigr*r0ref)**2
843 q_prim_vf(qbmm_idx%fullmom(i, 1, 1))%sf(j, k, l) = mur*muv + rhorv*(sigr*r0ref)*(sigv*sqrt(p0ref/rho0ref))
844 q_prim_vf(qbmm_idx%fullmom(i, 0, 2))%sf(j, k, l) = muv**2 + (sigv*sqrt(p0ref/rho0ref))**2
845 else if (dist_type == 2) then
846 q_prim_vf(qbmm_idx%fullmom(i, 0, 0))%sf(j, k, l) = 1._wp
847 q_prim_vf(qbmm_idx%fullmom(i, 1, 0))%sf(j, k, l) = exp((sigr**2)/2._wp)*mur
848 q_prim_vf(qbmm_idx%fullmom(i, 0, 1))%sf(j, k, l) = muv
849 q_prim_vf(qbmm_idx%fullmom(i, 2, 0))%sf(j, k, l) = exp((sigr**2)*2._wp)*(mur**2)
850 q_prim_vf(qbmm_idx%fullmom(i, 1, 1))%sf(j, k, l) = exp((sigr**2)/2._wp)*mur*muv
851 q_prim_vf(qbmm_idx%fullmom(i, 0, 2))%sf(j, k, l) = muv**2 + (sigv*sqrt(p0ref/rho0ref))**2
852 end if
853 else
854 q_prim_vf(qbmm_idx%rs(i))%sf(j, k, l) = mur
855 q_prim_vf(qbmm_idx%vs(i))%sf(j, k, l) = muv
856
857 if (.not. polytropic) then
858 q_prim_vf(qbmm_idx%ps(i))%sf(j, k, l) = patch_icpp(patch_id)%p0
859 q_prim_vf(qbmm_idx%ms(i))%sf(j, k, l) = patch_icpp(patch_id)%m0
860 end if
861 end if
862 end do
863
864 if (adv_n) then
865 ! Initialize number density
866 r3bar = 0._wp
867 do i = 1, nb
868 r3bar = r3bar + weight(i)*(q_prim_vf(qbmm_idx%rs(i))%sf(j, k, l))**3._wp
869 end do
870 q_prim_vf(eqn_idx%n)%sf(j, k, l) = 3*q_prim_vf(eqn_idx%alf)%sf(j, k, l)/(4*pi*r3bar)
871 end if
872 end if
873
874 if (mpp_lim .and. bubbles_euler) then
875 ! adjust volume fractions, according to modeled gas void fraction
876 alf_sum%sf = 0._wp
877 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
878 alf_sum%sf = alf_sum%sf + q_prim_vf(i)%sf
879 end do
880
881 do i = eqn_idx%adv%beg, eqn_idx%adv%end - 1
882 q_prim_vf(i)%sf = q_prim_vf(i)%sf*(1._wp - q_prim_vf(eqn_idx%alf)%sf)/alf_sum%sf
883 end do
884 end if
885
886 if (bubbles_euler .and. (.not. polytropic) .and. (.not. qbmm)) then
887 do i = 1, nb
888 if (f_is_default(real(q_prim_vf(qbmm_idx%ps(i))%sf(j, k, l), kind=wp))) then
889 q_prim_vf(qbmm_idx%ps(i))%sf(j, k, l) = pb0(i)
890 end if
891 if (f_is_default(real(q_prim_vf(qbmm_idx%ms(i))%sf(j, k, l), kind=wp))) then
892 q_prim_vf(qbmm_idx%ms(i))%sf(j, k, l) = mass_v0(i)
893 end if
894 end do
895 end if
896
897 if (surface_tension) then
898 q_prim_vf(eqn_idx%c)%sf(j, k, l) = eta*patch_icpp(patch_id)%cf_val + (1._wp - eta)*orig_prim_vf(eqn_idx%c)
899 end if
900
901 if (1._wp - eta < 1.e-16_wp) patch_id_fp(j, k, l) = patch_id
902
904
905 !> Nullify the patch primitive variable assignment procedure pointer.
911
912end module m_assign_variables
Abstract interface to the two subroutines that assign the patch primitive variables,...
integer, intent(in) k
integer, intent(in) j
integer, intent(in) l
Assigns initial primitive variables to computational cells based on patch geometry.
procedure(s_assign_patch_xxxxx_primitive_variables), pointer, public s_assign_patch_primitive_variables
Pointer to mixture or species patch assignment routine.
impure subroutine, public s_initialize_assign_variables_module
Allocate volume fraction sum and set the patch primitive variable assignment procedure pointer.
subroutine, public s_assign_patch_mixture_primitive_variables(patch_id, j, k, l, eta, q_prim_vf, patch_id_fp)
Assign the mixture primitive variables of the patch designated by the patch_id to the cell that is de...
impure subroutine, public s_finalize_assign_variables_module
Nullify the patch primitive variable assignment procedure pointer.
impure subroutine, public s_assign_patch_species_primitive_variables(patch_id, j, k, l, eta, q_prim_vf, patch_id_fp)
Assign the species primitive variables, following s_assign_patch_species_primitive_variables with ada...
subroutine, public s_perturb_primitive(j, k, l, q_prim_vf)
Apply a stable pressure perturbation following Ando's method for bubble-laden flows.
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter model_eqns_4eq
real(wp), parameter verysmall
Very small number.
integer, parameter model_eqns_6eq
integer, parameter model_eqns_gamma_law
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Defines global parameters for the computational domain, simulation algorithm, and initial conditions.
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
Derived type annexing a scalar field (SF).