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# 104 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
244
245# 119 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
248
249# 143 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
250
251# 171 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253# 182 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
254
255# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
256
257# 204 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259# 214 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261# 225 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
262
263# 236 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265# 246 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267# 252 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
268
269# 258 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271# 264 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273# 270 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
274
275# 272 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276# 273 "/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#ifdef _CRAYFTN
420#ifdef MFC_OpenACC
421 ! CCE 19 IPA workaround: prevent bring_routine_resident SIGSEGV
422 !DIR$ NOINLINE s_infinite_pt_relaxation_k
423 !DIR$ NOINLINE s_infinite_ptg_relaxation_k
424 !DIR$ NOINLINE s_correct_partial_densities
425 !DIR$ NOINLINE s_TSat
426#endif
427#endif
428
429 ! starting equilibrium solver
430
431# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
432
433# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
434#if defined(MFC_OpenACC)
435# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
436!$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)
437# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
438#elif defined(MFC_OpenMP)
439# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
440
441# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
442
443# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
444
445# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
446!$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)
447# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
448#endif
449# 118 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
450
451 do j = 0, m
452 do k = 0, n
453 do l = 0, p
454
455 rho = 0.0_wp; tvf = 0.0_wp
456
457# 124 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
458#if defined(MFC_OpenACC)
459# 124 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
460!$acc loop seq
461# 124 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
462#elif defined(MFC_OpenMP)
463# 124 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
464
465# 124 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
466#endif
467 do i = 1, num_fluids
468
469 ! Mixture density
470 rho = rho + q_cons_vf(i + contxb - 1)%sf(j, k, l)
471
472 ! Total Volume Fraction
473 tvf = tvf + q_cons_vf(i + advxb - 1)%sf(j, k, l)
474
475 end do
476
477 ! calculating the total reacting mass for the phase change process. By hypothesis, this should not change
478 ! throughout the phase-change process.
479 rm = q_cons_vf(lp + contxb - 1)%sf(j, k, l) + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
480
481 ! correcting negative (reacting) mass fraction values in case they happen
482 call s_correct_partial_densities(mct, q_cons_vf, rm, j, k, l)
483
484 ! fixing m1 and m2 AFTER correcting the partial densities. Note that these values must be stored for the phase
485 ! change process that will happen a posteriori
486 m1 = q_cons_vf(lp + contxb - 1)%sf(j, k, l)
487
488 m2 = q_cons_vf(vp + contxb - 1)%sf(j, k, l)
489
490 ! kinetic energy as an auxiliary variable to the calculation of the total internal energy
491 dyne = 0.0_wp
492
493# 150 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
494#if defined(MFC_OpenACC)
495# 150 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
496!$acc loop seq
497# 150 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
498#elif defined(MFC_OpenMP)
499# 150 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
500
501# 150 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
502#endif
503 do i = momxb, momxe
504
505 dyne = dyne + 5.0e-1_wp*q_cons_vf(i)%sf(j, k, l)**2/rho
506
507 end do
508
509 ! calculating the total energy that MUST be preserved throughout the pT- and pTg-relaxation procedures
510 ! at each of the cells. The internal energy is calculated as the total energy minus the kinetic
511 ! energy to preserved its value at sharp interfaces
512 rhoe = q_cons_vf(e_idx)%sf(j, k, l) - dyne
513
514 ! Calling pT-equilibrium for either finishing phase-change module, or as an IC for the pTg-equilibrium
515 ! for this case, MFL cannot be either 0 or 1, so I chose it to be 2
516 call s_infinite_pt_relaxation_k(j, k, l, 2, ps, p_infpt, q_cons_vf, rhoe, ts)
517
518 ! check if pTg-equilibrium is required
519 ! NOTE that NOTHING else needs to be updated OTHER than the individual partial densities
520 ! given the outputs from the pT- and pTg-equilibrium solvers are just p and one of the partial masses
521 ! (pTg- case)
522 if ((relax_model == 6) .and. ((q_cons_vf(lp + contxb - 1)%sf(j, k, l) > mixm*rm) &
523 .and. (q_cons_vf(vp + contxb - 1)%sf(j, k, l) > mixm*rm)) &
524 .and. (ps < pcr) .and. (ts < tcr)) then
525
526 ! Checking if phase change is needed, by checking whether the final solution is either subcoooled
527 ! liquid or overheated vapor.
528
529 ! overheated vapor case
530 ! depleting the mass of liquid
531 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = mixm*rm
532
533 ! transferring the total mass to vapor
534 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
535
536 ! calling pT-equilibrium for overheated vapor, which is MFL = 0
537 call s_infinite_pt_relaxation_k(j, k, l, 0, psov, p_infov, q_cons_vf, rhoe, tsov)
538
539 ! calculating Saturation temperature
540 call s_tsat(psov, tsatov, tsov)
541
542 ! subcooled liquid case
543 ! transferring the total mass to liquid
544 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
545
546 ! depleting the mass of vapor
547 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = mixm*rm
548
549 ! calling pT-equilibrium for subcooled liquid, which is MFL = 1
550 call s_infinite_pt_relaxation_k(j, k, l, 1, pssl, p_infsl, q_cons_vf, rhoe, tssl)
551
552 ! calculating Saturation temperature
553 call s_tsat(pssl, tsatsl, tssl)
554
555 ! checking the conditions for overheated vapor and subcooled liquide
556 if (tsov > tsatov) then
557
558 ! Assigning pressure
559 ps = psov
560
561 ! Assigning Temperature
562 ts = tsov
563
564 ! correcting the liquid partial density
565 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = mixm*rm
566
567 ! correcting the vapor partial density
568 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
569
570 elseif (tssl < tsatsl) then
571
572 ! Assigning pressure
573 ps = pssl
574
575 ! Assigning Temperature
576 ts = tssl
577
578 ! correcting the liquid partial density
579 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = (1.0_wp - mixm)*rm
580
581 ! correcting the vapor partial density
582 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = mixm*rm
583
584 else
585
586 ! returning partial pressures to what they were from the homogeneous solver
587 ! liquid
588 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = m1
589
590 ! vapor
591 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = m2
592
593 ! calling the pTg-equilibrium solver
594 call s_infinite_ptg_relaxation_k(j, k, l, ps, p_infpt, rhoe, q_cons_vf, ts)
595
596 end if
597
598 end if
599
600 ! Calculations AFTER equilibrium
601
602
603# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
604#if defined(MFC_OpenACC)
605# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
606!$acc loop seq
607# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
608#elif defined(MFC_OpenMP)
609# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
610
611# 250 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
612#endif
613 do i = 1, num_fluids
614 ! entropy
615 sk(i) = cvs(i)*log((ts**gs_min(i)) &
616 /((ps + ps_inf(i))**(gs_min(i) - 1.0_wp))) + qvps(i)
617
618 ! enthalpy
619 hk(i) = gs_min(i)*cvs(i)*ts &
620 + qvs(i)
621
622 ! Gibbs-free energy
623 gk(i) = hk(i) - ts*sk(i)
624
625 ! densities
626 rhok(i) = (ps + ps_inf(i)) &
627 /((gs_min(i) - 1)*cvs(i)*ts)
628
629 ! internal energy
630 ek(i) = (ps + gs_min(i) &
631 *ps_inf(i))/(ps + ps_inf(i)) &
632 *cvs(i)*ts + qvs(i)
633 end do
634
635 ! calculating volume fractions, internal energies, and total entropy
636 rhos = 0.0_wp
637
638# 275 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
639#if defined(MFC_OpenACC)
640# 275 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
641!$acc loop seq
642# 275 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
643#elif defined(MFC_OpenMP)
644# 275 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
645
646# 275 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
647#endif
648 do i = 1, num_fluids
649
650 ! volume fractions
651 q_cons_vf(i + advxb - 1)%sf(j, k, l) = q_cons_vf(i + contxb - 1)%sf(j, k, l)/rhok(i)
652
653 ! alpha*rho*e
654 if (model_eqns == 3) then
655 q_cons_vf(i + intxb - 1)%sf(j, k, l) = q_cons_vf(i + contxb - 1)%sf(j, k, l)*ek(i)
656 end if
657
658 ! Total entropy
659 rhos = rhos + q_cons_vf(i + contxb - 1)%sf(j, k, l)*sk(i)
660
661 end do
662 end do
663 end do
664 end do
665
666# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
667
668# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
669#if defined(MFC_OpenACC)
670# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
671!$acc end parallel loop
672# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
673#elif defined(MFC_OpenMP)
674# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
675
676# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
677
678# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
679!$omp end target teams loop
680# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
681#endif
682# 293 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
683
684
685 end subroutine s_infinite_relaxation_k
686
687 !> This auxiliary subroutine is created to activate the pT-equilibrium for N fluids
688 !! @param j generic loop iterator for x direction
689 !! @param k generic loop iterator for y direction
690 !! @param l generic loop iterator for z direction
691 !! @param MFL flag that tells whether the fluid is gas (0), liquid (1), or a mixture (2)
692 !! @param pS equilibrium pressure at the interface
693 !! @param p_infpT stiffness for the participating fluids under pT-equilibrium
694 !! @param q_cons_vf Cell-average conservative variables
695 !! @param rhoe mixture energy
696 !! @param TS equilibrium temperature at the interface
697 subroutine s_infinite_pt_relaxation_k(j, k, l, MFL, pS, p_infpT, q_cons_vf, rhoe, TS)
698
699# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
700#ifdef _CRAYFTN
701# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
702#if MFC_OpenACC
703# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
704!$acc routine seq
705# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
706#elif MFC_OpenMP
707# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
708
709# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
710
711# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
712!$omp declare target device_type(any)
713# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
714#else
715# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
716!DIR$ NOINLINE s_infinite_pt_relaxation_k
717# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
718#endif
719# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
720#elif MFC_OpenACC
721# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
722!$acc routine seq
723# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
724#elif MFC_OpenMP
725# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
726
727# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
728
729# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
730!$omp declare target device_type(any)
731# 308 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
732#endif
733# 310 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
734
735 ! initializing variables
736 integer, intent(in) :: j, k, l, MFL
737 real(wp), intent(out) :: pS
738 real(wp), dimension(1:), intent(out) :: p_infpT
739 type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf
740 real(wp), intent(in) :: rhoe
741 real(wp), intent(out) :: TS
742 real(wp) :: gp, gpp, hp, pO, mCP, mQ !< variables for the Newton Solver
743 real(wp) :: p_infpT_sum
744
745 integer :: i, ns !< generic loop iterators
746
747 ! auxiliary variables for the pT-equilibrium solver
748 mcp = 0.0_wp; mq = 0.0_wp; p_infpt_sum = 0._wp
749
750# 325 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
751#if defined(MFC_OpenACC)
752# 325 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
753!$acc loop seq
754# 325 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
755#elif defined(MFC_OpenMP)
756# 325 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
757
758# 325 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
759#endif
760 do i = 1, num_fluids
761 p_infpt(i) = ps_inf(i)
762 p_infpt_sum = p_infpt_sum + abs(p_infpt(i))
763 end do
764 ! Performing tests before initializing the pT-equilibrium
765
766# 331 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
767#if defined(MFC_OpenACC)
768# 331 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
769!$acc loop seq
770# 331 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
771#elif defined(MFC_OpenMP)
772# 331 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
773
774# 331 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
775#endif
776 do i = 1, num_fluids
777
778 ! sum of the total alpha*rho*cp of the system
779 mcp = mcp + q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i)*gs_min(i)
780
781 ! sum of the total alpha*rho*q of the system
782 mq = mq + q_cons_vf(i + contxb - 1)%sf(j, k, l)*qvs(i)
783
784 end do
785
786# 350 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
787
788 ! Checking energy constraint
789 if ((rhoe - mq - minval(p_infpt)) < 0.0_wp) then
790
791 if ((mfl == 0) .or. (mfl == 1)) then
792
793 ! Assigning zero values for mass depletion cases
794 ! pressure
795 ps = 0.0_wp
796
797 ! temperature
798 ts = 0.0_wp
799
800 return
801 end if
802
803 end if
804
805 ! calculating initial estimate for pressure in the pT-relaxation procedure. I will also use this variable to
806 ! iterate over the Newton's solver
807 po = 0.0_wp
808
809 ! Maybe improve this condition afterwards. As long as the initial guess is in between -min(ps_inf)
810 ! and infinity, a solution should be able to be found.
811 ps = 1.0e4_wp
812
813 ! Newton Solver for the pT-equilibrium
814 ns = 0
815 ! change this relative error metric. 1.e4_wp is just arbitrary
816 do while ((abs(ps - po) > palpha_eps) .and. (abs((ps - po)/po) > palpha_eps/1.e4_wp) .or. (ns == 0))
817
818 ! increasing counter
819 ns = ns + 1
820
821 ! updating old pressure
822 po = ps
823
824 ! updating functions used in the Newton's solver
825 gpp = 0.0_wp; gp = 0.0_wp; hp = 0.0_wp
826
827# 389 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
828#if defined(MFC_OpenACC)
829# 389 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
830!$acc loop seq
831# 389 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
832#elif defined(MFC_OpenMP)
833# 389 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
834
835# 389 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
836#endif
837 do i = 1, num_fluids
838
839 gp = gp + (gs_min(i) - 1.0_wp)*q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i) &
840 *(rhoe + ps - mq)/(mcp*(ps + p_infpt(i)))
841
842 gpp = gpp + (gs_min(i) - 1.0_wp)*q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i) &
843 *(p_infpt(i) - rhoe + mq)/(mcp*(ps + p_infpt(i))**2)
844
845 end do
846
847 hp = 1.0_wp/(rhoe + ps - mq) + 1.0_wp/(ps + minval(p_infpt))
848
849 ! updating common pressure for the newton solver
850 ps = po + ((1.0_wp - gp)/gpp)/(1.0_wp - (1.0_wp - gp + abs(1.0_wp - gp)) &
851 /(2.0_wp*gpp)*hp)
852 end do
853
854 ! common temperature
855 ts = (rhoe + ps - mq)/mcp
856
857 end subroutine s_infinite_pt_relaxation_k
858
859 !> This auxiliary subroutine is created to activate the pTg-equilibrium for N fluids under pT
860 !! and 2 fluids under pTg-equilibrium. There is a final common p and T during relaxation
861 !! @param j generic loop iterator for x direction
862 !! @param k generic loop iterator for y direction
863 !! @param l generic loop iterator for z direction
864 !! @param pS equilibrium pressure at the interface
865 !! @param p_infpT stiffness for the participating fluids under pT-equilibrium
866 !! @param rhoe mixture energy
867 !! @param q_cons_vf Cell-average conservative variables
868 !! @param TS equilibrium temperature at the interface
869 subroutine s_infinite_ptg_relaxation_k(j, k, l, pS, p_infpT, rhoe, q_cons_vf, TS)
870
871# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
872#ifdef _CRAYFTN
873# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
874#if MFC_OpenACC
875# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
876!$acc routine seq
877# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
878#elif MFC_OpenMP
879# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
880
881# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
882
883# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
884!$omp declare target device_type(any)
885# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
886#else
887# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
888!DIR$ NOINLINE s_infinite_ptg_relaxation_k
889# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
890#endif
891# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
892#elif MFC_OpenACC
893# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
894!$acc routine seq
895# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
896#elif MFC_OpenMP
897# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
898
899# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
900
901# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
902!$omp declare target device_type(any)
903# 423 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
904#endif
905# 425 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
906
907 integer, intent(in) :: j, k, l
908 real(wp), intent(inout) :: pS
909 real(wp), dimension(1:), intent(in) :: p_infpT
910 real(wp), intent(in) :: rhoe
911 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
912 real(wp), intent(inout) :: TS
913# 435 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
914 real(wp), dimension(num_fluids) :: p_infpTg !< stiffness for the participating fluids for pTg-equilibrium
915# 437 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
916 real(wp), dimension(2, 2) :: Jac, InvJac, TJac !< matrices for the Newton Solver
917 real(wp), dimension(2) :: R2D, DeltamP !< residual and correction array
918 real(wp) :: Om ! underrelaxation factor
919 real(wp) :: mCP, mCPD, mCVGP, mCVGP2, mQ, mQD ! auxiliary variables for the pTg-solver
920 real(wp) :: ml, mT, dFdT, dTdm, dTdp
921
922 !< Generic loop iterators
923 integer :: i, ns
924 ! pTg-equilibrium solution procedure
925 ! Newton Solver parameters
926 ! counter
927 ns = 0
928
929 ! Relaxation factor
930 om = 1.0e-3_wp
931
932 p_infptg = p_infpt
933
934 if (((ps < 0.0_wp) .and. ((q_cons_vf(lp + contxb - 1)%sf(j, k, l) &
935 + q_cons_vf(vp + contxb - 1)%sf(j, k, l)) > ((rhoe &
936 - gs_min(lp)*ps_inf(lp)/(gs_min(lp) - 1))/qvs(lp)))) .or. &
937 ((ps >= 0.0_wp) .and. (ps < 1.0e-1_wp))) then
938
939 ! improve this initial condition
940 ps = 1.0e4_wp
941
942 end if
943
944 ! Loop until the solution for F(X) is satisfied
945 ! Check whether I need to use both absolute and relative values
946 ! for the residual, and how to do it adequately.
947 ! Dummy guess to start the pTg-equilibrium problem.
948 ! improve this initial condition
949 r2d(1) = 0.0_wp; r2d(2) = 0.0_wp
950 deltamp(1) = 0.0_wp; deltamp(2) = 0.0_wp
951 do while (((sqrt(r2d(1)**2 + r2d(2)**2) > ptgalpha_eps) &
952 .and. ((sqrt(r2d(1)**2 + r2d(2)**2)/rhoe) > (ptgalpha_eps/1.e6_wp))) &
953 .or. (ns == 0))
954
955 ! Updating counter for the iterative procedure
956 ns = ns + 1
957
958 ! Auxiliary variables to help in the calculation of the residue
959 mcp = 0.0_wp; mcpd = 0.0_wp; mcvgp = 0.0_wp; mcvgp2 = 0.0_wp; mq = 0.0_wp; mqd = 0.0_wp
960 ! Those must be updated through the iterations, as they either depend on
961 ! the partial masses for all fluids, or on the equilibrium pressure
962
963# 483 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
964#if defined(MFC_OpenACC)
965# 483 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
966!$acc loop seq
967# 483 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
968#elif defined(MFC_OpenMP)
969# 483 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
970
971# 483 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
972#endif
973 do i = 1, num_fluids
974
975 ! sum of the total alpha*rho*cp of the system
976 mcp = mcp + q_cons_vf(i + contxb - 1)%sf(j, k, l) &
977 *cvs(i)*gs_min(i)
978
979 ! sum of the total alpha*rho*q of the system
980 mq = mq + q_cons_vf(i + contxb - 1)%sf(j, k, l)*qvs(i)
981
982 ! These auxiliary variables now need to be updated, as the partial densities now
983 ! vary at every iteration
984 if ((i /= lp) .and. (i /= vp)) then
985
986 mcvgp = mcvgp + q_cons_vf(i + contxb - 1)%sf(j, k, l) &
987 *cvs(i)*(gs_min(i) - 1)/(ps + ps_inf(i))
988
989 mcvgp2 = mcvgp2 + q_cons_vf(i + contxb - 1)%sf(j, k, l) &
990 *cvs(i)*(gs_min(i) - 1)/((ps + ps_inf(i))**2)
991
992 mqd = mqd + q_cons_vf(i + contxb - 1)%sf(j, k, l)*qvs(i)
993
994 ! sum of the total alpha*rho*cp of the system
995 mcpd = mcpd + q_cons_vf(i + contxb - 1)%sf(j, k, l)*cvs(i) &
996 *gs_min(i)
997
998 end if
999
1000 end do
1001
1002 ! calculating the (2D) Jacobian Matrix used in the solution of the pTg-quilibrium model
1003
1004 ! mass of the reacting liquid
1005 ml = q_cons_vf(lp + contxb - 1)%sf(j, k, l)
1006
1007 ! mass of the two participating fluids
1008 mt = q_cons_vf(lp + contxb - 1)%sf(j, k, l) &
1009 + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
1010
1011 ts = 1/(mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) &
1012 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1013 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1014 + mcvgp)
1015
1016 dfdt = &
1017 -(cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*log(ts) &
1018 - (qvps(lp) - qvps(vp)) &
1019 + cvs(lp)*(gs_min(lp) - 1)*log(ps + ps_inf(lp)) &
1020 - cvs(vp)*(gs_min(vp) - 1)*log(ps + ps_inf(vp))
1021
1022 dtdm = -(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1023 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))*ts**2
1024
1025 dtdp = (mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2 &
1026 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp))**2 &
1027 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2) &
1028 + mcvgp2)*ts**2
1029
1030 ! F = (F1,F2) is the function whose roots we are looking for
1031 ! x = (m1, p) are the independent variables. m1 = mass of the first participant fluid, p = pressure
1032 ! F1 = 0 is the Gibbs free energy quality
1033 ! F2 = 0 is the enforcement of the thermodynamic (total - kinectic) energy
1034 ! dF1dm
1035 jac(1, 1) = dfdt*dtdm
1036
1037 ! dF1dp
1038 jac(1, 2) = dfdt*dtdp + ts &
1039 *(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1040 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)))
1041
1042 ! dF2dm
1043 jac(2, 1) = (qvs(vp) - qvs(lp) &
1044 + (cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) &
1045 /(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1046 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1047 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp) &
1048 - (ml*(cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) &
1049 - mt*cvs(vp)*gs_min(vp) - mcpd) &
1050 *(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1051 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1052 /((ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1053 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1054 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp)**2))/1
1055 ! dF2dp
1056 jac(2, 2) = (1 + (ml*(cvs(vp)*gs_min(vp) - cvs(lp)*gs_min(lp)) &
1057 - mt*cvs(vp)*gs_min(vp) - mcpd) &
1058 *(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp))**2 &
1059 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2) &
1060 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))**2 + mcvgp2) &
1061 /(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1062 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1063 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp)**2)/1
1064
1065 ! intermediate elements of J^{-1}
1066 invjac(1, 1) = jac(2, 2)
1067 invjac(1, 2) = -1.0_wp*jac(1, 2)
1068 invjac(2, 1) = -1.0_wp*jac(2, 1)
1069 invjac(2, 2) = jac(1, 1)
1070
1071 ! elements of J^{T}
1072 tjac(1, 1) = jac(1, 1)
1073 tjac(1, 2) = jac(2, 1)
1074 tjac(2, 1) = jac(1, 2)
1075 tjac(2, 2) = jac(2, 2)
1076
1077 ! dividing by det(J)
1078 invjac = invjac/(jac(1, 1)*jac(2, 2) - jac(1, 2)*jac(2, 1))
1079
1080 ! calculating correction array for Newton's method
1081 deltamp(1) = -1.0_wp*(invjac(1, 1)*r2d(1) + invjac(1, 2)*r2d(2))
1082 deltamp(2) = -1.0_wp*(invjac(2, 1)*r2d(1) + invjac(2, 2)*r2d(2))
1083
1084 ! updating two reacting 'masses'. Recall that inert 'masses' do not change during the phase change
1085 ! liquid
1086 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = q_cons_vf(lp + contxb - 1)%sf(j, k, l) + om*deltamp(1)
1087
1088 ! gas
1089 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = q_cons_vf(vp + contxb - 1)%sf(j, k, l) - om*deltamp(1)
1090
1091 ! updating pressure
1092 ps = ps + om*deltamp(2)
1093
1094 ! calculating residuals, which are (i) the difference between the Gibbs Free energy of the gas and the liquid
1095 ! and (ii) the energy before and after the phase-change process.
1096
1097 ! mass of the reacting liquid
1098 ml = q_cons_vf(lp + contxb - 1)%sf(j, k, l)
1099
1100 ! mass of the two participating fluids
1101 mt = q_cons_vf(lp + contxb - 1)%sf(j, k, l) &
1102 + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
1103
1104 ts = 1/(mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) &
1105 + ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1106 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1107 + mcvgp)
1108
1109 ! Gibbs Free Energy Equality condition (DG)
1110 r2d(1) = ts*((cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp)) &
1111 *(1 - log(ts)) - (qvps(lp) - qvps(vp)) &
1112 + cvs(lp)*(gs_min(lp) - 1)*log(ps + ps_inf(lp)) &
1113 - cvs(vp)*(gs_min(vp) - 1)*log(ps + ps_inf(vp))) &
1114 + qvs(lp) - qvs(vp)
1115
1116 ! Constant Energy Process condition (DE)
1117 r2d(2) = (rhoe + ps &
1118 + ml*(qvs(vp) - qvs(lp)) - mt*qvs(vp) - mqd &
1119 + (ml*(gs_min(vp)*cvs(vp) - gs_min(lp)*cvs(lp)) &
1120 - mt*gs_min(vp)*cvs(vp) - mcpd) &
1121 /(ml*(cvs(lp)*(gs_min(lp) - 1)/(ps + ps_inf(lp)) &
1122 - cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp))) &
1123 + mt*cvs(vp)*(gs_min(vp) - 1)/(ps + ps_inf(vp)) + mcvgp))/1
1124
1125 end do
1126
1127 ! common temperature
1128 ts = (rhoe + ps - mq)/mcp
1129 end subroutine s_infinite_ptg_relaxation_k
1130
1131 !> This auxiliary subroutine corrects the partial densities of the REACTING fluids in case one of them is negative
1132 !! but their sum is positive. Inert phases are not corrected at this moment
1133 !! @param MCT partial density correction parameter
1134 !! @param q_cons_vf Cell-average conservative variables
1135 !! @param rM sum of the reacting masses
1136 !! @param j generic loop iterator for x direction
1137 !! @param k generic loop iterator for y direction
1138 !! @param l generic loop iterator for z direction
1139 subroutine s_correct_partial_densities(MCT, q_cons_vf, rM, j, k, l)
1140
1141# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1142#ifdef _CRAYFTN
1143# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1144#if MFC_OpenACC
1145# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1146!$acc routine seq
1147# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1148#elif MFC_OpenMP
1149# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1150
1151# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1152
1153# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1154!$omp declare target device_type(any)
1155# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1156#else
1157# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1158!DIR$ NOINLINE s_correct_partial_densities
1159# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1160#endif
1161# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1162#elif MFC_OpenACC
1163# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1164!$acc routine seq
1165# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1166#elif MFC_OpenMP
1167# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1168
1169# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1170
1171# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1172!$omp declare target device_type(any)
1173# 651 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1174#endif
1175# 653 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1176
1177 !> @name variables for the correction of the reacting partial densities
1178 !> @{
1179 real(wp), intent(out) :: mct
1180 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
1181 real(wp), intent(inout) :: rm
1182 integer, intent(in) :: j, k, l
1183 !> @}
1184 if (rm < 0.0_wp) then
1185
1186 if ((q_cons_vf(lp + contxb - 1)%sf(j, k, l) >= -1.0_wp*mixm) .and. &
1187 (q_cons_vf(vp + contxb - 1)%sf(j, k, l) >= -1.0_wp*mixm)) then
1188
1189 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = 0.0_wp
1190
1191 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = 0.0_wp
1192
1193 rm = q_cons_vf(lp + contxb - 1)%sf(j, k, l) + q_cons_vf(vp + contxb - 1)%sf(j, k, l)
1194
1195 end if
1196
1197 end if
1198
1199 ! Defining the correction in terms of an absolute value might not be the best practice.
1200 ! Maybe a good way to do this is to partition the partial densities, giving a small percentage of the total reacting density
1201 mct = 2*mixm
1202
1203 ! correcting the partial densities of the reacting fluids. What to do for the nonreacting ones?
1204 if (q_cons_vf(lp + contxb - 1)%sf(j, k, l) < 0.0_wp) then
1205
1206 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = mct*rm
1207
1208 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = (1.0_wp - mct)*rm
1209
1210 elseif (q_cons_vf(vp + contxb - 1)%sf(j, k, l) < 0.0_wp) then
1211
1212 q_cons_vf(lp + contxb - 1)%sf(j, k, l) = (1.0_wp - mct)*rm
1213
1214 q_cons_vf(vp + contxb - 1)%sf(j, k, l) = mct*rm
1215
1216 end if
1217 end subroutine s_correct_partial_densities
1218
1219 !> This auxiliary subroutine finds the Saturation temperature for a given
1220 !! saturation pressure through a newton solver
1221 !! @param pSat Saturation Pressure
1222 !! @param TSat Saturation Temperature
1223 !! @param TSIn equilibrium Temperature
1224 elemental subroutine s_tsat(pSat, TSat, TSIn)
1225
1226# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1227#ifdef _CRAYFTN
1228# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1229#if MFC_OpenACC
1230# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1231!$acc routine seq
1232# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1233#elif MFC_OpenMP
1234# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1235
1236# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1237
1238# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1239!$omp declare target device_type(any)
1240# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1241#else
1242# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1243!DIR$ NOINLINE s_TSat
1244# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1245#endif
1246# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1247#elif MFC_OpenACC
1248# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1249!$acc routine seq
1250# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1251#elif MFC_OpenMP
1252# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1253
1254# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1255
1256# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1257!$omp declare target device_type(any)
1258# 702 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1259#endif
1260# 704 "/home/runner/work/MFC/MFC/src/common/m_phase_change.fpp"
1261
1262 real(wp), intent(in) :: psat
1263 real(wp), intent(out) :: tsat
1264 real(wp), intent(in) :: tsin
1265
1266 real(wp) :: dfdt, ft, om !< auxiliary variables
1267
1268 ! Generic loop iterators
1269 integer :: ns
1270
1271 if ((f_approx_equal(psat, 0.0_wp)) .and. (f_approx_equal(tsin, 0.0_wp))) then
1272
1273 ! assigning Saturation temperature
1274 tsat = 0.0_wp
1275
1276 else
1277
1278 ! calculating initial estimate for temperature in the TSat procedure. I will also use this variable to
1279 ! iterate over the Newton's solver
1280 tsat = tsin
1281
1282 ! iteration counter
1283 ns = 0
1284
1285 ! underrelaxation factor
1286 om = 1.0e-3_wp
1287
1288 ! FT must be initialized before the do while condition is evaluated.
1289 ! Fortran .or. is not short-circuit: abs(FT) is always evaluated even
1290 ! when ns == 0, so FT must have a defined value here.
1291 ft = huge(1.0_wp)
1292
1293 do while ((abs(ft) > ptgalpha_eps) .or. (ns == 0))
1294 ! increasing counter
1295 ns = ns + 1
1296
1297 ! calculating residual
1298 ft = tsat*((cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp)) &
1299 *(1 - log(tsat)) - (qvps(lp) - qvps(vp)) &
1300 + cvs(lp)*(gs_min(lp) - 1)*log(psat + ps_inf(lp)) &
1301 - cvs(vp)*(gs_min(vp) - 1)*log(psat + ps_inf(vp))) &
1302 + qvs(lp) - qvs(vp)
1303
1304 ! calculating the jacobian
1305 dfdt = &
1306 -(cvs(lp)*gs_min(lp) - cvs(vp)*gs_min(vp))*log(tsat) &
1307 - (qvps(lp) - qvps(vp)) &
1308 + cvs(lp)*(gs_min(lp) - 1)*log(psat + ps_inf(lp)) &
1309 - cvs(vp)*(gs_min(vp) - 1)*log(psat + ps_inf(vp))
1310
1311 ! updating saturation temperature
1312 tsat = tsat - om*ft/dfdt
1313
1314 end do
1315
1316 end if
1317
1318 end subroutine s_tsat
1319
1320 !> This subroutine finalizes the phase change module
1323
1324#endif
1325
1326end 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).