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