MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_phase_change.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
2!>
3!! @file
4!! @brief Contains module m_phase_change
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/common/m_phase_change.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! New line at end of file is required for FYPP
44# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
45# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
46# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
47# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
48# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52
53# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56
57# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58
59# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60
61# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
62
63# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
64
65# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
66
67# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68
69# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
70! New line at end of file is required for FYPP
71# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
72
73# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
74# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
76# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78
79# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
80
81# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
82
83# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
84
85# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86
87# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88
89# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90
91# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92
93# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
94
95# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
96
97# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
98
99# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
100
101# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
102
103# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
104
105# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
106
107# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
108
109# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110
111# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112
113# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125
126# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139
140# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
141
142# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
143
144# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
145
146# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
147
148# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
149! New line at end of file is required for FYPP
150# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
151# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
152# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
153# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
154# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
156# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158
159# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
160# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162
163# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
164
165# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166
167# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
168
169# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170
171# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172
173# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
174
175# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176! New line at end of file is required for FYPP
177# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
178
179# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
180
181# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
182
183# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
184
185# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
186
187# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
188
189# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
190
191# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
192
193# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
194
195# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
196
197# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
198
199# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
200
201# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
202
203# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204
205# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206
207# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234! New line at end of file is required for FYPP
235# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
236
237! GPU parallel region (scalar reductions, maxval/minval)
238# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
239
240! GPU parallel loop over threads (most common GPU macro)
241# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
242
243! Required closing for GPU_PARALLEL_LOOP
244# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245
246! Mark routine for device compilation
247# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
248
249! Declare device-resident data
250# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251
252! Inner loop within a GPU parallel region
253# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
254
255! Scoped GPU data region
256# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258! Host code with device pointers (for MPI with GPU buffers)
259# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261! Allocate device memory (unscoped)
262# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264! Free device memory
265# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267! Atomic operation on device
268# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
269
270! End atomic capture block
271# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273! Copy data between host and device
274# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
275
276! Synchronization barrier
277# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
278
279! Import GPU library module (openacc or omp_lib)
280# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
281
282! Emit code only for AMD compiler
283# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
284
285! Emit code for non-Cray compilers
286# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
287
288! Emit code only for Cray compiler
289# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290
291! Emit code for non-NVIDIA compilers
292# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
293
294# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
295# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
296! New line at end of file is required for FYPP
297# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
298
299# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
300
301! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
302! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
303! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
304# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
305
306! Allocate and create GPU device memory
307# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
308
309! Free GPU device memory and deallocate
310# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
311
312! Cray-specific GPU pointer setup for vector fields
313# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
314
315! Cray-specific GPU pointer setup for scalar fields
316# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318! Cray-specific GPU pointer setup for acoustic source spatials
319# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
320
321# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
322
323# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
324! New line at end of file is required for FYPP
325# 7 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp" 2
326
327!> @brief Phase transition relaxation solvers for liquid-vapor flows with cavitation and boiling
329
330#ifndef MFC_POST_PROCESS
333 use m_mpi_proxy
335 use ieee_arithmetic
337 use m_constants, only: model_eqns_6eq
338
339 implicit none
340
341 private
343
344 !> @name Parameters for the first order transition phase change
345 !> @{
346 integer, parameter :: max_iter = 1e8_wp !< max # of iterations
347 real(wp), parameter :: pcr = 4.94e7_wp !< Critical pressure of water [Pa]
348 real(wp), parameter :: tcr = 385.05_wp + 273.15_wp !< Critical temperature of water [K]
349 real(wp), parameter :: mixm = 1.0e-8_wp !< Mixture mass fraction threshold for triggering phase change
350 integer, parameter :: lp = 1 !< index for the liquid phase of the reacting fluid
351 integer, parameter :: vp = 2 !< index for the vapor phase of the reacting fluid
352 !> @}
353
354 !> @name Gibbs free energy phase change parameters
355 !> @{
356 real(wp) :: a, b, c, d
357 !> @}
358
359
360# 40 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
361#if defined(MFC_OpenACC)
362# 40 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
363!$acc declare create(A, B, C, D)
364# 40 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
365#elif defined(MFC_OpenMP)
366# 40 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
367!$omp declare target (A, B, C, D)
368# 40 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
369#endif
370
371contains
372
373 !> Dispatch to the correct relaxation solver. Replaces the procedure pointer, which CCE is breaking on.
374 impure subroutine s_relaxation_solver(q_cons_vf)
375
376 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
377 ! This is empty because in current master the procedure pointer was never assigned
378
379 if (.not. (.false.)) then
380# 50 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
381 call s_mpi_abort("m_phase_change.fpp:50: " // "Assertion failed: .false.. " &
382# 50 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
383 & // "s_relaxation_solver called but it currently does nothing")
384# 50 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
385 end if
386
387 end subroutine s_relaxation_solver
388
389 !> Initialize the phase change module by setting saturation curve coefficients for pT- or pTg-equilibrium
391
392 ! Saturation curve coefficients via stiffened gas EOS. Saurel et al. JCP (2008), Le Metayer et al. JFE (2004)
393 a = (gs_min(lp)*cvs(lp) - gs_min(vp)*cvs(vp) + qvps(vp) - qvps(lp))/((gs_min(vp) - 1.0_wp)*cvs(vp))
394
395 b = (qvs(lp) - qvs(vp))/((gs_min(vp) - 1.0_wp)*cvs(vp))
396
397 c = (gs_min(vp)*cvs(vp) - gs_min(lp)*cvs(lp))/((gs_min(vp) - 1.0_wp)*cvs(vp))
398
399 d = ((gs_min(lp) - 1.0_wp)*cvs(lp))/((gs_min(vp) - 1.0_wp)*cvs(vp))
400
402
403 !> Apply pT- or pTg-equilibrium relaxation with mass depletion based on the incoming state conditions.
404 subroutine s_infinite_relaxation_k(q_cons_vf)
405
406 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
407 real(wp) :: ps, psov, pssl !< equilibrium pressure for mixture, overheated vapor, and subcooled liquid
408 real(wp) :: ts, tsov, tssl, tsatov, tsatsl !< Equilibrium and saturation temperatures
409 real(wp) :: rhoe, dyne, rhos !< total internal energy, kinetic energy, and total entropy
410 real(wp) :: rho, rm, m1, m2, mct !< total density, total reacting mass, individual reacting masses
411 real(wp) :: tvf !< total volume fraction
412 ! $:GPU_DECLARE(create='[pS,pSOV,pSSL,TS,TSOV,TSSL,TSatOV,TSatSL]')
413 ! $:GPU_DECLARE(create='[rhoe,dynE,rhos,rho,rM,m1,m2,MCT,TvF]')
414
415# 83 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
416 real(wp), dimension(num_fluids) :: p_infov, p_infpt, p_infsl, sk, hk, gk, ek, rhok
417# 85 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
418 ! $:GPU_DECLARE(create='[p_infOV,p_infpT,p_infSL,sk,hk,gk,ek,rhok]')
419
420 !> Generic loop iterators
421 integer :: i, j, k, l
422
423#ifdef _CRAYFTN
424#ifdef MFC_OpenACC
425 ! CCE 19 IPA workaround: prevent bring_routine_resident SIGSEGV DIR$ NOINLINE s_infinite_pt_relaxation_k DIR$ NOINLINE
426 ! s_infinite_ptg_relaxation_k DIR$ NOINLINE s_correct_partial_densities DIR$ NOINLINE s_TSat
427#endif
428#endif
429
430 ! starting equilibrium solver
431
432
433# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
434
435# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
436#if defined(MFC_OpenACC)
437# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
438!$acc parallel loop collapse(3) gang vector default(present) private(i, j, k, l, p_infOV, p_infpT, p_infSL, sk, hk, gk, ek, rhok, pS, pSOV, pSSL, TS, TSOV, TSatOV, TSatSL, TSSL, rhoe, dynE, rhos, rho, rM, m1, m2, MCT, TvF)
439# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
440#elif defined(MFC_OpenMP)
441# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
442
443# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
444
445# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
446
447# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
448!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(i, j, k, l, p_infOV, p_infpT, p_infSL, sk, hk, gk, ek, rhok, pS, pSOV, pSSL, TS, TSOV, TSatOV, TSatSL, TSSL, rhoe, dynE, rhos, rho, rM, m1, m2, MCT, TvF)
449# 99 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
450#endif
451# 101 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
452 do j = 0, m
453 do k = 0, n
454 do l = 0, p
455 rho = 0.0_wp; tvf = 0.0_wp
456
457# 105 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
458#if defined(MFC_OpenACC)
459# 105 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
460!$acc loop seq
461# 105 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
462#elif defined(MFC_OpenMP)
463# 105 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
464
465# 105 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
466#endif
467 do i = 1, num_fluids
468 ! Mixture density
469 rho = rho + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)
470
471 ! Total Volume Fraction
472 tvf = tvf + q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(j, k, l)
473 end do
474
475 ! calculating the total reacting mass for the phase change process. By hypothesis, this should not change
476 ! throughout the phase-change process.
477 rm = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l)
478
479 ! correcting negative (reacting) mass fraction values in case they happen
480 call s_correct_partial_densities(mct, q_cons_vf, rm, j, k, l)
481
482 ! fixing m1 and m2 AFTER correcting the partial densities. Note that these values must be stored for the phase
483 ! change process that will happen a posteriori
484 m1 = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l)
485
486 m2 = q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l)
487
488 ! kinetic energy as an auxiliary variable to the calculation of the total internal energy
489 dyne = 0.0_wp
490
491# 129 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
492#if defined(MFC_OpenACC)
493# 129 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
494!$acc loop seq
495# 129 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
496#elif defined(MFC_OpenMP)
497# 129 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
498
499# 129 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
500#endif
501 do i = eqn_idx%mom%beg, eqn_idx%mom%end
502 dyne = dyne + 5.0e-1_wp*q_cons_vf(i)%sf(j, k, l)**2/rho
503 end do
504
505 ! calculating the total energy that MUST be preserved throughout the pT- and pTg-relaxation procedures at each
506 ! of the cells. The internal energy is calculated as the total energy minus the kinetic energy to preserved its
507 ! value at sharp interfaces
508 rhoe = q_cons_vf(eqn_idx%E)%sf(j, k, l) - dyne
509
510 ! Calling pT-equilibrium for either finishing phase-change module, or as an IC for the pTg-equilibrium for this
511 ! case, MFL cannot be either 0 or 1, so I chose it to be 2
512 call s_infinite_pt_relaxation_k(j, k, l, 2, ps, p_infpt, q_cons_vf, rhoe, ts)
513
514 ! Check if pTg-equilibrium needed; only partial densities require updating
515 if ((relax_model == 6) .and. ((q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, &
516 & l) > mixm*rm) .and. (q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, &
517 & l) > mixm*rm)) .and. (ps < pcr) .and. (ts < tcr)) then
518 ! Checking if phase change is needed, by checking whether the final solution is either subcoooled liquid or
519 ! overheated vapor.
520
521 ! overheated vapor case depleting the mass of liquid
522 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mixm*rm
523
524 ! transferring the total mass to vapor
525 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
526
527 ! calling pT-equilibrium for overheated vapor, which is MFL = 0
528 call s_infinite_pt_relaxation_k(j, k, l, 0, psov, p_infov, q_cons_vf, rhoe, tsov)
529
530 ! calculating Saturation temperature
531 call s_tsat(psov, tsatov, tsov)
532
533 ! subcooled liquid case transferring the total mass to liquid
534 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
535
536 ! depleting the mass of vapor
537 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mixm*rm
538
539 ! calling pT-equilibrium for subcooled liquid, which is MFL = 1
540 call s_infinite_pt_relaxation_k(j, k, l, 1, pssl, p_infsl, q_cons_vf, rhoe, tssl)
541
542 ! calculating Saturation temperature
543 call s_tsat(pssl, tsatsl, tssl)
544
545 ! checking the conditions for overheated vapor and subcooled liquide
546 if (tsov > tsatov) then
547 ! Assigning pressure
548 ps = psov
549
550 ! Assigning Temperature
551 ts = tsov
552
553 ! correcting the liquid partial density
554 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mixm*rm
555
556 ! correcting the vapor partial density
557 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
558 else if (tssl < tsatsl) then
559 ! Assigning pressure
560 ps = pssl
561
562 ! Assigning Temperature
563 ts = tssl
564
565 ! correcting the liquid partial density
566 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
567
568 ! correcting the vapor partial density
569 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mixm*rm
570 else
571 ! returning partial pressures to what they were from the homogeneous solver liquid
572 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = m1
573
574 ! vapor
575 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = m2
576
577 ! calling the pTg-equilibrium solver
578 call s_infinite_ptg_relaxation_k(j, k, l, ps, p_infpt, rhoe, q_cons_vf, ts)
579 end if
580 end if
581
582 ! Calculations AFTER equilibrium
583
584
585# 213 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
586#if defined(MFC_OpenACC)
587# 213 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
588!$acc loop seq
589# 213 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
590#elif defined(MFC_OpenMP)
591# 213 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
592
593# 213 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
594#endif
595 do i = 1, num_fluids
596 ! entropy
597 sk(i) = cvs(i)*log((ts**gs_min(i))/((ps + ps_inf(i))**(gs_min(i) - 1.0_wp))) + qvps(i)
598
599 ! enthalpy
600 hk(i) = gs_min(i)*cvs(i)*ts + qvs(i)
601
602 ! Gibbs-free energy
603 gk(i) = hk(i) - ts*sk(i)
604
605 ! densities
606 rhok(i) = (ps + ps_inf(i))/((gs_min(i) - 1)*cvs(i)*ts)
607
608 ! internal energy
609 ek(i) = (ps + gs_min(i)*ps_inf(i))/(ps + ps_inf(i))*cvs(i)*ts + qvs(i)
610 end do
611
612 ! calculating volume fractions, internal energies, and total entropy
613 rhos = 0.0_wp
614
615# 233 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
616#if defined(MFC_OpenACC)
617# 233 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
618!$acc loop seq
619# 233 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
620#elif defined(MFC_OpenMP)
621# 233 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
622
623# 233 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
624#endif
625 do i = 1, num_fluids
626 ! volume fractions
627 q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(j, k, l) = q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)/rhok(i)
628
629 ! alpha*rho*e
630 if (model_eqns == model_eqns_6eq) then
631 q_cons_vf(i + eqn_idx%int_en%beg - 1)%sf(j, k, l) = q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
632 & l)*ek(i)
633 end if
634
635 ! Total entropy
636 rhos = rhos + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*sk(i)
637 end do
638 end do
639 end do
640 end do
641
642# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
643#if defined(MFC_OpenACC)
644# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
645!$acc end parallel loop
646# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
647#elif defined(MFC_OpenMP)
648# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
649
650# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
651!$omp end target teams loop
652# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
653#endif
654
655 end subroutine s_infinite_relaxation_k
656
657 !> Apply pT-equilibrium relaxation for N fluids
658 !! @param MFL flag: 0=gas, 1=liquid, 2=mixture
659 subroutine s_infinite_pt_relaxation_k(j, k, l, MFL, pS, p_infpT, q_cons_vf, rhoe, TS)
660
661
662# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
663#ifdef _CRAYFTN
664# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
665#if MFC_OpenACC
666# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
667!$acc routine seq
668# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
669#elif MFC_OpenMP
670# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
671
672# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
673
674# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
675!$omp declare target device_type(any)
676# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
677#else
678# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
679!DIR$ NOINLINE s_infinite_pt_relaxation_k
680# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
681#endif
682# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
683#elif MFC_OpenACC
684# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
685!$acc routine seq
686# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
687#elif MFC_OpenMP
688# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
689
690# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
691
692# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
693!$omp declare target device_type(any)
694# 258 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
695#endif
696
697 ! initializing variables
698 integer, intent(in) :: j, k, l, MFL
699 real(wp), intent(out) :: pS
700 real(wp), dimension(1:), intent(out) :: p_infpT
701 type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf
702 real(wp), intent(in) :: rhoe
703 real(wp), intent(out) :: TS
704 real(wp) :: gp, gpp, hp, pO, mCP, mQ !< variables for the Newton Solver
705 real(wp) :: p_infpT_sum
706 integer :: i, ns !< generic loop iterators
707 ! auxiliary variables for the pT-equilibrium solver
708 mcp = 0.0_wp; mq = 0.0_wp; p_infpt_sum = 0._wp
709
710# 272 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
711#if defined(MFC_OpenACC)
712# 272 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
713!$acc loop seq
714# 272 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
715#elif defined(MFC_OpenMP)
716# 272 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
717
718# 272 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
719#endif
720 do i = 1, num_fluids
721 p_infpt(i) = ps_inf(i)
722 p_infpt_sum = p_infpt_sum + abs(p_infpt(i))
723 end do
724 ! Performing tests before initializing the pT-equilibrium
725
726# 278 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
727#if defined(MFC_OpenACC)
728# 278 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
729!$acc loop seq
730# 278 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
731#elif defined(MFC_OpenMP)
732# 278 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
733
734# 278 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
735#endif
736 do i = 1, num_fluids
737 ! sum of the total alpha*rho*cp of the system
738 mcp = mcp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*gs_min(i)
739
740 ! sum of the total alpha*rho*q of the system
741 mq = mq + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
742 end do
743
744# 295 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
745
746 ! Checking energy constraint
747 if ((rhoe - mq - minval(p_infpt)) < 0.0_wp) then
748 if ((mfl == 0) .or. (mfl == 1)) then
749 ! Assigning zero values for mass depletion cases pressure
750 ps = 0.0_wp
751
752 ! temperature
753 ts = 0.0_wp
754
755 return
756 end if
757 end if
758
759 ! calculating initial estimate for pressure in the pT-relaxation procedure. I will also use this variable to iterate over
760 ! the Newton's solver
761 po = 0.0_wp
762
763 ! Maybe improve this condition afterwards. As long as the initial guess is in between -min(ps_inf) and infinity, a solution
764 ! should be able to be found.
765 ps = 1.0e4_wp
766
767 ! Newton Solver for the pT-equilibrium
768 ns = 0
769 ! change this relative error metric. 1.e4_wp is just arbitrary
770 do while ((abs(ps - po) > palpha_eps) .and. (abs((ps - po)/po) > palpha_eps/1.e4_wp) .or. (ns == 0))
771 ! increasing counter
772 ns = ns + 1
773
774 ! updating old pressure
775 po = ps
776
777 ! updating functions used in the Newton's solver
778 gpp = 0.0_wp; gp = 0.0_wp; hp = 0.0_wp
779
780# 329 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
781#if defined(MFC_OpenACC)
782# 329 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
783!$acc loop seq
784# 329 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
785#elif defined(MFC_OpenMP)
786# 329 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
787
788# 329 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
789#endif
790 do i = 1, num_fluids
791 gp = gp + (gs_min(i) - 1.0_wp)*q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
792 & l)*cvs(i)*(rhoe + ps - mq)/(mcp*(ps + p_infpt(i)))
793
794 gpp = gpp + (gs_min(i) - 1.0_wp)*q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, &
795 & l)*cvs(i)*(p_infpt(i) - rhoe + mq)/(mcp*(ps + p_infpt(i))**2)
796 end do
797
798 hp = 1.0_wp/(rhoe + ps - mq) + 1.0_wp/(ps + minval(p_infpt))
799
800 ! updating common pressure for the newton solver
801 ps = po + ((1.0_wp - gp)/gpp)/(1.0_wp - (1.0_wp - gp + abs(1.0_wp - gp))/(2.0_wp*gpp)*hp)
802 end do
803
804 ! common temperature
805 ts = (rhoe + ps - mq)/mcp
806
807 end subroutine s_infinite_pt_relaxation_k
808
809 !> Apply pTg-equilibrium relaxation for N fluids under pT and 2 fluids under pTg-equilibrium. There is a final common p and T
810 !! during relaxation
811 subroutine s_infinite_ptg_relaxation_k(j, k, l, pS, p_infpT, rhoe, q_cons_vf, TS)
812
813
814# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
815#ifdef _CRAYFTN
816# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
817#if MFC_OpenACC
818# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
819!$acc routine seq
820# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
821#elif MFC_OpenMP
822# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
823
824# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
825
826# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
827!$omp declare target device_type(any)
828# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
829#else
830# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
831!DIR$ NOINLINE s_infinite_ptg_relaxation_k
832# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
833#endif
834# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
835#elif MFC_OpenACC
836# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
837!$acc routine seq
838# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
839#elif MFC_OpenMP
840# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
841
842# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
843
844# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
845!$omp declare target device_type(any)
846# 353 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
847#endif
848
849 integer, intent(in) :: j, k, l
850 real(wp), intent(inout) :: pS
851 real(wp), dimension(1:), intent(in) :: p_infpT
852 real(wp), intent(in) :: rhoe
853 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
854 real(wp), intent(inout) :: TS
855# 364 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
856 real(wp), dimension(num_fluids) :: p_infpTg !< stiffness for the participating fluids for pTg-equilibrium
857# 366 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
858 real(wp), dimension(2, 2) :: Jac, InvJac, TJac !< matrices for the Newton Solver
859 real(wp), dimension(2) :: R2D, DeltamP !< residual and correction array
860 real(wp) :: Om !< underrelaxation factor
861 real(wp) :: mCP, mCPD, mCVGP, mCVGP2, mQ, mQD !< auxiliary variables for the pTg-solver
862 real(wp) :: ml, mT, dFdT, dTdm, dTdp
863
864 !> Generic loop iterators
865 integer :: i, ns
866 ! pTg-equilibrium solution procedure Newton Solver parameters counter
867 ns = 0
868
869 ! Relaxation factor
870 om = 1.0e-3_wp
871
872 p_infptg = p_infpt
873
874 if (((ps < 0.0_wp) .and. ((q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, &
875 & k, &
876 & l)) > ((rhoe - gs_min(lp)*ps_inf(lp)/(gs_min(lp) - 1))/qvs(lp)))) .or. ((ps >= 0.0_wp) .and. (ps < 1.0e-1_wp))) then
877 ! improve this initial condition
878 ps = 1.0e4_wp
879 end if
880
881 ! Loop until the solution for F(X) is satisfied Check whether I need to use both absolute and relative values for the
882 ! residual, and how to do it adequately. Dummy guess to start the pTg-equilibrium problem. improve this initial condition
883 r2d(1) = 0.0_wp; r2d(2) = 0.0_wp
884 deltamp(1) = 0.0_wp; deltamp(2) = 0.0_wp
885 do while (((sqrt(r2d(1)**2 + r2d(2)**2) > ptgalpha_eps) .and. ((sqrt(r2d(1)**2 + r2d(2)**2)/rhoe) > (ptgalpha_eps/1.e6_wp) &
886 & )) .or. (ns == 0))
887
888 ! Updating counter for the iterative procedure
889 ns = ns + 1
890
891 ! Auxiliary variables to help in the calculation of the residue
892 mcp = 0.0_wp; mcpd = 0.0_wp; mcvgp = 0.0_wp; mcvgp2 = 0.0_wp; mq = 0.0_wp; mqd = 0.0_wp
893 ! Those must be updated through the iterations, as they either depend on the partial masses for all fluids, or on the
894 ! equilibrium pressure
895
896# 403 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
897#if defined(MFC_OpenACC)
898# 403 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
899!$acc loop seq
900# 403 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
901#elif defined(MFC_OpenMP)
902# 403 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
903
904# 403 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
905#endif
906 do i = 1, num_fluids
907 ! sum of the total alpha*rho*cp of the system
908 mcp = mcp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*gs_min(i)
909
910 ! sum of the total alpha*rho*q of the system
911 mq = mq + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
912
913 ! These auxiliary variables now need to be updated, as the partial densities now vary at every iteration
914 if ((i /= lp) .and. (i /= vp)) then
915 mcvgp = mcvgp + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*(gs_min(i) - 1)/(ps + ps_inf(i))
916
917 mcvgp2 = mcvgp2 + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*(gs_min(i) - 1)/((ps + ps_inf(i))**2)
918
919 mqd = mqd + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*qvs(i)
920
921 ! sum of the total alpha*rho*cp of the system
922 mcpd = mcpd + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(j, k, l)*cvs(i)*gs_min(i)
923 end if
924 end do
925
926 ! calculating the (2D) Jacobian Matrix used in the solution of the pTg-quilibrium model
927
928 ! mass of the reacting liquid
929 ml = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l)
930
931 ! mass of the two participating fluids
932 mt = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l)
933
934 ts = 1/(mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) - cvs(vp) &
935 & *(gs_min(vp) - 1)/(ps + ps_inf(vp))) + mcvgp)
936
937 dfdt = -(cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*log(ts) - (qvps(lp) - qvps(vp)) + cvs(lp)*(gs_min(lp) - 1)*log(ps &
938 & + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)*log(ps + ps_inf(vp))
939
940 dtdm = -(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))*ts**2
941
942 dtdp = (mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp))**2 - cvs(vp) &
943 & *(gs_min(vp) - 1)/(ps + ps_inf(vp))**2) + mcvgp2)*ts**2
944
945 ! F = (F1,F2) is the function whose roots we are looking for x = (m1, p) are the independent variables. m1 = mass of the
946 ! first participant fluid, p = pressure F1 = 0 is the Gibbs free energy quality F2 = 0 is the enforcement of the
947 ! thermodynamic (total - kinectic) energy dF1dm
948 jac(1, 1) = dfdt*dtdm
949
950 ! dF1dp
951 jac(1, 2) = dfdt*dtdp + ts*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))
952
953 ! dF2dm
954 jac(2, &
955 & 1) = (qvs(vp) - qvs(lp) + (cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp))/(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps &
956 & + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) &
957 & + mcvgp) - (ml*(cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) - mt*cvs(vp)*gs_min(vp) - mcpd)*(cvs(lp)*(gs_min(lp) &
958 & - 1)/(ps + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))/((ml*(cvs(lp)*(gs_min(lp) - 1)/(ps &
959 & + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) &
960 & + mcvgp)**2))/1
961 ! dF2dp
962 jac(2, &
963 & 2) = (1 + (ml*(cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) - mt*cvs(vp)*gs_min(vp) - mcpd)*(ml*(cvs(lp)*(gs_min(lp) &
964 & - 1)/(ps + ps_inf(lp))**2 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2) + mt*cvs(vp)*(gs_min(vp) - 1)/(ps &
965 & + ps_inf(vp))**2 + mcvgp2)/(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps &
966 & + ps_inf(vp))) + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp)**2)/1
967
968 ! intermediate elements of J^{-1}
969 invjac(1, 1) = jac(2, 2)
970 invjac(1, 2) = -1.0_wp*jac(1, 2)
971 invjac(2, 1) = -1.0_wp*jac(2, 1)
972 invjac(2, 2) = jac(1, 1)
973
974 ! elements of J^{T}
975 tjac(1, 1) = jac(1, 1)
976 tjac(1, 2) = jac(2, 1)
977 tjac(2, 1) = jac(1, 2)
978 tjac(2, 2) = jac(2, 2)
979
980 ! dividing by det(J)
981 invjac = invjac/(jac(1, 1)*jac(2, 2) - jac(1, 2)*jac(2, 1))
982
983 ! calculating correction array for Newton's method
984 deltamp(1) = -1.0_wp*(invjac(1, 1)*r2d(1) + invjac(1, 2)*r2d(2))
985 deltamp(2) = -1.0_wp*(invjac(2, 1)*r2d(1) + invjac(2, 2)*r2d(2))
986
987 ! updating two reacting 'masses'. Recall that inert 'masses' do not change during the phase change liquid
988 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + om*deltamp(1)
989
990 ! gas
991 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) - om*deltamp(1)
992
993 ! updating pressure
994 ps = ps + om*deltamp(2)
995
996 ! calculating residuals, which are (i) the difference between the Gibbs Free energy of the gas and the liquid and (ii)
997 ! the energy before and after the phase-change process.
998
999 ! mass of the reacting liquid
1000 ml = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l)
1001
1002 ! mass of the two participating fluids
1003 mt = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l)
1004
1005 ts = 1/(mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) - cvs(vp) &
1006 & *(gs_min(vp) - 1)/(ps + ps_inf(vp))) + mcvgp)
1007
1008 ! Gibbs Free Energy Equality condition (DG)
1009 r2d(1) = ts*((cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*(1 - log(ts)) - (qvps(lp) - qvps(vp)) + cvs(lp)*(gs_min(lp) &
1010 & - 1)*log(ps + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)*log(ps + ps_inf(vp))) + qvs(lp) - qvs(vp)
1011
1012 ! Constant Energy Process condition (DE)
1013 r2d(2) = (rhoe + ps + ml*(qvs(vp) - qvs(lp)) - mt*qvs(vp) - mqd + (ml*(gs_min(vp)*cvs(vp) - gs_min(lp)*cvs(lp)) &
1014 & - mt*gs_min(vp)*cvs(vp) - mcpd)/(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)/(ps &
1015 & + ps_inf(vp))) + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp))/1
1016 end do
1017
1018 ! common temperature
1019 ts = (rhoe + ps - mq)/mcp
1020
1021 end subroutine s_infinite_ptg_relaxation_k
1022
1023 !> Correct the partial densities of the reacting fluids in case one of them is negative but their sum is positive. Inert phases
1024 !! are not corrected at this moment
1025 subroutine s_correct_partial_densities(MCT, q_cons_vf, rM, j, k, l)
1026
1027
1028# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1029#ifdef _CRAYFTN
1030# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1031#if MFC_OpenACC
1032# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1033!$acc routine seq
1034# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1035#elif MFC_OpenMP
1036# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1037
1038# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1039
1040# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1041!$omp declare target device_type(any)
1042# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1043#else
1044# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1045!DIR$ NOINLINE s_correct_partial_densities
1046# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1047#endif
1048# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1049#elif MFC_OpenACC
1050# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1051!$acc routine seq
1052# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1053#elif MFC_OpenMP
1054# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1055
1056# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1057
1058# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1059!$omp declare target device_type(any)
1060# 525 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1061#endif
1062
1063 !> @name variables for the correction of the reacting partial densities
1064 !> @{
1065 real(wp), intent(out) :: mct
1066 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
1067 real(wp), intent(inout) :: rm
1068 integer, intent(in) :: j, k, l
1069 !> @}
1070 if (rm < 0.0_wp) then
1071 if ((q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, &
1072 & l) >= -1.0_wp*mixm) .and. (q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) >= -1.0_wp*mixm)) then
1073 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = 0.0_wp
1074
1075 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = 0.0_wp
1076
1077 rm = q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) + q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l)
1078 end if
1079 end if
1080
1081 ! TODO: Consider partitioning partial densities instead of absolute-value correction
1082 mct = 2*mixm
1083
1084 ! correcting the partial densities of the reacting fluids. What to do for the nonreacting ones?
1085 if (q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) < 0.0_wp) then
1086 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mct*rm
1087
1088 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = (1.0_wp - mct)*rm
1089 else if (q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) < 0.0_wp) then
1090 q_cons_vf(lp + eqn_idx%cont%beg - 1)%sf(j, k, l) = (1.0_wp - mct)*rm
1091
1092 q_cons_vf(vp + eqn_idx%cont%beg - 1)%sf(j, k, l) = mct*rm
1093 end if
1094
1095 end subroutine s_correct_partial_densities
1096
1097 !> Find the saturation temperature for a given saturation pressure using a Newton solver
1098 elemental subroutine s_tsat(pSat, TSat, TSIn)
1099
1100
1101# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1102#ifdef _CRAYFTN
1103# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1104#if MFC_OpenACC
1105# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1106!$acc routine seq
1107# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1108#elif MFC_OpenMP
1109# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1110
1111# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1112
1113# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1114!$omp declare target device_type(any)
1115# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1116#else
1117# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1118!DIR$ NOINLINE s_TSat
1119# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1120#endif
1121# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1122#elif MFC_OpenACC
1123# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1124!$acc routine seq
1125# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1126#elif MFC_OpenMP
1127# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1128
1129# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1130
1131# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1132!$omp declare target device_type(any)
1133# 564 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1134#endif
1135
1136 real(wp), intent(in) :: psat
1137 real(wp), intent(out) :: tsat
1138 real(wp), intent(in) :: tsin
1139 real(wp) :: dfdt, ft, om !< auxiliary variables
1140 ! Generic loop iterators
1141 integer :: ns
1142
1143 if ((f_approx_equal(psat, 0.0_wp)) .and. (f_approx_equal(tsin, 0.0_wp))) then
1144 ! assigning Saturation temperature
1145 tsat = 0.0_wp
1146 else
1147 ! calculating initial estimate for temperature in the TSat procedure. I will also use this variable to iterate over the
1148 ! Newton's solver
1149 tsat = tsin
1150
1151 ! iteration counter
1152 ns = 0
1153
1154 ! underrelaxation factor
1155 om = 1.0e-3_wp
1156
1157 ! FT must be initialized before the do while condition is evaluated. Fortran .or. is not short-circuit: abs(FT) is
1158 ! always evaluated even when ns == 0, so FT must have a defined value here.
1159 ft = huge(1.0_wp)
1160
1161 do while ((abs(ft) > ptgalpha_eps) .or. (ns == 0))
1162 ! increasing counter
1163 ns = ns + 1
1164
1165 ! calculating residual
1166 ft = tsat*((cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*(1 - log(tsat)) - (qvps(lp) - qvps(vp)) + cvs(lp)*(gs_min(lp) &
1167 & - 1)*log(psat + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)*log(psat + ps_inf(vp))) + qvs(lp) - qvs(vp)
1168
1169 ! calculating the jacobian
1170 dfdt = -(cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*log(tsat) - (qvps(lp) - qvps(vp)) + cvs(lp)*(gs_min(lp) - 1) &
1171 & *log(psat + ps_inf(lp)) - cvs(vp)*(gs_min(vp) - 1)*log(psat + ps_inf(vp))
1172
1173 ! updating saturation temperature
1174 tsat = tsat - om*ft/dfdt
1175
1176 if (abs(ft) <= ptgalpha_eps) exit
1177 end do
1178 end if
1179
1180 end subroutine s_tsat
1181
1182 !> Finalize the phase change module
1186#endif
1187end module m_phase_change
type(scalar_field), dimension(sys_size), intent(inout) q_cons_vf
real(wp), intent(inout) rm
integer, intent(in) k
real(wp), intent(out) mct
integer, intent(in) j
integer, intent(in) l
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter model_eqns_6eq
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Global parameters for the post-process: domain geometry, equation of state, and output database setti...
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
logical elemental function, public f_approx_equal(a, b, tol_input)
Check if two floating point numbers of wp are within tolerance.
MPI gather and scatter operations for distributing post-process grid and flow-variable data.
Phase transition relaxation solvers for liquid-vapor flows with cavitation and boiling.
impure subroutine, public s_finalize_relaxation_solver_module
Finalize the phase change module.
subroutine, public s_infinite_relaxation_k(q_cons_vf)
Apply pT- or pTg-equilibrium relaxation with mass depletion based on the incoming state conditions.
elemental subroutine s_tsat(psat, tsat, tsin)
Find the saturation temperature for a given saturation pressure using a Newton solver.
integer, parameter vp
index for the vapor phase of the reacting fluid
integer, parameter lp
index for the liquid phase of the reacting fluid
subroutine s_infinite_pt_relaxation_k(j, k, l, mfl, ps, p_infpt, q_cons_vf, rhoe, ts)
Apply pT-equilibrium relaxation for N fluids.
impure subroutine, public s_relaxation_solver(q_cons_vf)
Dispatch to the correct relaxation solver. Replaces the procedure pointer, which CCE is breaking on.
real(wp), parameter tcr
Critical temperature of water [K].
integer, parameter max_iter
max # of iterations
impure subroutine, public s_initialize_phasechange_module
Initialize the phase change module by setting saturation curve coefficients for pT- or pTg-equilibriu...
real(wp), parameter mixm
Mixture mass fraction threshold for triggering phase change.
subroutine s_infinite_ptg_relaxation_k(j, k, l, ps, p_infpt, rhoe, q_cons_vf, ts)
Apply pTg-equilibrium relaxation for N fluids under pT and 2 fluids under pTg-equilibrium....
real(wp), parameter pcr
Critical pressure of water [Pa].
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
real(wp), dimension(:), allocatable, public ps_inf
real(wp), dimension(:), allocatable, public gs_min
real(wp), dimension(:), allocatable, public qvs
real(wp), dimension(:), allocatable, public cvs
real(wp), dimension(:), allocatable, public qvps
Derived type annexing a scalar field (SF).