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# 9 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
13
14! For moving immersed boundaries in simulation
15# 14 "/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# 207 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 232 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 243 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 245 "/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# 283 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 293 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 303 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 312 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 329 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 346 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139
140# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
141
142# 358 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
143
144# 364 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
145
146# 370 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
147
148# 376 "/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# 192 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 213 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 241 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 256 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 266 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 275 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 291 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 301 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 308 "/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# 21 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
238
239# 37 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
240
241# 50 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
242
243# 76 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
244
245# 91 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247# 102 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
248
249# 115 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
250
251# 143 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253# 154 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
254
255# 165 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
256
257# 176 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259# 186 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261# 197 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
262
263# 208 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265# 218 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267# 224 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
268
269# 230 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271# 236 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
274
275# 244 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276# 245 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
277! New line at end of file is required for FYPP
278# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
279
280# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
281
282! Caution:
283! This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI rank.
284! That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0.
285! For an example see misc/nvidia_uvm/bind.sh.
286# 63 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
287
288# 81 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
289
290# 88 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
291
292# 111 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
293
294# 127 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
295
296# 153 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
297
298# 159 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
299
300# 167 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
301! New line at end of file is required for FYPP
302# 7 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp" 2
303
304!> @brief Phase transition relaxation solvers for liquid-vapor flows with cavitation and boiling
306
307#ifndef MFC_POST_PROCESS
308
309 use m_derived_types !< definitions of the derived types
310
311 use m_global_parameters !< definitions of the global parameters
312
313 use m_mpi_proxy !< message passing interface (mpi) module proxy
314
315 use m_variables_conversion !< state variables type conversion procedures
316
317 use ieee_arithmetic
318
319 use m_helper_basic !< functions to compare floating point numbers
320
321 implicit none
322
323 private;
328
329 !> @name Parameters for the first order transition phase change
330 !> @{
331 integer, parameter :: max_iter = 1e8_wp !< max # of iterations
332 real(wp), parameter :: pcr = 4.94e7_wp !< Critical water pressure
333 real(wp), parameter :: tcr = 385.05_wp + 273.15_wp !< Critical water temperature
334 real(wp), parameter :: mixm = 1.0e-8_wp !< threshold for 'mixture cell'. If Y < mixM, phase change does not happen
335 integer, parameter :: lp = 1 !< index for the liquid phase of the reacting fluid
336 integer, parameter :: vp = 2 !< index for the vapor phase of the reacting fluid
337 !> @}
338
339 !> @name Gibbs free energy phase change parameters
340 !> @{
341 real(wp) :: a, b, c, d
342 !> @}
343
344
345# 48 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
346#if defined(MFC_OpenACC)
347# 48 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
348!$acc declare create(A, B, C, D)
349# 48 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
350#elif defined(MFC_OpenMP)
351# 48 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
352!$omp declare target (A, B, C, D)
353# 48 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
354#endif
355
356contains
357
358 !> This subroutine should dispatch to the correct relaxation solver based
359 !! some parameter. It replaces the procedure pointer, which CCE
360 !! is breaking on.
361 impure subroutine s_relaxation_solver(q_cons_vf)
362 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
363 ! This is empty because in current master the procedure pointer
364 ! was never assigned
365 if (.not. (.false.)) then
366# 59 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
367 call s_mpi_abort("m_phase_change.fpp:59: "// &
368# 59 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
369 "Assertion failed: .false.. " &
370# 59 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
371 //"s_relaxation_solver called but it currently does nothing")
372# 59 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
373 end if
374 end subroutine s_relaxation_solver
375
376 !> The purpose of this subroutine is to initialize the phase change module
377 !! by setting the parameters needed for phase change and
378 !! selecting the phase change module that will be used
379 !! (pT- or pTg-equilibrium)
381 ! variables used in the calculation of the saturation curves for fluids 1 and 2
382 a = (gs_min(lp)*cvs(lp) - gs_min(vp)*cvs(vp) &
383 + qvps(vp) - qvps(lp))/((gs_min(vp) - 1.0_wp)*cvs(vp))
384
385 b = (qvs(lp) - qvs(vp))/((gs_min(vp) - 1.0_wp)*cvs(vp))
386
387 c = (gs_min(vp)*cvs(vp) - gs_min(lp)*cvs(lp)) &
388 /((gs_min(vp) - 1.0_wp)*cvs(vp))
389
390 d = ((gs_min(lp) - 1.0_wp)*cvs(lp)) &
391 /((gs_min(vp) - 1.0_wp)*cvs(vp))
392
394
395 !> This subroutine is created to activate either the pT- (N fluids) or the
396 !! pTg-equilibrium (2 fluids for g-equilibrium)
397 !! model, also considering mass depletion, depending on the incoming
398 !! state conditions.
399 !! @param q_cons_vf Cell-average conservative variables
400 subroutine s_infinite_relaxation_k(q_cons_vf)
401
402 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
403 real(wp) :: ps, psov, pssl !< equilibrium pressure for mixture, overheated vapor, and subcooled liquid
404 real(wp) :: ts, tsov, tssl, tsatov, tsatsl !< equilibrium temperature for mixture, overheated vapor, and subcooled liquid. Saturation Temperatures at overheated vapor and subcooled liquid
405 real(wp) :: rhoe, dyne, rhos !< total internal energy, kinetic energy, and total entropy
406 real(wp) :: rho, rm, m1, m2, mct !< total density, total reacting mass, individual reacting masses
407 real(wp) :: tvf !< total volume fraction
408
409 ! $:GPU_DECLARE(create='[pS,pSOV,pSSL,TS,TSOV,TSSL,TSatOV,TSatSL]')
410 ! $:GPU_DECLARE(create='[rhoe,dynE,rhos,rho,rM,m1,m2,MCT,TvF]')
411# 100 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
412 real(wp), dimension(num_fluids) :: p_infov, p_infpt, p_infsl, sk, hk, gk, ek, rhok
413# 102 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
414 ! $:GPU_DECLARE(create='[p_infOV,p_infpT,p_infSL,sk,hk,gk,ek,rhok]')
415
416 !< Generic loop iterators
417 integer :: i, j, k, l
418
419 ! starting equilibrium solver
420
421# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
422
423# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
424#if defined(MFC_OpenACC)
425# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
426!$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)
427# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
428#elif defined(MFC_OpenMP)
429# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
430
431# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
432
433# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
434
435# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
436!$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)
437# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
438#endif
439# 108 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
440
441 do j = 0, m
442 do k = 0, n
443 do l = 0, p
444
445 rho = 0.0_wp; tvf = 0.0_wp
446
447# 114 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
448#if defined(MFC_OpenACC)
449# 114 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
450!$acc loop seq
451# 114 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
452#elif defined(MFC_OpenMP)
453# 114 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
454
455# 114 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
456#endif
457 do i = 1, num_fluids
458
459 ! Mixture density
460 rho = rho + q_cons_vf(i + contxb - 1)%sf(j, k, l)
461
462 ! Total Volume Fraction
463 tvf = tvf + q_cons_vf(i + advxb - 1)%sf(j, k, l)
464
465 end do
466
467 ! calculating the total reacting mass for the phase change process. By hypothesis, this should not change
468 ! throughout the phase-change process.
469 rm = q_cons_vf(lp + contxb - 1)%sf(j, k, l) + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
470
471 ! correcting negative (reacting) mass fraction values in case they happen
472 call s_correct_partial_densities(mct, q_cons_vf, rm, j, k, l)
473
474 ! fixing m1 and m2 AFTER correcting the partial densities. Note that these values must be stored for the phase
475 ! change process that will happen a posteriori
476 m1 = q_cons_vf(lp + contxb - 1)%sf(j, k, l)
477
478 m2 = q_cons_vf(vp + contxb - 1)%sf(j, k, l)
479
480 ! kinetic energy as an auxiliary variable to the calculation of the total internal energy
481 dyne = 0.0_wp
482
483# 140 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
484#if defined(MFC_OpenACC)
485# 140 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
486!$acc loop seq
487# 140 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
488#elif defined(MFC_OpenMP)
489# 140 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
490
491# 140 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
492#endif
493 do i = momxb, momxe
494
495 dyne = dyne + 5.0e-1_wp*q_cons_vf(i)%sf(j, k, l)**2/rho
496
497 end do
498
499 ! calculating the total energy that MUST be preserved throughout the pT- and pTg-relaxation procedures
500 ! at each of the cells. The internal energy is calculated as the total energy minus the kinetic
501 ! energy to preserved its value at sharp interfaces
502 rhoe = q_cons_vf(e_idx)%sf(j, k, l) - dyne
503
504 ! Calling pT-equilibrium for either finishing phase-change module, or as an IC for the pTg-equilibrium
505 ! for this case, MFL cannot be either 0 or 1, so I chose it to be 2
506 call s_infinite_pt_relaxation_k(j, k, l, 2, ps, p_infpt, q_cons_vf, rhoe, ts)
507
508 ! check if pTg-equilibrium is required
509 ! NOTE that NOTHING else needs to be updated OTHER than the individual partial densities
510 ! given the outputs from the pT- and pTg-equilibrium solvers are just p and one of the partial masses
511 ! (pTg- case)
512 if ((relax_model == 6) .and. ((q_cons_vf(lp + contxb - 1)%sf(j, k, l) > mixm*rm) &
513 .and. (q_cons_vf(vp + contxb - 1)%sf(j, k, l) > mixm*rm)) &
514 .and. (ps < pcr) .and. (ts < tcr)) then
515
516 ! Checking if phase change is needed, by checking whether the final solution is either subcoooled
517 ! liquid or overheated vapor.
518
519 ! overheated vapor case
520 ! depleting the mass of liquid
521 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = mixm*rm
522
523 ! transferring the total mass to vapor
524 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
525
526 ! calling pT-equilibrium for overheated vapor, which is MFL = 0
527 call s_infinite_pt_relaxation_k(j, k, l, 0, psov, p_infov, q_cons_vf, rhoe, tsov)
528
529 ! calculating Saturation temperature
530 call s_tsat(psov, tsatov, tsov)
531
532 ! subcooled liquid case
533 ! transferring the total mass to liquid
534 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
535
536 ! depleting the mass of vapor
537 q_cons_vf(vp + contxb - 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
548 ! Assigning pressure
549 ps = psov
550
551 ! Assigning Temperature
552 ts = tsov
553
554 ! correcting the liquid partial density
555 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = mixm*rm
556
557 ! correcting the vapor partial density
558 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
559
560 elseif (tssl < tsatsl) then
561
562 ! Assigning pressure
563 ps = pssl
564
565 ! Assigning Temperature
566 ts = tssl
567
568 ! correcting the liquid partial density
569 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
570
571 ! correcting the vapor partial density
572 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = mixm*rm
573
574 else
575
576 ! returning partial pressures to what they were from the homogeneous solver
577 ! liquid
578 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = m1
579
580 ! vapor
581 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = m2
582
583 ! calling the pTg-equilibrium solver
584 call s_infinite_ptg_relaxation_k(j, k, l, ps, p_infpt, rhoe, q_cons_vf, ts)
585
586 end if
587
588 end if
589
590 ! Calculations AFTER equilibrium
591
592
593# 240 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
594#if defined(MFC_OpenACC)
595# 240 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
596!$acc loop seq
597# 240 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
598#elif defined(MFC_OpenMP)
599# 240 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
600
601# 240 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
602#endif
603 do i = 1, num_fluids
604 ! entropy
605 sk(i) = cvs(i)*log((ts**gs_min(i)) &
606 /((ps + ps_inf(i))**(gs_min(i) - 1.0_wp))) + qvps(i)
607
608 ! enthalpy
609 hk(i) = gs_min(i)*cvs(i)*ts &
610 + qvs(i)
611
612 ! Gibbs-free energy
613 gk(i) = hk(i) - ts*sk(i)
614
615 ! densities
616 rhok(i) = (ps + ps_inf(i)) &
617 /((gs_min(i) - 1)*cvs(i)*ts)
618
619 ! internal energy
620 ek(i) = (ps + gs_min(i) &
621 *ps_inf(i))/(ps + ps_inf(i)) &
622 *cvs(i)*ts + qvs(i)
623 end do
624
625 ! calculating volume fractions, internal energies, and total entropy
626 rhos = 0.0_wp
627
628# 265 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
629#if defined(MFC_OpenACC)
630# 265 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
631!$acc loop seq
632# 265 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
633#elif defined(MFC_OpenMP)
634# 265 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
635
636# 265 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
637#endif
638 do i = 1, num_fluids
639
640 ! volume fractions
641 q_cons_vf(i + advxb - 1)%sf(j, k, l) = q_cons_vf(i + contxb - 1)%sf(j, k, l)/rhok(i)
642
643 ! alpha*rho*e
644 if (model_eqns == 3) then
645 q_cons_vf(i + intxb - 1)%sf(j, k, l) = q_cons_vf(i + contxb - 1)%sf(j, k, l)*ek(i)
646 end if
647
648 ! Total entropy
649 rhos = rhos + q_cons_vf(i + contxb - 1)%sf(j, k, l)*sk(i)
650
651 end do
652 end do
653 end do
654 end do
655
656# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
657
658# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
659#if defined(MFC_OpenACC)
660# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
661!$acc end parallel loop
662# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
663#elif defined(MFC_OpenMP)
664# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
665
666# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
667
668# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
669!$omp end target teams loop
670# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
671#endif
672# 283 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
673
674
675 end subroutine s_infinite_relaxation_k
676
677 !> This auxiliary subroutine is created to activate the pT-equilibrium for N fluids
678 !! @param j generic loop iterator for x direction
679 !! @param k generic loop iterator for y direction
680 !! @param l generic loop iterator for z direction
681 !! @param MFL flag that tells whether the fluid is gas (0), liquid (1), or a mixture (2)
682 !! @param pS equilibrium pressure at the interface
683 !! @param p_infpT stiffness for the participating fluids under pT-equilibrium
684 !! @param q_cons_vf Cell-average conservative variables
685 !! @param rhoe mixture energy
686 !! @param TS equilibrium temperature at the interface
687 subroutine s_infinite_pt_relaxation_k(j, k, l, MFL, pS, p_infpT, q_cons_vf, rhoe, TS)
688
689# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
690#ifdef _CRAYFTN
691# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
692!DIR$ INLINEALWAYS s_infinite_pt_relaxation_k
693# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
694#elif MFC_OpenACC
695# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
696!$acc routine seq
697# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
698#elif MFC_OpenMP
699# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
700
701# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
702
703# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
704!$omp declare target device_type(any)
705# 298 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
706#endif
707# 300 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
708
709 ! initializing variables
710 integer, intent(in) :: j, k, l, MFL
711 real(wp), intent(out) :: pS
712 real(wp), dimension(1:), intent(out) :: p_infpT
713 type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf
714 real(wp), intent(in) :: rhoe
715 real(wp), intent(out) :: TS
716 real(wp) :: gp, gpp, hp, pO, mCP, mQ !< variables for the Newton Solver
717 real(wp) :: p_infpT_sum
718
719 integer :: i, ns !< generic loop iterators
720
721 ! auxiliary variables for the pT-equilibrium solver
722 mcp = 0.0_wp; mq = 0.0_wp; p_infpt_sum = 0._wp
723
724# 315 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
725#if defined(MFC_OpenACC)
726# 315 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
727!$acc loop seq
728# 315 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
729#elif defined(MFC_OpenMP)
730# 315 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
731
732# 315 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
733#endif
734 do i = 1, num_fluids
735 p_infpt(i) = ps_inf(i)
736 p_infpt_sum = p_infpt_sum + abs(p_infpt(i))
737 end do
738 ! Performing tests before initializing the pT-equilibrium
739
740# 321 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
741#if defined(MFC_OpenACC)
742# 321 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
743!$acc loop seq
744# 321 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
745#elif defined(MFC_OpenMP)
746# 321 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
747
748# 321 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
749#endif
750 do i = 1, num_fluids
751
752 ! sum of the total alpha*rho*cp of the system
753 mcp = mcp + q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i)*gs_min(i)
754
755 ! sum of the total alpha*rho*q of the system
756 mq = mq + q_cons_vf(i + contxb - 1)%sf(j, k, l)*qvs(i)
757
758 end do
759
760# 340 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
761
762 ! Checking energy constraint
763 if ((rhoe - mq - minval(p_infpt)) < 0.0_wp) then
764
765 if ((mfl == 0) .or. (mfl == 1)) then
766
767 ! Assigning zero values for mass depletion cases
768 ! pressure
769 ps = 0.0_wp
770
771 ! temperature
772 ts = 0.0_wp
773
774 return
775 end if
776
777 end if
778
779 ! calculating initial estimate for pressure in the pT-relaxation procedure. I will also use this variable to
780 ! iterate over the Newton's solver
781 po = 0.0_wp
782
783 ! Maybe improve this condition afterwards. As long as the initial guess is in between -min(ps_inf)
784 ! and infinity, a solution should be able to be found.
785 ps = 1.0e4_wp
786
787 ! Newton Solver for the pT-equilibrium
788 ns = 0
789 ! change this relative error metric. 1.e4_wp is just arbitrary
790 do while ((abs(ps - po) > palpha_eps) .and. (abs((ps - po)/po) > palpha_eps/1.e4_wp) .or. (ns == 0))
791
792 ! increasing counter
793 ns = ns + 1
794
795 ! updating old pressure
796 po = ps
797
798 ! updating functions used in the Newton's solver
799 gpp = 0.0_wp; gp = 0.0_wp; hp = 0.0_wp
800
801# 379 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
802#if defined(MFC_OpenACC)
803# 379 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
804!$acc loop seq
805# 379 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
806#elif defined(MFC_OpenMP)
807# 379 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
808
809# 379 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
810#endif
811 do i = 1, num_fluids
812
813 gp = gp + (gs_min(i) - 1.0_wp)*q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i) &
814 *(rhoe + ps - mq)/(mcp*(ps + p_infpt(i)))
815
816 gpp = gpp + (gs_min(i) - 1.0_wp)*q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i) &
817 *(p_infpt(i) - rhoe + mq)/(mcp*(ps + p_infpt(i))**2)
818
819 end do
820
821 hp = 1.0_wp/(rhoe + ps - mq) + 1.0_wp/(ps + minval(p_infpt))
822
823 ! updating common pressure for the newton solver
824 ps = po + ((1.0_wp - gp)/gpp)/(1.0_wp - (1.0_wp - gp + abs(1.0_wp - gp)) &
825 /(2.0_wp*gpp)*hp)
826 end do
827
828 ! common temperature
829 ts = (rhoe + ps - mq)/mcp
830
831 end subroutine s_infinite_pt_relaxation_k
832
833 !> This auxiliary subroutine is created to activate the pTg-equilibrium for N fluids under pT
834 !! and 2 fluids under pTg-equilibrium. There is a final common p and T during relaxation
835 !! @param j generic loop iterator for x direction
836 !! @param k generic loop iterator for y direction
837 !! @param l generic loop iterator for z direction
838 !! @param pS equilibrium pressure at the interface
839 !! @param p_infpT stiffness for the participating fluids under pT-equilibrium
840 !! @param rhoe mixture energy
841 !! @param q_cons_vf Cell-average conservative variables
842 !! @param TS equilibrium temperature at the interface
843 subroutine s_infinite_ptg_relaxation_k(j, k, l, pS, p_infpT, rhoe, q_cons_vf, TS)
844
845# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
846#ifdef _CRAYFTN
847# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
848!DIR$ INLINEALWAYS s_infinite_ptg_relaxation_k
849# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
850#elif MFC_OpenACC
851# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
852!$acc routine seq
853# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
854#elif MFC_OpenMP
855# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
856
857# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
858
859# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
860!$omp declare target device_type(any)
861# 413 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
862#endif
863# 415 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
864
865 integer, intent(in) :: j, k, l
866 real(wp), intent(inout) :: pS
867 real(wp), dimension(1:), intent(in) :: p_infpT
868 real(wp), intent(in) :: rhoe
869 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
870 real(wp), intent(inout) :: TS
871# 425 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
872 real(wp), dimension(num_fluids) :: p_infpTg !< stiffness for the participating fluids for pTg-equilibrium
873# 427 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
874 real(wp), dimension(2, 2) :: Jac, InvJac, TJac !< matrices for the Newton Solver
875 real(wp), dimension(2) :: R2D, DeltamP !< residual and correction array
876 real(wp) :: Om ! underrelaxation factor
877 real(wp) :: mCP, mCPD, mCVGP, mCVGP2, mQ, mQD ! auxiliary variables for the pTg-solver
878 real(wp) :: ml, mT, dFdT, dTdm, dTdp
879
880 !< Generic loop iterators
881 integer :: i, ns
882 ! pTg-equilibrium solution procedure
883 ! Newton Solver parameters
884 ! counter
885 ns = 0
886
887 ! Relaxation factor
888 om = 1.0e-3_wp
889
890 p_infptg = p_infpt
891
892 if (((ps < 0.0_wp) .and. ((q_cons_vf(lp + contxb - 1)%sf(j, k, l) &
893 + q_cons_vf(vp + contxb - 1)%sf(j, k, l)) > ((rhoe &
894 - gs_min(lp)*ps_inf(lp)/(gs_min(lp) - 1))/qvs(lp)))) .or. &
895 ((ps >= 0.0_wp) .and. (ps < 1.0e-1_wp))) then
896
897 ! improve this initial condition
898 ps = 1.0e4_wp
899
900 end if
901
902 ! Loop until the solution for F(X) is satisfied
903 ! Check whether I need to use both absolute and relative values
904 ! for the residual, and how to do it adequately.
905 ! Dummy guess to start the pTg-equilibrium problem.
906 ! improve this initial condition
907 r2d(1) = 0.0_wp; r2d(2) = 0.0_wp
908 deltamp(1) = 0.0_wp; deltamp(2) = 0.0_wp
909 do while (((sqrt(r2d(1)**2 + r2d(2)**2) > ptgalpha_eps) &
910 .and. ((sqrt(r2d(1)**2 + r2d(2)**2)/rhoe) > (ptgalpha_eps/1.e6_wp))) &
911 .or. (ns == 0))
912
913 ! Updating counter for the iterative procedure
914 ns = ns + 1
915
916 ! Auxiliary variables to help in the calculation of the residue
917 mcp = 0.0_wp; mcpd = 0.0_wp; mcvgp = 0.0_wp; mcvgp2 = 0.0_wp; mq = 0.0_wp; mqd = 0.0_wp
918 ! Those must be updated through the iterations, as they either depend on
919 ! the partial masses for all fluids, or on the equilibrium pressure
920
921# 473 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
922#if defined(MFC_OpenACC)
923# 473 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
924!$acc loop seq
925# 473 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
926#elif defined(MFC_OpenMP)
927# 473 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
928
929# 473 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
930#endif
931 do i = 1, num_fluids
932
933 ! sum of the total alpha*rho*cp of the system
934 mcp = mcp + q_cons_vf(i + contxb - 1)%sf(j, k, l) &
935 *cvs(i)*gs_min(i)
936
937 ! sum of the total alpha*rho*q of the system
938 mq = mq + q_cons_vf(i + contxb - 1)%sf(j, k, l)*qvs(i)
939
940 ! These auxiliary variables now need to be updated, as the partial densities now
941 ! vary at every iteration
942 if ((i /= lp) .and. (i /= vp)) then
943
944 mcvgp = mcvgp + q_cons_vf(i + contxb - 1)%sf(j, k, l) &
945 *cvs(i)*(gs_min(i) - 1)/(ps + ps_inf(i))
946
947 mcvgp2 = mcvgp2 + q_cons_vf(i + contxb - 1)%sf(j, k, l) &
948 *cvs(i)*(gs_min(i) - 1)/((ps + ps_inf(i))**2)
949
950 mqd = mqd + q_cons_vf(i + contxb - 1)%sf(j, k, l)*qvs(i)
951
952 ! sum of the total alpha*rho*cp of the system
953 mcpd = mcpd + q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i) &
954 *gs_min(i)
955
956 end if
957
958 end do
959
960 ! calculating the (2D) Jacobian Matrix used in the solution of the pTg-quilibrium model
961
962 ! mass of the reacting liquid
963 ml = q_cons_vf(lp + contxb - 1)%sf(j, k, l)
964
965 ! mass of the two participating fluids
966 mt = q_cons_vf(lp + contxb - 1)%sf(j, k, l) &
967 + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
968
969 ts = 1/(mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) &
970 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
971 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
972 + mcvgp)
973
974 dfdt = &
975 -(cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*log(ts) &
976 - (qvps(lp) - qvps(vp)) &
977 + cvs(lp)*(gs_min(lp) - 1)*log(ps + ps_inf(lp)) &
978 - cvs(vp)*(gs_min(vp) - 1)*log(ps + ps_inf(vp))
979
980 dtdm = -(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
981 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))*ts**2
982
983 dtdp = (mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2 &
984 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp))**2 &
985 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2) &
986 + mcvgp2)*ts**2
987
988 ! F = (F1,F2) is the function whose roots we are looking for
989 ! x = (m1, p) are the independent variables. m1 = mass of the first participant fluid, p = pressure
990 ! F1 = 0 is the Gibbs free energy quality
991 ! F2 = 0 is the enforcement of the thermodynamic (total - kinectic) energy
992 ! dF1dm
993 jac(1, 1) = dfdt*dtdm
994
995 ! dF1dp
996 jac(1, 2) = dfdt*dtdp + ts &
997 *(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
998 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))
999
1000 ! dF2dm
1001 jac(2, 1) = (qvs(vp) - qvs(lp) &
1002 + (cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) &
1003 /(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1004 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1005 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp) &
1006 - (ml*(cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) &
1007 - mt*cvs(vp)*gs_min(vp) - mcpd) &
1008 *(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1009 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1010 /((ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1011 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1012 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp)**2))/1
1013 ! dF2dp
1014 jac(2, 2) = (1 + (ml*(cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) &
1015 - mt*cvs(vp)*gs_min(vp) - mcpd) &
1016 *(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp))**2 &
1017 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2) &
1018 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2 + mcvgp2) &
1019 /(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1020 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1021 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp)**2)/1
1022
1023 ! intermediate elements of J^{-1}
1024 invjac(1, 1) = jac(2, 2)
1025 invjac(1, 2) = -1.0_wp*jac(1, 2)
1026 invjac(2, 1) = -1.0_wp*jac(2, 1)
1027 invjac(2, 2) = jac(1, 1)
1028
1029 ! elements of J^{T}
1030 tjac(1, 1) = jac(1, 1)
1031 tjac(1, 2) = jac(2, 1)
1032 tjac(2, 1) = jac(1, 2)
1033 tjac(2, 2) = jac(2, 2)
1034
1035 ! dividing by det(J)
1036 invjac = invjac/(jac(1, 1)*jac(2, 2) - jac(1, 2)*jac(2, 1))
1037
1038 ! calculating correction array for Newton's method
1039 deltamp = -1.0_wp*(matmul(invjac, r2d))
1040
1041 ! updating two reacting 'masses'. Recall that inert 'masses' do not change during the phase change
1042 ! liquid
1043 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = q_cons_vf(lp + contxb - 1)%sf(j, k, l) + om*deltamp(1)
1044
1045 ! gas
1046 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = q_cons_vf(vp + contxb - 1)%sf(j, k, l) - om*deltamp(1)
1047
1048 ! updating pressure
1049 ps = ps + om*deltamp(2)
1050
1051 ! calculating residuals, which are (i) the difference between the Gibbs Free energy of the gas and the liquid
1052 ! and (ii) the energy before and after the phase-change process.
1053
1054 ! mass of the reacting liquid
1055 ml = q_cons_vf(lp + contxb - 1)%sf(j, k, l)
1056
1057 ! mass of the two participating fluids
1058 mt = q_cons_vf(lp + contxb - 1)%sf(j, k, l) &
1059 + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
1060
1061 ts = 1/(mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) &
1062 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1063 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1064 + mcvgp)
1065
1066 ! Gibbs Free Energy Equality condition (DG)
1067 r2d(1) = ts*((cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp)) &
1068 *(1 - log(ts)) - (qvps(lp) - qvps(vp)) &
1069 + cvs(lp)*(gs_min(lp) - 1)*log(ps + ps_inf(lp)) &
1070 - cvs(vp)*(gs_min(vp) - 1)*log(ps + ps_inf(vp))) &
1071 + qvs(lp) - qvs(vp)
1072
1073 ! Constant Energy Process condition (DE)
1074 r2d(2) = (rhoe + ps &
1075 + ml*(qvs(vp) - qvs(lp)) - mt*qvs(vp) - mqd &
1076 + (ml*(gs_min(vp)*cvs(vp) - gs_min(lp)*cvs(lp)) &
1077 - mt*gs_min(vp)*cvs(vp) - mcpd) &
1078 /(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1079 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1080 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp))/1
1081
1082 end do
1083
1084 ! common temperature
1085 ts = (rhoe + ps - mq)/mcp
1086 end subroutine s_infinite_ptg_relaxation_k
1087
1088 !> This auxiliary subroutine corrects the partial densities of the REACTING fluids in case one of them is negative
1089 !! but their sum is positive. Inert phases are not corrected at this moment
1090 !! @param MCT partial density correction parameter
1091 !! @param q_cons_vf Cell-average conservative variables
1092 !! @param rM sum of the reacting masses
1093 !! @param j generic loop iterator for x direction
1094 !! @param k generic loop iterator for y direction
1095 !! @param l generic loop iterator for z direction
1096 subroutine s_correct_partial_densities(MCT, q_cons_vf, rM, j, k, l)
1097
1098# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1099#ifdef _CRAYFTN
1100# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1101!DIR$ INLINEALWAYS s_correct_partial_densities
1102# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1103#elif MFC_OpenACC
1104# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1105!$acc routine seq
1106# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1107#elif MFC_OpenMP
1108# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1109
1110# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1111
1112# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1113!$omp declare target device_type(any)
1114# 640 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1115#endif
1116# 642 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1117
1118 !> @name variables for the correction of the reacting partial densities
1119 !> @{
1120 real(wp), intent(out) :: mct
1121 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
1122 real(wp), intent(inout) :: rm
1123 integer, intent(in) :: j, k, l
1124 !> @}
1125 if (rm < 0.0_wp) then
1126
1127 if ((q_cons_vf(lp + contxb - 1)%sf(j, k, l) >= -1.0_wp*mixm) .and. &
1128 (q_cons_vf(vp + contxb - 1)%sf(j, k, l) >= -1.0_wp*mixm)) then
1129
1130 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = 0.0_wp
1131
1132 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = 0.0_wp
1133
1134 rm = q_cons_vf(lp + contxb - 1)%sf(j, k, l) + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
1135
1136 end if
1137
1138 end if
1139
1140 ! Defining the correction in terms of an absolute value might not be the best practice.
1141 ! Maybe a good way to do this is to partition the partial densities, giving a small percentage of the total reacting density
1142 mct = 2*mixm
1143
1144 ! correcting the partial densities of the reacting fluids. What to do for the nonreacting ones?
1145 if (q_cons_vf(lp + contxb - 1)%sf(j, k, l) < 0.0_wp) then
1146
1147 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = mct*rm
1148
1149 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = (1.0_wp - mct)*rm
1150
1151 elseif (q_cons_vf(vp + contxb - 1)%sf(j, k, l) < 0.0_wp) then
1152
1153 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = (1.0_wp - mct)*rm
1154
1155 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = mct*rm
1156
1157 end if
1158 end subroutine s_correct_partial_densities
1159
1160 !> This auxiliary subroutine finds the Saturation temperature for a given
1161 !! saturation pressure through a newton solver
1162 !! @param pSat Saturation Pressure
1163 !! @param TSat Saturation Temperature
1164 !! @param TSIn equilibrium Temperature
1165 elemental subroutine s_tsat(pSat, TSat, TSIn)
1166
1167# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1168#ifdef _CRAYFTN
1169# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1170!DIR$ INLINEALWAYS s_TSat
1171# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1172#elif MFC_OpenACC
1173# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1174!$acc routine seq
1175# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1176#elif MFC_OpenMP
1177# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1178
1179# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1180
1181# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1182!$omp declare target device_type(any)
1183# 691 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1184#endif
1185# 693 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1186
1187 real(wp), intent(in) :: psat
1188 real(wp), intent(out) :: tsat
1189 real(wp), intent(in) :: tsin
1190
1191 real(wp) :: dfdt, ft, om !< auxiliary variables
1192
1193 ! Generic loop iterators
1194 integer :: ns
1195
1196 if ((f_approx_equal(psat, 0.0_wp)) .and. (f_approx_equal(tsin, 0.0_wp))) then
1197
1198 ! assigning Saturation temperature
1199 tsat = 0.0_wp
1200
1201 else
1202
1203 ! calculating initial estimate for temperature in the TSat procedure. I will also use this variable to
1204 ! iterate over the Newton's solver
1205 tsat = tsin
1206
1207 ! iteration counter
1208 ns = 0
1209
1210 ! underrelaxation factor
1211 om = 1.0e-3_wp
1212 do while ((abs(ft) > ptgalpha_eps) .or. (ns == 0))
1213 ! increasing counter
1214 ns = ns + 1
1215
1216 ! calculating residual
1217 ft = tsat*((cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp)) &
1218 *(1 - log(tsat)) - (qvps(lp) - qvps(vp)) &
1219 + cvs(lp)*(gs_min(lp) - 1)*log(psat + ps_inf(lp)) &
1220 - cvs(vp)*(gs_min(vp) - 1)*log(psat + ps_inf(vp))) &
1221 + qvs(lp) - qvs(vp)
1222
1223 ! calculating the jacobian
1224 dfdt = &
1225 -(cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*log(tsat) &
1226 - (qvps(lp) - qvps(vp)) &
1227 + cvs(lp)*(gs_min(lp) - 1)*log(psat + ps_inf(lp)) &
1228 - cvs(vp)*(gs_min(vp) - 1)*log(psat + ps_inf(vp))
1229
1230 ! updating saturation temperature
1231 tsat = tsat - om*ft/dfdt
1232
1233 end do
1234
1235 end if
1236
1237 end subroutine s_tsat
1238
1239 !> This subroutine finalizes the phase change module
1242
1243#endif
1244
1245end 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
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.
integer num_fluids
Number of different fluids present in the flow.
real(wp) ptgalpha_eps
trigger parameter for the pTg relaxation procedure, phase change model
integer relax_model
Relax Model.
integer model_eqns
Multicomponent flow model.
integer e_idx
Index of total energy equation.
real(wp) palpha_eps
trigger parameter for the p relaxation procedure, phase change model
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
logical elemental function, public f_approx_equal(a, b, tol_input)
This procedure checks if two floating point numbers of wp are within tolerance.
Broadcasts user inputs and decomposes the domain across MPI ranks for pre-processing.
Phase transition relaxation solvers for liquid-vapor flows with cavitation and boiling.
impure subroutine, public s_finalize_relaxation_solver_module
This subroutine finalizes the phase change module.
subroutine, public s_infinite_relaxation_k(q_cons_vf)
This subroutine is created to activate either the pT- (N fluids) or the pTg-equilibrium (2 fluids for...
elemental subroutine s_tsat(psat, tsat, tsin)
This auxiliary subroutine finds the Saturation temperature for a given saturation pressure through a ...
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)
This auxiliary subroutine is created to activate the pT-equilibrium for N fluids.
impure subroutine, public s_relaxation_solver(q_cons_vf)
This subroutine should dispatch to the correct relaxation solver based some parameter....
real(wp), parameter tcr
Critical water temperature.
integer, parameter max_iter
max # of iterations
impure subroutine, public s_initialize_phasechange_module
The purpose of this subroutine is to initialize the phase change module by setting the parameters nee...
real(wp), parameter mixm
threshold for 'mixture cell'. If Y < mixM, phase change does not happen
subroutine s_infinite_ptg_relaxation_k(j, k, l, ps, p_infpt, rhoe, q_cons_vf, ts)
This auxiliary subroutine is created to activate the pTg-equilibrium for N fluids under pT and 2 flui...
real(wp), parameter pcr
Critical water pressure.
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).