MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_eos.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2!>
3!! @file
4!! @brief Contains module m_eos
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34
35# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
36
37# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38! New line at end of file is required for FYPP
39# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
40# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
41# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
42# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63
64# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
65
66# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
67
68# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69
70# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71! New line at end of file is required for FYPP
72# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
73
74# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
76# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 126 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 156 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 197 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 211 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 236 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 247 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 249 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125# 260 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 310 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 320 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 356 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 366 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 373 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 379 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142
143# 385 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144
145# 391 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146
147# 397 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148
149# 403 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150! New line at end of file is required for FYPP
151# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
152# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
153# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
154# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
156# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171
172# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173
174# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175
176# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177
178# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
179
180# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
181
182# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
183! New line at end of file is required for FYPP
184# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
185
186# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229
230# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
231
232# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
233
234# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
235
236# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
237
238# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
239
240# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
241! New line at end of file is required for FYPP
242# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
243
244! GPU parallel region (scalar reductions, maxval/minval)
245# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! GPU parallel loop over threads (most common GPU macro)
248# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Required closing for GPU_PARALLEL_LOOP
251# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Mark routine for device compilation
254# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Declare device-resident data
257# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Inner loop within a GPU parallel region
260# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Scoped GPU data region
263# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! Host code with device pointers (for MPI with GPU buffers)
266# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Allocate device memory (unscoped)
269# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Free device memory
272# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Atomic operation on device
275# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! End atomic capture block
278# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Copy data between host and device
281# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Synchronization barrier
284# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Import GPU library module (openacc or omp_lib)
287# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289! Emit code only for AMD compiler
290# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291
292! Emit code for non-Cray compilers
293# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
294
295! Emit code only for Cray compiler
296# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
297
298! Emit code for non-NVIDIA compilers
299# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
300
301# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303! New line at end of file is required for FYPP
304# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
305
306# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
307
308! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
309! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
310! example see misc/nvidia_uvm/bind.sh.
311# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Allocate and create GPU device memory
314# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316! Free GPU device memory and deallocate
317# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
318
319! Cray-specific GPU pointer setup for vector fields
320# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
321
322! Cray-specific GPU pointer setup for scalar fields
323# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
324
325! Cray-specific GPU pointer setup for acoustic source spatials
326# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
327
328# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
329
330# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
331! New line at end of file is required for FYPP
332# 6 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp" 2
333# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
334! This file exists so that Fypp can be run without generating case.fpp files for
335! each target. This is useful when generating documentation, for example. This
336! should also let MFC be built with CMake directly, without invoking mfc.sh.
337
338! For pre-process.
339# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
340
341! For moving immersed boundaries in simulation
342# 12 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
343# 7 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp" 2
344# 1 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp" 1
345! AUTO-GENERATED - do not edit directly. Regenerate: cmake reconfigure
346!
347# 4 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
348
349# 6 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
350# 9 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
351
352# 12 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
353# 15 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
354
355# 17 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
356# 31 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
357
358# 34 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
359# 58 "/home/runner/work/MFC/MFC/build/include/simulation/generated_eos.fpp"
360# 8 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp" 2
361
362!> @brief Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho).
363!!
364!! Stiffened and ideal gas keep constant coefficients, resolved once at start-up. The
365!! state-dependent families (Mie-Gruneisen, JWL, Vinet) evaluate theirs per cell from a
366!! reference curve.
367!!
368!! The mixture closure rules that combine the phases -- Wood's law, the six-equation mean, the
369!! bubbly branch -- are not themselves equations of state, but s_compute_mixture_coefficients,
370!! s_compute_speed_of_sound and their _dt/_avg variants live here rather than in
371!! m_variables_conversion, and must stay here. They are the hot-path callers of the phase
372!! chain (s_phase_coefficients -> s_eos_coefficients -> s_reference_curve), and on NVHPC that
373!! inlining only happens within a single file: the cross-file inliner refuses any device routine
374!! with a subroutine call in its call tree. Splitting them from the chain costs ~25% of grind
375!! time on NVHPC and nothing on the other backends, so it fails quietly. The solver kernels never
376!! inlined these four in the first place, which is why the module boundary is drawn above them and
377!! not below. See docs/documentation/gpuParallelization.md, "Module boundaries and NVHPC inlining".
378!!
379!! This module is a leaf: it directly uses only m_derived_types, m_constants, and
380!! m_global_parameters_common. Adding an EOS family means one case in s_reference_curve.
381module m_eos
382
388
389 implicit none
390
391 private
392
398
399contains
400
401 !> Resolve every fluid's EOS coefficients once, before any conversion runs.
402 impure subroutine s_initialize_eos_module()
403
404 integer :: i
405 logical :: state_dependent !< Whether this case's fluids need a density-dependent EOS
406
407#ifdef MFC_DEBUG
408# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
409 block
410# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
411 use iso_fortran_env, only: output_unit
412# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
413
414# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
415 print *, 'm_eos.fpp:54: ', '@:ALLOCATE(gammas (1:num_fluids))'
416# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
417
418# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
419 call flush (output_unit)
420# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
421 end block
422# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
423#endif
424# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
425 allocate (gammas(1:num_fluids))
426# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
427
428# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
429
430# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
431#if defined(MFC_OpenACC)
432# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
433!$acc enter data create(gammas)
434# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
435#elif defined(MFC_OpenMP)
436# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
437!$omp target enter data map(always,alloc:gammas)
438# 54 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
439#endif
440#ifdef MFC_DEBUG
441# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
442 block
443# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
444 use iso_fortran_env, only: output_unit
445# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
446
447# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
448 print *, 'm_eos.fpp:55: ', '@:ALLOCATE(eoss (1:num_fluids))'
449# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
450
451# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
452 call flush (output_unit)
453# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
454 end block
455# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
456#endif
457# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
458 allocate (eoss(1:num_fluids))
459# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
460
461# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
462
463# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
464#if defined(MFC_OpenACC)
465# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
466!$acc enter data create(eoss)
467# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
468#elif defined(MFC_OpenMP)
469# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
470!$omp target enter data map(always,alloc:eoss)
471# 55 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
472#endif
473#ifdef MFC_DEBUG
474# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
475 block
476# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
477 use iso_fortran_env, only: output_unit
478# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
479
480# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
481 print *, 'm_eos.fpp:56: ', '@:ALLOCATE(isentrope_n (1:num_fluids))'
482# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
483
484# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
485 call flush (output_unit)
486# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
487 end block
488# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
489#endif
490# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
491 allocate (isentrope_n(1:num_fluids))
492# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
493
494# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
495
496# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
497#if defined(MFC_OpenACC)
498# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
499!$acc enter data create(isentrope_n)
500# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
501#elif defined(MFC_OpenMP)
502# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
503!$omp target enter data map(always,alloc:isentrope_n)
504# 56 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
505#endif
506#ifdef MFC_DEBUG
507# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
508 block
509# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
510 use iso_fortran_env, only: output_unit
511# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
512
513# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
514 print *, 'm_eos.fpp:57: ', '@:ALLOCATE(pi_infs(1:num_fluids))'
515# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
516
517# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
518 call flush (output_unit)
519# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
520 end block
521# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
522#endif
523# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
524 allocate (pi_infs(1:num_fluids))
525# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
526
527# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
528
529# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
530#if defined(MFC_OpenACC)
531# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
532!$acc enter data create(pi_infs)
533# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
534#elif defined(MFC_OpenMP)
535# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
536!$omp target enter data map(always,alloc:pi_infs)
537# 57 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
538#endif
539#ifdef MFC_DEBUG
540# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
541 block
542# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
543 use iso_fortran_env, only: output_unit
544# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
545
546# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
547 print *, 'm_eos.fpp:58: ', '@:ALLOCATE(isentrope_B(1:num_fluids))'
548# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
549
550# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
551 call flush (output_unit)
552# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
553 end block
554# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
555#endif
556# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
557 allocate (isentrope_b(1:num_fluids))
558# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
559
560# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
561
562# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
563#if defined(MFC_OpenACC)
564# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
565!$acc enter data create(isentrope_B)
566# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
567#elif defined(MFC_OpenMP)
568# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
569!$omp target enter data map(always,alloc:isentrope_B)
570# 58 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
571#endif
572#ifdef MFC_DEBUG
573# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
574 block
575# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
576 use iso_fortran_env, only: output_unit
577# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
578
579# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
580 print *, 'm_eos.fpp:59: ', '@:ALLOCATE(cvs (1:num_fluids))'
581# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
582
583# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
584 call flush (output_unit)
585# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
586 end block
587# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
588#endif
589# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
590 allocate (cvs(1:num_fluids))
591# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
592
593# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
594
595# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
596#if defined(MFC_OpenACC)
597# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
598!$acc enter data create(cvs)
599# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
600#elif defined(MFC_OpenMP)
601# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
602!$omp target enter data map(always,alloc:cvs)
603# 59 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
604#endif
605#ifdef MFC_DEBUG
606# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
607 block
608# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
609 use iso_fortran_env, only: output_unit
610# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
611
612# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
613 print *, 'm_eos.fpp:60: ', '@:ALLOCATE(qvs (1:num_fluids))'
614# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
615
616# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
617 call flush (output_unit)
618# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
619 end block
620# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
621#endif
622# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
623 allocate (qvs(1:num_fluids))
624# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
625
626# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
627
628# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
629#if defined(MFC_OpenACC)
630# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
631!$acc enter data create(qvs)
632# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
633#elif defined(MFC_OpenMP)
634# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
635!$omp target enter data map(always,alloc:qvs)
636# 60 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
637#endif
638#ifdef MFC_DEBUG
639# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
640 block
641# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
642 use iso_fortran_env, only: output_unit
643# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
644
645# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
646 print *, 'm_eos.fpp:61: ', '@:ALLOCATE(qvps (1:num_fluids))'
647# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
648
649# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
650 call flush (output_unit)
651# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
652 end block
653# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
654#endif
655# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
656 allocate (qvps(1:num_fluids))
657# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
658
659# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
660
661# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
662#if defined(MFC_OpenACC)
663# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
664!$acc enter data create(qvps)
665# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
666#elif defined(MFC_OpenMP)
667# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
668!$omp target enter data map(always,alloc:qvps)
669# 61 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
670#endif
671
672 state_dependent = .false.
673 do i = 1, num_fluids
674 gammas(i) = fluid_pp(i)%gamma
675 isentrope_n(i) = f_isentrope_exponent(gammas(i))
676
677 ! Each EOS supplies its own coefficients. Resolved once here, not per cell: a branch in the mixture loop costs
678 ! registers in the Riemann kernels. An EOS whose coefficients depend on state must move to per-cell evaluation.
679 select case (fluid_pp(i)%eos)
680 case (eos_ideal_gas)
681 pi_infs(i) = 0._wp
682 case default
683 pi_infs(i) = fluid_pp(i)%pi_inf
684 end select
685 isentrope_b(i) = f_isentrope_pressure(pi_infs(i), gammas(i))
686 cvs(i) = fluid_pp(i)%cv
687 qvs(i) = fluid_pp(i)%qv
688 qvps(i) = fluid_pp(i)%qvp
689 eoss(i) = fluid_pp(i)%eos
690 ! Every fluid's single-source coefficients, mu_max among them: where a cubic Hugoniot fit turns over.
691 ! mu(u_p) peaks where c0 = s2 u_p^2 + 2 s3 u_p^3, and past it no shock state exists, so the Newton below
692 ! would wander. Solved once here, on the host.
693 eos_coeffs(i)%c0 = fluid_pp(i)%mg_c0
694# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
695 eos_coeffs(i)%s = fluid_pp(i)%mg_s
696# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
697 eos_coeffs(i)%s2 = fluid_pp(i)%mg_s2
698# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
699 eos_coeffs(i)%s3 = fluid_pp(i)%mg_s3
700# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
701 eos_coeffs(i)%mu_max = f_hugoniot_compression_limit(fluid_pp(i)%mg_c0, fluid_pp(i)%mg_s, fluid_pp(i)%mg_s2, &
702# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
703 & fluid_pp(i)%mg_s3)
704# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
705 eos_coeffs(i)%a = fluid_pp(i)%jwl_a
706# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
707 eos_coeffs(i)%b = fluid_pp(i)%jwl_b
708# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
709 eos_coeffs(i)%r1 = fluid_pp(i)%jwl_r1
710# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
711 eos_coeffs(i)%r2 = fluid_pp(i)%jwl_r2
712# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
713 eos_coeffs(i)%k0 = fluid_pp(i)%vinet_k0
714# 84 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
715 eos_coeffs(i)%k0p = fluid_pp(i)%vinet_k0p
716 ! One reference state and Gruneisen closure for every family; the user-facing names keep their prefix.
717 select case (fluid_pp(i)%eos)
718# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
719 case (eos_mie_gruneisen)
720# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
721 eos_coeffs(i)%rho0 = fluid_pp(i)%mg_rho0
722# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
723 eos_coeffs(i)%t0 = fluid_pp(i)%mg_t0
724# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
725 eos_coeffs(i)%gruneisen0 = fluid_pp(i)%mg_gruneisen
726# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
727 eos_coeffs(i)%gruneisen_a = fluid_pp(i)%mg_gruneisen_a
728# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
729 case (eos_jwl)
730# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
731 eos_coeffs(i)%rho0 = fluid_pp(i)%jwl_rho0
732# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
733 eos_coeffs(i)%t0 = fluid_pp(i)%jwl_t0
734# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
735 eos_coeffs(i)%gruneisen0 = fluid_pp(i)%jwl_omega
736# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
737 eos_coeffs(i)%gruneisen_a = 0._wp
738# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
739 case (eos_vinet)
740# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
741 eos_coeffs(i)%rho0 = fluid_pp(i)%vinet_rho0
742# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
743 eos_coeffs(i)%t0 = fluid_pp(i)%vinet_t0
744# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
745 eos_coeffs(i)%gruneisen0 = fluid_pp(i)%vinet_gruneisen
746# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
747 eos_coeffs(i)%gruneisen_a = fluid_pp(i)%vinet_gruneisen_a
748# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
749 case default
750# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
751 eos_coeffs(i)%rho0 = dflt_real
752# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
753 eos_coeffs(i)%t0 = dflt_real
754# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
755 eos_coeffs(i)%gruneisen0 = dflt_real
756# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
757 eos_coeffs(i)%gruneisen_a = 0._wp
758# 86 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
759 end select
760 if (f_is_state_dependent(i)) state_dependent = .true.
761 end do
762# 95 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
763 any_state_dependent_eos = state_dependent
764# 97 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
765
766# 97 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
767#if defined(MFC_OpenACC)
768# 97 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
769!$acc update device(gammas, isentrope_n, pi_infs, isentrope_B, cvs, qvs, qvps, eoss, eos_coeffs)
770# 97 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
771#elif defined(MFC_OpenMP)
772# 97 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
773!$omp target update to(gammas, isentrope_n, pi_infs, isentrope_B, cvs, qvs, qvps, eoss, eos_coeffs)
774# 97 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
775#endif
776# 99 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
777
778# 99 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
779#if defined(MFC_OpenACC)
780# 99 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
781!$acc update device(any_state_dependent_eos)
782# 99 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
783#elif defined(MFC_OpenMP)
784# 99 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
785!$omp target update to(any_state_dependent_eos)
786# 99 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
787#endif
788# 101 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
789
790 end subroutine s_initialize_eos_module
791
792 !> Deallocate the fluid property arrays allocated in s_initialize_eos_module.
793 impure subroutine s_finalize_eos_module()
794
795#ifdef MFC_DEBUG
796# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
797 block
798# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
799 use iso_fortran_env, only: output_unit
800# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
801
802# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
803 print *, 'm_eos.fpp:107: ', '@:DEALLOCATE(gammas, isentrope_n, pi_infs, isentrope_B, cvs, qvs, qvps, eoss)'
804# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
805
806# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
807 call flush (output_unit)
808# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
809 end block
810# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
811#endif
812# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
813
814# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
815#if defined(MFC_OpenACC)
816# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
817!$acc exit data delete(gammas, isentrope_n, pi_infs, isentrope_B, cvs, qvs, qvps, eoss)
818# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
819#elif defined(MFC_OpenMP)
820# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
821!$omp target exit data map(release:gammas, isentrope_n, pi_infs, isentrope_B, cvs, qvs, qvps, eoss)
822# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
823#endif
824# 107 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
825 deallocate (gammas, isentrope_n, pi_infs, isentrope_b, cvs, qvs, qvps, eoss)
826
827 end subroutine s_finalize_eos_module
828
829 !> The reference curve of a state-dependent EOS at rho: p_ref, e_ref, their d/drho, and Gamma_G with its d/drho. A new family
830 !! adds one case here and nothing else.
831 subroutine s_reference_curve(rho, i, p_ref, e_ref, dp_drho, de_drho, G0, dG0)
832
833
834# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
835#if MFC_OpenACC
836# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
837!$acc routine seq
838# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
839#elif MFC_OpenMP
840# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
841
842# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
843
844# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
845!$omp declare target device_type(any)
846# 115 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
847#endif
848
849 real(wp), intent(in) :: rho
850 integer, intent(in) :: i
851 real(wp), intent(out) :: p_ref, e_ref, dp_drho, de_drho, G0, dG0
852 real(wp) :: mu, d, V, ea, eb, up, us, dus, dup_dmu, x, ex, dp_dmu, de_dmu
853 integer :: iter
854
855 mu = rho/eos_coeffs(i)%rho0 - 1._wp
856 ! Past the fit's turnover there is no shock state to find; clamp rather than let the Newton below wander
857 ! off and return a silently wrong pressure. mu_max is huge for the linear fit, so this is a no-op there.
858 ! Bounded here so the step finishes and the host-side check in s_write_run_time_information can report it;
859 ! past the turnover there is no shock state and the Newton below would wander.
860 if (eoss(i) == eos_mie_gruneisen .and. mu > eos_coeffs(i)%mu_max) mu = eos_coeffs(i)%mu_max
861 select case (eoss(i))
862 case (eos_mie_gruneisen)
863 ! Hugoniot reference u_s = c0 + s u_p + s2 u_p^2 + s3 u_p^3, with p_H = rho0 u_s u_p and the Hugoniot
864 ! energy e_H = p_H mu/(2 rho0 (1 + mu)); linear on release. Pole at mu = 1/(s - 1) for the linear fit;
865 ! the validator refuses initial states outside the EOS.
866 if (mu < 0._wp) then
867 p_ref = eos_coeffs(i)%rho0*eos_coeffs(i)%c0**2*mu
868 dp_dmu = eos_coeffs(i)%rho0*eos_coeffs(i)%c0**2
869 else if (eos_coeffs(i)%s2 == 0._wp .and. eos_coeffs(i)%s3 == 0._wp) then
870 d = 1._wp - (eos_coeffs(i)%s - 1._wp)*mu
871 p_ref = eos_coeffs(i)%rho0*eos_coeffs(i)%c0**2*mu*(1._wp + mu)/(d*d)
872 dp_dmu = eos_coeffs(i)%rho0*eos_coeffs(i)%c0**2*((1._wp + 2._wp*mu)*d + 2._wp*(eos_coeffs(i)%s - 1._wp)*mu*(1._wp &
873 & + mu))/(d*d*d)
874 else
875 ! u_p solves u_s(u_p) mu = u_p (1 + mu): Newton from the linear fit, then implicit differentiation
876 up = eos_coeffs(i)%c0*mu/(1._wp - (eos_coeffs(i)%s - 1._wp)*mu)
877
878# 145 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
879#if defined(MFC_OpenACC)
880# 145 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
881!$acc loop seq
882# 145 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
883#elif defined(MFC_OpenMP)
884# 145 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
885
886# 145 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
887#endif
888 do iter = 1, 8
889 us = eos_coeffs(i)%c0 + up*(eos_coeffs(i)%s + up*(eos_coeffs(i)%s2 + up*eos_coeffs(i)%s3))
890 dus = eos_coeffs(i)%s + up*(2._wp*eos_coeffs(i)%s2 + 3._wp*eos_coeffs(i)%s3*up)
891 up = up - (us*mu - up*(1._wp + mu))/(dus*mu - (1._wp + mu))
892 end do
893 us = eos_coeffs(i)%c0 + up*(eos_coeffs(i)%s + up*(eos_coeffs(i)%s2 + up*eos_coeffs(i)%s3))
894 dus = eos_coeffs(i)%s + up*(2._wp*eos_coeffs(i)%s2 + 3._wp*eos_coeffs(i)%s3*up)
895 dup_dmu = (up - us)/(dus*mu - (1._wp + mu))
896 p_ref = eos_coeffs(i)%rho0*us*up
897 dp_dmu = eos_coeffs(i)%rho0*(dus*up + us)*dup_dmu
898 end if
899 e_ref = p_ref*mu/(2._wp*eos_coeffs(i)%rho0*(1._wp + mu))
900 de_dmu = (dp_dmu*mu*(1._wp + mu) + p_ref)/(2._wp*eos_coeffs(i)%rho0*(1._wp + mu)**2)
901 dp_drho = dp_dmu/eos_coeffs(i)%rho0
902 de_drho = de_dmu/eos_coeffs(i)%rho0
903 case (eos_jwl)
904 ! JWL: p_ref = A exp(-R1 V) + B exp(-R2 V), V = rho0/rho. The curve is itself an isentrope, so de_ref = -p_ref d(1/rho).
905 v = eos_coeffs(i)%rho0/rho
906 ea = eos_coeffs(i)%a*exp(-eos_coeffs(i)%r1*v)
907 eb = eos_coeffs(i)%b*exp(-eos_coeffs(i)%r2*v)
908 p_ref = ea + eb
909 e_ref = (ea/eos_coeffs(i)%r1 + eb/eos_coeffs(i)%r2)/eos_coeffs(i)%rho0
910 dp_drho = (eos_coeffs(i)%rho0/rho**2)*(eos_coeffs(i)%r1*ea + eos_coeffs(i)%r2*eb)
911 de_drho = p_ref/rho**2
912 case (eos_vinet)
913 ! Vinet cold curve: p_c = 3 K0 (1 - x)/x^2 exp(eta (1 - x)), x = (rho0/rho)^(1/3), eta = 3 (K0' - 1)/2,
914 ! an isentrope like JWL (its energy integrates in closed form).
915 d = 1.5_wp*(eos_coeffs(i)%k0p - 1._wp)
916 x = (eos_coeffs(i)%rho0/rho)**(1._wp/3._wp)
917 ex = exp(d*(1._wp - x))
918 p_ref = 3._wp*eos_coeffs(i)%k0*(1._wp - x)/x**2*ex
919 e_ref = 9._wp*eos_coeffs(i)%k0/(eos_coeffs(i)%rho0*d**2)*(1._wp - (1._wp - d*(1._wp - x))*ex)
920 dp_drho = 3._wp*eos_coeffs(i)%k0*ex*(-1._wp/x**2 - 2._wp*(1._wp - x)/x**3 - d*(1._wp - x)/x**2)*(-x/(3._wp*rho))
921 de_drho = p_ref/rho**2
922 end select
923 g0 = eos_coeffs(i)%gruneisen0 + eos_coeffs(i)%gruneisen_a*mu
924 dg0 = eos_coeffs(i)%gruneisen_a/eos_coeffs(i)%rho0
925
926 end subroutine s_reference_curve
927
928 !> Whether the EOS of fluid i is a family whose coefficients vary with density.
929 function f_is_state_dependent(i) result(yes)
930
931
932# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
933#ifdef _CRAYFTN
934# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
935#if MFC_OpenACC
936# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
937!$acc routine seq
938# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
939#elif MFC_OpenMP
940# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
941
942# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
943
944# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
945!$omp declare target device_type(any)
946# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
947#else
948# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
949!DIR$ INLINEALWAYS f_is_state_dependent
950# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
951#endif
952# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
953#elif MFC_OpenACC
954# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
955!$acc routine seq
956# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
957#elif MFC_OpenMP
958# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
959
960# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
961
962# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
963!$omp declare target device_type(any)
964# 189 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
965#endif
966
967 integer, intent(in) :: i
968 logical :: yes
969
970 yes = eoss(i) == eos_mie_gruneisen .or. eoss(i) == eos_jwl .or. eoss(i) == eos_vinet
971
972 end function f_is_state_dependent
973
974 !> True when fluid i's reference curve is itself an isentrope (de_ref = -p_ref d(1/rho), which holds for JWL and Vinet but not
975 !! for the Mie-Gruneisen Hugoniot) and its Gruneisen coefficient is constant. Those two together make the isentrope through any
976 !! state closed-form, so it never has to be integrated.
977 function f_has_isentropic_reference(i) result(yes)
978
979
980# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
981#ifdef _CRAYFTN
982# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
983#if MFC_OpenACC
984# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
985!$acc routine seq
986# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
987#elif MFC_OpenMP
988# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
989
990# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
991
992# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
993!$omp declare target device_type(any)
994# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
995#else
996# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
997!DIR$ INLINEALWAYS f_has_isentropic_reference
998# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
999#endif
1000# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1001#elif MFC_OpenACC
1002# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1003!$acc routine seq
1004# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1005#elif MFC_OpenMP
1006# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1007
1008# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1009
1010# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1011!$omp declare target device_type(any)
1012# 203 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1013#endif
1014
1015 integer, intent(in) :: i
1016 logical :: yes
1017
1018 yes = (eoss(i) == eos_jwl .or. eoss(i) == eos_vinet) .and. eos_coeffs(i)%gruneisen_a == 0._wp
1019
1020 end function f_has_isentropic_reference
1021
1022 !> The largest compression a cubic Hugoniot fit can represent. mu(u_p) = u_p/(u_s - u_p) rises, peaks where c0 = s2 u_p^2 + 2 s3
1023 !! u_p^3, and falls after; only the rising branch is a physical shock. Returns a huge value for the linear fit, which never
1024 !! turns over. Host-side: called once per fluid at initialization.
1025 impure function f_hugoniot_compression_limit(c0, s, s2, s3) result(mu_max)
1026
1027 real(wp), intent(in) :: c0, s, s2, s3
1028 real(wp) :: mu_max, up, f, df, us
1029 integer :: iter
1030
1031 if (s2 == 0._wp .and. s3 == 0._wp) then
1032 mu_max = huge(1._wp)
1033 return
1034 end if
1035
1036 ! Newton on c0 - s2 u^2 - 2 s3 u^3 = 0, from a guess that brackets the physical range
1037 up = c0
1038 do iter = 1, 100
1039 f = c0 - s2*up**2 - 2._wp*s3*up**3
1040 df = -2._wp*s2*up - 6._wp*s3*up**2
1041 if (abs(df) < verysmall) exit
1042 up = max(up - f/df, verysmall)
1043 end do
1044 us = c0 + up*(s + up*(s2 + up*s3))
1045 mu_max = up/max(us - up, verysmall)
1046
1047 end function f_hugoniot_compression_limit
1048
1049 !> Gamma, Pi, dPi/drho and dGamma/drho of fluid i at density rho, the coefficients of rho e = Gamma p + Pi(rho). Stiffened and
1050 !! ideal gas keep the constants resolved at init, bit for bit.
1051 subroutine s_eos_coefficients(rho, i, gamma, pi_inf, dpi, dgamma)
1052
1053
1054# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1055#if MFC_OpenACC
1056# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1057!$acc routine seq
1058# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1059#elif MFC_OpenMP
1060# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1061
1062# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1063
1064# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1065!$omp declare target device_type(any)
1066# 243 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1067#endif
1068
1069 real(wp), intent(in) :: rho
1070 integer, intent(in) :: i
1071 real(wp), intent(out) :: gamma, pi_inf, dpi, dgamma
1072 real(wp) :: p_ref, e_ref, dp_drho, de_drho, G0, dG0
1073
1074 if (.not. f_is_state_dependent(i)) then
1075 gamma = gammas(i)
1076 pi_inf = pi_infs(i)
1077 dpi = 0._wp
1078 dgamma = 0._wp
1079 return
1080 end if
1081 call s_reference_curve(rho, i, p_ref, e_ref, dp_drho, de_drho, g0, dg0)
1082 gamma = 1._wp/g0
1083 pi_inf = rho*e_ref - p_ref/g0
1084 dpi = e_ref + rho*de_drho - dp_drho/g0 + p_ref*dg0/g0**2
1085 dgamma = -dg0/g0**2
1086
1087 end subroutine s_eos_coefficients
1088
1089 !> Exponent of the stiffened-gas isentrope p + B = const rho**n. Precomputed per fluid as isentrope_n.
1090 function f_isentrope_exponent(gamma) result(n)
1091
1092
1093# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1094#ifdef _CRAYFTN
1095# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1096#if MFC_OpenACC
1097# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1098!$acc routine seq
1099# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1100#elif MFC_OpenMP
1101# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1102
1103# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1104
1105# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1106!$omp declare target device_type(any)
1107# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1108#else
1109# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1110!DIR$ INLINEALWAYS f_isentrope_exponent
1111# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1112#endif
1113# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1114#elif MFC_OpenACC
1115# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1116!$acc routine seq
1117# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1118#elif MFC_OpenMP
1119# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1120
1121# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1122
1123# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1124!$omp declare target device_type(any)
1125# 268 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1126#endif
1127
1128 real(wp), intent(in) :: gamma
1129 real(wp) :: n
1130
1131 n = 1._wp/gamma + 1._wp
1132
1133 end function f_isentrope_exponent
1134
1135 !> Reference pressure of that isentrope. Precomputed per fluid as isentrope_B.
1136 function f_isentrope_pressure(pi_inf, gamma) result(B)
1137
1138
1139# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1140#ifdef _CRAYFTN
1141# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1142#if MFC_OpenACC
1143# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1144!$acc routine seq
1145# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1146#elif MFC_OpenMP
1147# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1148
1149# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1150
1151# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1152!$omp declare target device_type(any)
1153# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1154#else
1155# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1156!DIR$ INLINEALWAYS f_isentrope_pressure
1157# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1158#endif
1159# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1160#elif MFC_OpenACC
1161# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1162!$acc routine seq
1163# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1164#elif MFC_OpenMP
1165# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1166
1167# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1168
1169# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1170!$omp declare target device_type(any)
1171# 280 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1172#endif
1173
1174 real(wp), intent(in) :: pi_inf, gamma
1175 real(wp) :: b
1176
1177 b = pi_inf/(1._wp + gamma)
1178
1179 end function f_isentrope_pressure
1180
1181 !> Stiffened-gas thermal law p + B = (n - 1)*cv*rho*T. Pass rho to get T, or T to get rho.
1182 function f_sg_thermal(pres, rho_or_T, n, B, cv) result(T_or_rho)
1183
1184
1185# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1186#ifdef _CRAYFTN
1187# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1188#if MFC_OpenACC
1189# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1190!$acc routine seq
1191# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1192#elif MFC_OpenMP
1193# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1194
1195# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1196
1197# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1198!$omp declare target device_type(any)
1199# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1200#else
1201# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1202!DIR$ INLINEALWAYS f_sg_thermal
1203# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1204#endif
1205# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1206#elif MFC_OpenACC
1207# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1208!$acc routine seq
1209# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1210#elif MFC_OpenMP
1211# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1212
1213# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1214
1215# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1216!$omp declare target device_type(any)
1217# 292 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1218#endif
1219
1220 real(wp), intent(in) :: pres, rho_or_t, n, b, cv
1221 real(wp) :: t_or_rho
1222
1223 t_or_rho = (pres + b)/((n - 1._wp)*cv*rho_or_t)
1224
1225 end function f_sg_thermal
1226
1227 !> Thermal-equilibrium mixture temperature for stiffened gas, from primitives. Algebraically identical to the conservative form
1228 !! in m_phase_change's s_infinite_pt_relaxation_k, T = (rho*e + p - sum(alpha_rho_i*qv_i)) / sum(alpha_rho_i*cv_i*n_i), because
1229 !! rho*e = gamma_mix*p + pi_inf_mix + sum(alpha_rho_i*qv_i) in MFC's stored variables.
1230 function f_mixture_temperature(alpha_rho_K, pres, gamma_K, pi_inf_K) result(T)
1231
1232
1233# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1234#ifdef _CRAYFTN
1235# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1236#if MFC_OpenACC
1237# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1238!$acc routine seq
1239# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1240#elif MFC_OpenMP
1241# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1242
1243# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1244
1245# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1246!$omp declare target device_type(any)
1247# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1248#else
1249# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1250!DIR$ INLINEALWAYS f_mixture_temperature
1251# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1252#endif
1253# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1254#elif MFC_OpenACC
1255# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1256!$acc routine seq
1257# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1258#elif MFC_OpenMP
1259# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1260
1261# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1262
1263# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1264!$omp declare target device_type(any)
1265# 306 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1266#endif
1267
1268# 311 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1269 real(wp), dimension(num_fluids), intent(in) :: alpha_rho_k
1270# 313 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1271 real(wp), intent(in) :: pres, gamma_k, pi_inf_k
1272 real(wp) :: t
1273 real(wp) :: mcp !< sum of alpha_rho_i*cp_i; cp_i = n_i*cv_i
1274 integer :: i
1275
1276 mcp = 0._wp
1277
1278# 319 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1279#if defined(MFC_OpenACC)
1280# 319 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1281!$acc loop seq
1282# 319 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1283#elif defined(MFC_OpenMP)
1284# 319 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1285
1286# 319 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1287#endif
1288 do i = 1, num_fluids
1289 mcp = mcp + alpha_rho_k(i)*cvs(i)*isentrope_n(i)
1290 end do
1291
1292 t = ((gamma_k + 1._wp)*pres + pi_inf_k)/max(mcp, sgm_eps)
1293
1294 end function f_mixture_temperature
1295
1296 !> Coefficients of phase i at its own density alpha_rho/alpha: the per-cell dispatch when some fluid's EOS is state dependent,
1297 !! the constants resolved at init otherwise (bit for bit).
1298 subroutine s_phase_coefficients(alpha_rho, alpha, i, rho, gamma, pi_inf, dpi, dgamma)
1299
1300
1301# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1302#ifdef _CRAYFTN
1303# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1304#if MFC_OpenACC
1305# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1306!$acc routine seq
1307# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1308#elif MFC_OpenMP
1309# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1310
1311# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1312
1313# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1314!$omp declare target device_type(any)
1315# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1316#else
1317# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1318!DIR$ INLINEALWAYS s_phase_coefficients
1319# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1320#endif
1321# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1322#elif MFC_OpenACC
1323# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1324!$acc routine seq
1325# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1326#elif MFC_OpenMP
1327# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1328
1329# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1330
1331# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1332!$omp declare target device_type(any)
1333# 332 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1334#endif
1335
1336 real(wp), intent(in) :: alpha_rho, alpha
1337 integer, intent(in) :: i
1338 real(wp), intent(out) :: rho, gamma, pi_inf, dpi, dgamma
1339
1340 rho = max(alpha_rho, sgm_eps)/max(alpha, sgm_eps)
1341 if (any_state_dependent_eos) then
1342 call s_eos_coefficients(rho, i, gamma, pi_inf, dpi, dgamma)
1343 else
1344 gamma = gammas(i)
1345 pi_inf = pi_infs(i)
1346 dpi = 0._wp
1347 dgamma = 0._wp
1348 end if
1349
1350 end subroutine s_phase_coefficients
1351
1352 !> c^2 = [((Gamma + 1) p + Pi)/rho - dPi/drho - p dGamma/drho]/Gamma, the frozen speed of one phase.
1353 function f_c2_from_coefficients(rho, pres, gamma, pi_inf, dpi, dgamma) result(c2)
1354
1355
1356# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1357#ifdef _CRAYFTN
1358# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1359#if MFC_OpenACC
1360# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1361!$acc routine seq
1362# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1363#elif MFC_OpenMP
1364# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1365
1366# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1367
1368# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1369!$omp declare target device_type(any)
1370# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1371#else
1372# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1373!DIR$ INLINEALWAYS f_c2_from_coefficients
1374# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1375#endif
1376# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1377#elif MFC_OpenACC
1378# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1379!$acc routine seq
1380# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1381#elif MFC_OpenMP
1382# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1383
1384# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1385
1386# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1387!$omp declare target device_type(any)
1388# 353 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1389#endif
1390
1391 real(wp), intent(in) :: rho, pres, gamma, pi_inf, dpi, dgamma
1392 real(wp) :: c2
1393
1394 c2 = (((gamma + 1._wp)*pres + pi_inf)/rho - dpi - pres*dgamma)/gamma
1395
1396 end function f_c2_from_coefficients
1397
1398 !> Frozen sound speed squared of one phase at (rho, p) from its own coefficients. These helpers are subroutines, not functions:
1399 !! a device function that calls a device subroutine is a pattern no other backend-tested code in MFC uses.
1400 subroutine s_phase_c2(rho, pres, i, c2)
1401
1402
1403# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1404#if MFC_OpenACC
1405# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1406!$acc routine seq
1407# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1408#elif MFC_OpenMP
1409# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1410
1411# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1412
1413# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1414!$omp declare target device_type(any)
1415# 366 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1416#endif
1417
1418 real(wp), intent(in) :: rho, pres
1419 integer, intent(in) :: i
1420 real(wp), intent(out) :: c2
1421 real(wp) :: gamma, pi_inf, dpi, dgamma
1422
1423 call s_eos_coefficients(rho, i, gamma, pi_inf, dpi, dgamma)
1424 c2 = f_c2_from_coefficients(rho, pres, gamma, pi_inf, dpi, dgamma)
1425
1426 end subroutine s_phase_c2
1427
1428 !> Slope of the ODE `kind` for fluid i: dp/drho = c^2 along an isentrope (x = rho, y = p), or the reference temperature dT/dV =
1429 !! (de_ref/dV + p_ref)/c_v - Gamma_G T/V (x = V, y = T), the Maxwell relation applied to e = e_ref + c_v (T - T_ref).
1430 subroutine s_ode_slope(kind, i, x, y, dydx)
1431
1432
1433# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1434#if MFC_OpenACC
1435# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1436!$acc routine seq
1437# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1438#elif MFC_OpenMP
1439# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1440
1441# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1442
1443# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1444!$omp declare target device_type(any)
1445# 382 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1446#endif
1447
1448 integer, intent(in) :: kind, i
1449 real(wp), intent(in) :: x, y
1450 real(wp), intent(out) :: dydx
1451 real(wp) :: p_ref, e_ref, dp_drho, de_drho, G0, dG0
1452
1453 if (kind == ode_isentrope) then
1454 call s_phase_c2(x, y, i, dydx)
1455 else
1456 call s_reference_curve(1._wp/x, i, p_ref, e_ref, dp_drho, de_drho, g0, dg0)
1457 dydx = (p_ref - de_drho/x**2)/cvs(i) - g0*y/x
1458 end if
1459
1460 end subroutine s_ode_slope
1461
1462 !> Fixed-step classical RK4 for the ODE `kind` from (x0, y0) to x1.
1463 subroutine s_rk4(kind, i, x0, y0, x1, y)
1464
1465
1466# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1467#if MFC_OpenACC
1468# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1469!$acc routine seq
1470# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1471#elif MFC_OpenMP
1472# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1473
1474# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1475
1476# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1477!$omp declare target device_type(any)
1478# 401 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1479#endif
1480
1481 integer, intent(in) :: kind, i
1482 real(wp), intent(in) :: x0, y0, x1
1483 real(wp), intent(out) :: y
1484 real(wp) :: x, h, k1, k2, k3, k4
1485 integer :: step
1486
1487 x = x0
1488 y = y0
1489 h = (x1 - x0)/eos_rk4_steps
1490
1491# 412 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1492#if defined(MFC_OpenACC)
1493# 412 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1494!$acc loop seq
1495# 412 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1496#elif defined(MFC_OpenMP)
1497# 412 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1498
1499# 412 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1500#endif
1501 do step = 1, eos_rk4_steps
1502 call s_ode_slope(kind, i, x, y, k1)
1503 call s_ode_slope(kind, i, x + 0.5_wp*h, y + 0.5_wp*h*k1, k2)
1504 call s_ode_slope(kind, i, x + 0.5_wp*h, y + 0.5_wp*h*k2, k3)
1505 call s_ode_slope(kind, i, x + h, y + h*k3, k4)
1506 y = y + h*(k1 + 2._wp*(k2 + k3) + k4)/6._wp
1507 x = x + h
1508 end do
1509
1510 end subroutine s_rk4
1511
1512 !> Pressure of phase i after the isentropic density change rho -> xi rho: closed form for the constant-coefficient families,
1513 !! integrated for a state-dependent EOS (the star states it serves are close to rho).
1514 subroutine s_phase_pressure_on_isentrope(pres, rho, xi, i, p_isen)
1515
1516
1517# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1518#ifdef _CRAYFTN
1519# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1520#if MFC_OpenACC
1521# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1522!$acc routine seq
1523# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1524#elif MFC_OpenMP
1525# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1526
1527# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1528
1529# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1530!$omp declare target device_type(any)
1531# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1532#else
1533# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1534!DIR$ INLINEALWAYS s_phase_pressure_on_isentrope
1535# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1536#endif
1537# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1538#elif MFC_OpenACC
1539# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1540!$acc routine seq
1541# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1542#elif MFC_OpenMP
1543# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1544
1545# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1546
1547# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1548!$omp declare target device_type(any)
1549# 428 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1550#endif
1551
1552 real(wp), intent(in) :: pres, rho, xi
1553 integer, intent(in) :: i
1554 real(wp), intent(out) :: p_isen
1555 real(wp) :: p_ref_from, p_ref_to, e_ref, dp_drho, de_drho, g0, dg0
1556
1557 if (.not. f_is_state_dependent(i)) then
1558 p_isen = (pres + isentrope_b(i))*xi**isentrope_n(i) - isentrope_b(i)
1559 else if (f_has_isentropic_reference(i)) then
1560 ! Exact: the offset from an isentropic reference obeys dDelta/Delta = Gamma drho/rho, so
1561 ! p - p_ref scales as (rho'/rho)**(1 + Gamma). Integrating it instead costs a decimal per
1562 ! doubling of the expansion and turns the pressure negative past roughly twentyfold.
1563 call s_reference_curve(rho, i, p_ref_from, e_ref, dp_drho, de_drho, g0, dg0)
1564 call s_reference_curve(xi*rho, i, p_ref_to, e_ref, dp_drho, de_drho, g0, dg0)
1565 p_isen = p_ref_to + (pres - p_ref_from)*xi**(1._wp + eos_coeffs(i)%gruneisen0)
1566 else
1567 call s_rk4(ode_isentrope, i, rho, pres, xi*rho, p_isen)
1568 end if
1569
1570 end subroutine s_phase_pressure_on_isentrope
1571
1572 !> Temperature of phase i at (rho, p): the stiffened-gas relation, or T_ref(rho) + (e - e_ref)/c_v.
1573 subroutine s_phase_temperature(rho, pres, i, T)
1574
1575
1576# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1577#ifdef _CRAYFTN
1578# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1579#if MFC_OpenACC
1580# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1581!$acc routine seq
1582# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1583#elif MFC_OpenMP
1584# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1585
1586# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1587
1588# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1589!$omp declare target device_type(any)
1590# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1591#else
1592# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1593!DIR$ INLINEALWAYS s_phase_temperature
1594# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1595#endif
1596# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1597#elif MFC_OpenACC
1598# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1599!$acc routine seq
1600# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1601#elif MFC_OpenMP
1602# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1603
1604# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1605
1606# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1607!$omp declare target device_type(any)
1608# 453 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1609#endif
1610
1611 real(wp), intent(in) :: rho, pres
1612 integer, intent(in) :: i
1613 real(wp), intent(out) :: t
1614 real(wp) :: p_ref, e_ref, dp_drho, de_drho, g0, dg0, t0, t_ref
1615
1616 if (f_is_state_dependent(i)) then
1617 call s_reference_curve(rho, i, p_ref, e_ref, dp_drho, de_drho, g0, dg0)
1618 t0 = eos_coeffs(i)%t0
1619 call s_rk4(ode_reference_temperature, i, 1._wp/eos_coeffs(i)%rho0, t0, 1._wp/rho, t_ref)
1620 t = t_ref + (pres - p_ref)/(rho*g0*cvs(i))
1621 else
1622 t = (pres + isentrope_b(i))/((isentrope_n(i) - 1._wp)*cvs(i)*rho)
1623 end if
1624
1625 end subroutine s_phase_temperature
1626
1627 !> Density of phase i on the isentrope through (rho_from, p_from) at p_to, and c^2 there: Newton on the pressure integrator,
1628 !! whose slope is c^2. The relaxation's own Newton wraps this, so a few steps suffice.
1629 subroutine s_phase_density_on_isentrope(i, rho_from, p_from, p_to, rho_to, c2_to)
1630
1631
1632# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1633#if MFC_OpenACC
1634# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1635!$acc routine seq
1636# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1637#elif MFC_OpenMP
1638# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1639
1640# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1641
1642# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1643!$omp declare target device_type(any)
1644# 475 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1645#endif
1646
1647 integer, intent(in) :: i
1648 real(wp), intent(in) :: rho_from, p_from, p_to
1649 real(wp), intent(out) :: rho_to, c2_to
1650 real(wp) :: p_at, c2_at
1651 integer :: iter
1652
1653 rho_to = rho_from
1654
1655# 484 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1656#if defined(MFC_OpenACC)
1657# 484 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1658!$acc loop seq
1659# 484 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1660#elif defined(MFC_OpenMP)
1661# 484 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1662
1663# 484 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1664#endif
1665 do iter = 1, 4
1666 call s_phase_pressure_on_isentrope(p_from, rho_from, rho_to/rho_from, i, p_at)
1667 call s_phase_c2(rho_to, p_at, i, c2_at)
1668 rho_to = rho_to - (p_at - p_to)/c2_at
1669 end do
1670 call s_phase_c2(rho_to, p_to, i, c2_to)
1671
1672 end subroutine s_phase_density_on_isentrope
1673
1674 !> Internal energy per unit volume of phase i at pressure pres: alpha (Gamma p + Pi) + alpha_rho qv, with the coefficients at
1675 !! the phase's own density.
1676 subroutine s_phase_internal_energy(pres, alpha, alpha_rho, i, e_phase)
1677
1678
1679# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1680#ifdef _CRAYFTN
1681# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1682#if MFC_OpenACC
1683# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1684!$acc routine seq
1685# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1686#elif MFC_OpenMP
1687# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1688
1689# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1690
1691# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1692!$omp declare target device_type(any)
1693# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1694#else
1695# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1696!DIR$ INLINEALWAYS s_phase_internal_energy
1697# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1698#endif
1699# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1700#elif MFC_OpenACC
1701# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1702!$acc routine seq
1703# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1704#elif MFC_OpenMP
1705# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1706
1707# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1708
1709# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1710!$omp declare target device_type(any)
1711# 498 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1712#endif
1713
1714 real(wp), intent(in) :: pres, alpha, alpha_rho
1715 integer, intent(in) :: i
1716 real(wp), intent(out) :: e_phase
1717 real(wp) :: rho, gamma, pi_inf, dpi, dgamma
1718
1719 call s_phase_coefficients(alpha_rho, alpha, i, rho, gamma, pi_inf, dpi, dgamma)
1720 e_phase = alpha*(gamma*pres + pi_inf) + alpha_rho*qvs(i)
1721
1722 end subroutine s_phase_internal_energy
1723
1724 !> Bulk modulus rho c^2 of phase i at pressure pres: f_bulk_modulus for a constant-coefficient fluid, bit for bit, minus the
1725 !! reference-curve terms rho (dPi/drho + p dGamma/drho)/Gamma otherwise.
1726 subroutine s_phase_bulk_modulus(pres, alpha, alpha_rho, i, blkmod)
1727
1728
1729# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1730#ifdef _CRAYFTN
1731# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1732#if MFC_OpenACC
1733# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1734!$acc routine seq
1735# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1736#elif MFC_OpenMP
1737# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1738
1739# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1740
1741# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1742!$omp declare target device_type(any)
1743# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1744#else
1745# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1746!DIR$ INLINEALWAYS s_phase_bulk_modulus
1747# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1748#endif
1749# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1750#elif MFC_OpenACC
1751# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1752!$acc routine seq
1753# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1754#elif MFC_OpenMP
1755# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1756
1757# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1758
1759# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1760!$omp declare target device_type(any)
1761# 514 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1762#endif
1763
1764 real(wp), intent(in) :: alpha_rho, alpha, pres
1765 integer, intent(in) :: i
1766 real(wp), intent(out) :: blkmod
1767 real(wp) :: rho, gamma, pi_inf, dpi, dgamma
1768
1769 call s_phase_coefficients(alpha_rho, alpha, i, rho, gamma, pi_inf, dpi, dgamma)
1770 blkmod = f_bulk_modulus(pres, gamma, pi_inf) - rho*(dpi + pres*dgamma)/gamma
1771
1772 end subroutine s_phase_bulk_modulus
1773
1774 !> Pressure of a stiffened gas from its internal energy density - the inverse of s_compute_energy. Callers subtract the kinetic,
1775 !! magnetic and elastic energy first; none of those are equation-of-state terms.
1776 function f_pressure(e_int, gamma, pi_inf, qv) result(pres)
1777
1778
1779# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1780#ifdef _CRAYFTN
1781# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1782#if MFC_OpenACC
1783# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1784!$acc routine seq
1785# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1786#elif MFC_OpenMP
1787# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1788
1789# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1790
1791# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1792!$omp declare target device_type(any)
1793# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1794#else
1795# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1796!DIR$ INLINEALWAYS f_pressure
1797# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1798#endif
1799# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1800#elif MFC_OpenACC
1801# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1802!$acc routine seq
1803# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1804#elif MFC_OpenMP
1805# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1806
1807# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1808
1809# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1810!$omp declare target device_type(any)
1811# 530 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1812#endif
1813
1814 real(wp), intent(in) :: e_int, gamma, pi_inf, qv
1815 real(wp) :: pres
1816
1817 pres = (e_int - pi_inf - qv)/gamma
1818
1819 end function f_pressure
1820
1821 !> Isentropic bulk modulus. Takes coefficients rather than a fluid index, so a mixture - whose effective gamma and pi_inf come
1822 !! from s_compute_mixture_coefficients - is the same call as a single fluid. Elastic callers add their own shear term.
1823 function f_bulk_modulus(pres, gamma, pi_inf) result(blkmod)
1824
1825
1826# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1827#ifdef _CRAYFTN
1828# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1829#if MFC_OpenACC
1830# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1831!$acc routine seq
1832# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1833#elif MFC_OpenMP
1834# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1835
1836# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1837
1838# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1839!$omp declare target device_type(any)
1840# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1841#else
1842# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1843!DIR$ INLINEALWAYS f_bulk_modulus
1844# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1845#endif
1846# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1847#elif MFC_OpenACC
1848# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1849!$acc routine seq
1850# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1851#elif MFC_OpenMP
1852# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1853
1854# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1855
1856# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1857!$omp declare target device_type(any)
1858# 543 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1859#endif
1860
1861 real(wp), intent(in) :: pres, gamma, pi_inf
1862 real(wp) :: blkmod
1863
1864 blkmod = ((gamma + 1._wp)*pres + pi_inf)/gamma
1865
1866 end function f_bulk_modulus
1867
1868 !> Relativistic specific enthalpy, h = 1 + (Gamma + 1)p/rho. Ideal gas only: the stiffness does not appear, so a fluid with a
1869 !! nonzero pi_inf is not represented here (the validator refuses that combination).
1870 function f_relativistic_enthalpy(pres, rho, gamma) result(H)
1871
1872
1873# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1874#ifdef _CRAYFTN
1875# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1876#if MFC_OpenACC
1877# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1878!$acc routine seq
1879# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1880#elif MFC_OpenMP
1881# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1882
1883# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1884
1885# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1886!$omp declare target device_type(any)
1887# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1888#else
1889# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1890!DIR$ INLINEALWAYS f_relativistic_enthalpy
1891# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1892#endif
1893# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1894#elif MFC_OpenACC
1895# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1896!$acc routine seq
1897# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1898#elif MFC_OpenMP
1899# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1900
1901# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1902
1903# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1904!$omp declare target device_type(any)
1905# 556 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1906#endif
1907
1908 real(wp), intent(in) :: pres, rho, gamma
1909 real(wp) :: h
1910
1911 h = 1._wp + (gamma + 1._wp)*pres/rho
1912
1913 end function f_relativistic_enthalpy
1914
1915 !> Mixture coefficients of one state. Under bubbles_euler with num_fluids == 1 the sole advection slot aliases the void fraction
1916 !! (eqn_idx%alf == eqn_idx%adv%end), so alpha is not a composition there and the coefficients are the liquid's. Clipping stays
1917 !! with callers; it differs between solvers and cannot coincide with that case, as mpp_lim requires num_fluids > 1.
1918 subroutine s_compute_mixture_coefficients(alpha_rho_K, alpha_K, rho_K, gamma_K, pi_inf_K, qv_K)
1919
1920
1921# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1922#ifdef _CRAYFTN
1923# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1924#if MFC_OpenACC
1925# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1926!$acc routine seq
1927# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1928#elif MFC_OpenMP
1929# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1930
1931# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1932
1933# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1934!$omp declare target device_type(any)
1935# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1936#else
1937# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1938!DIR$ INLINEALWAYS s_compute_mixture_coefficients
1939# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1940#endif
1941# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1942#elif MFC_OpenACC
1943# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1944!$acc routine seq
1945# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1946#elif MFC_OpenMP
1947# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1948
1949# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1950
1951# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1952!$omp declare target device_type(any)
1953# 570 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1954#endif
1955
1956# 575 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1957 real(wp), dimension(num_fluids), intent(in) :: alpha_rho_k, alpha_k
1958# 577 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1959 real(wp), intent(out) :: rho_k, gamma_k, pi_inf_k, qv_k
1960 real(wp) :: gamma_i, pi_inf_i, dpi_i, dgamma_i
1961 real(wp) :: rho_i, alpha_i, alpha_rho_i
1962 integer :: i !< Loop iterator over fluids
1963
1964 ! The bubbly closure is written for one carrier liquid, which keeps its own coefficients
1965 ! undiluted: Gamma_l*p_l = (E - rho|u|^2/2)/(1 - alf) - Pi_inf_l, the void entering only through
1966 ! the (1 - alf) that s_compute_pressure applies. There is nothing to sum - the last advection
1967 ! slot is the void, not a material - and the checker holds num_fluids <= 2 here.
1968 if (bubbles_euler) then
1969 rho_k = alpha_rho_k(1)
1970 gamma_k = gammas(1)
1971 pi_inf_k = pi_infs(1)
1972 ! Energy per unit volume, as below: alpha_rho_K(1) is the liquid partial density
1973 qv_k = alpha_rho_k(1)*qvs(1)
1974 else
1975 rho_k = 0._wp
1976 gamma_k = 0._wp
1977 pi_inf_k = 0._wp
1978 qv_k = 0._wp
1979
1980
1981# 598 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1982#if defined(MFC_OpenACC)
1983# 598 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1984!$acc loop seq
1985# 598 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1986#elif defined(MFC_OpenMP)
1987# 598 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1988
1989# 598 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
1990#endif
1991 do i = 1, num_fluids
1992 rho_k = rho_k + alpha_rho_k(i)
1993 alpha_rho_i = alpha_rho_k(i)
1994 alpha_i = alpha_k(i)
1995 call s_phase_coefficients(alpha_rho_i, alpha_i, i, rho_i, gamma_i, pi_inf_i, dpi_i, dgamma_i)
1996 gamma_k = gamma_k + alpha_k(i)*gamma_i
1997 pi_inf_k = pi_inf_k + alpha_k(i)*pi_inf_i
1998 qv_k = qv_k + alpha_rho_k(i)*qvs(i)
1999 end do
2000 end if
2001
2002 end subroutine s_compute_mixture_coefficients
2003
2004 !> Time derivative of the mixture coefficients, mirroring s_compute_mixture_coefficients.
2005 subroutine s_compute_mixture_coefficients_dt(dalpha_rho_dt, dadv_dt, alpha_rho, adv, drho_dt, dgamma_dt, dpi_inf_dt, dqv_dt)
2006
2007
2008# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2009#ifdef _CRAYFTN
2010# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2011#if MFC_OpenACC
2012# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2013!$acc routine seq
2014# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2015#elif MFC_OpenMP
2016# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2017
2018# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2019
2020# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2021!$omp declare target device_type(any)
2022# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2023#else
2024# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2025!DIR$ INLINEALWAYS s_compute_mixture_coefficients_dt
2026# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2027#endif
2028# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2029#elif MFC_OpenACC
2030# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2031!$acc routine seq
2032# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2033#elif MFC_OpenMP
2034# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2035
2036# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2037
2038# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2039!$omp declare target device_type(any)
2040# 615 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2041#endif
2042
2043# 620 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2044 real(wp), dimension(num_fluids), intent(in) :: dalpha_rho_dt, dadv_dt, alpha_rho, adv
2045# 622 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2046 real(wp), intent(out) :: drho_dt, dgamma_dt, dpi_inf_dt, dqv_dt
2047 real(wp) :: rho_i, gamma_i, pi_inf_i, dpi_i, dgamma_i, alpha_i, alpha_rho_i
2048 integer :: i !< Loop iterator over fluids
2049
2050 dgamma_dt = 0._wp
2051 dpi_inf_dt = 0._wp
2052 dqv_dt = 0._wp
2053
2054 if (num_fluids == 1 .and. bubbles_euler) then
2055 ! Fluid 1's coefficients are constants here, so only rho varies.
2056 drho_dt = dalpha_rho_dt(1)
2057 else
2058 drho_dt = 0._wp
2059
2060
2061# 636 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2062#if defined(MFC_OpenACC)
2063# 636 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2064!$acc loop seq
2065# 636 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2066#elif defined(MFC_OpenMP)
2067# 636 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2068
2069# 636 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2070#endif
2071 do i = 1, num_fluids
2072 drho_dt = drho_dt + dalpha_rho_dt(i)
2073 alpha_rho_i = alpha_rho(i)
2074 alpha_i = adv(i)
2075 call s_phase_coefficients(alpha_rho_i, alpha_i, i, rho_i, gamma_i, pi_inf_i, dpi_i, dgamma_i)
2076 ! d(alpha X(rho_i))/dt with rho_i = alpha_rho/alpha; the alpha in dX/dt cancels
2077 dgamma_dt = dgamma_dt + dadv_dt(i)*gamma_i + dgamma_i*(dalpha_rho_dt(i) - rho_i*dadv_dt(i))
2078 dpi_inf_dt = dpi_inf_dt + dadv_dt(i)*pi_inf_i + dpi_i*(dalpha_rho_dt(i) - rho_i*dadv_dt(i))
2079 dqv_dt = dqv_dt + dalpha_rho_dt(i)*qvs(i)
2080 end do
2081 end if
2082
2084
2085 !> Speed of sound of a thermodynamic state. Enthalpy is not an argument: for a real state H, |u|^2 and qv all cancel out of c^2
2086 !! = ((Gamma + 1)p + Pi)/(Gamma rho). Averaged states, whose enthalpy is a free input, use the _avg variant.
2087 subroutine s_compute_speed_of_sound(pres, rho, gamma, pi_inf, adv, c, alpha_rho)
2088
2089
2090# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2091#if MFC_OpenACC
2092# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2093!$acc routine seq
2094# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2095#elif MFC_OpenMP
2096# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2097
2098# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2099
2100# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2101!$omp declare target device_type(any)
2102# 655 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2103#endif
2104
2105 real(wp), intent(in) :: pres, rho, gamma, pi_inf
2106# 661 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2107 real(wp), dimension(num_fluids), intent(in) :: adv
2108# 663 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2109 real(wp), intent(out) :: c
2110# 667 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2111 real(wp), dimension(num_fluids), intent(in), optional :: alpha_rho
2112# 669 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2113 real(wp) :: alf !< Subgrid void fraction; dilute by construction
2114 real(wp) :: blkmod_q, alpha_q, alpha_rho_q, gamma_q, pi_inf_q
2115 integer :: q
2116
2117 if (chemistry) then ! Reacting mixture sound speed
2118 c = sqrt((1.0_wp + 1.0_wp/gamma)*pres/rho)
2119 else if (relativity) then ! Relativistic sound speed, whose enthalpy is 1 + (Gamma + 1)p/rho
2120 c = sqrt((1._wp + 1._wp/gamma)*pres/rho/f_relativistic_enthalpy(pres, rho, gamma))
2121 else
2122 ! Every case below is a bulk modulus over a density. The equation of state enters
2123 ! only through f_bulk_modulus; the cases differ in how the phases are mixed.
2124 if (any_state_dependent_eos .and. present(alpha_rho)) then ! frozen mixing: each phase's modulus at its own density
2125 c = 0._wp
2126
2127# 682 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2128#if defined(MFC_OpenACC)
2129# 682 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2130!$acc loop seq
2131# 682 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2132#elif defined(MFC_OpenMP)
2133# 682 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2134
2135# 682 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2136#endif
2137 do q = 1, num_fluids
2138 alpha_q = adv(q)
2139 alpha_rho_q = alpha_rho(q)
2140 call s_phase_bulk_modulus(pres, alpha_q, alpha_rho_q, q, blkmod_q)
2141 if (alt_soundspeed) then
2142 c = c + adv(q)/blkmod_q
2143 else
2144 c = c + adv(q)*blkmod_q
2145 end if
2146 end do
2147 if (alt_soundspeed) then
2148 c = 1._wp/(rho*c)
2149 else
2150 c = c/rho
2151 end if
2152 else if (alt_soundspeed) then ! Wood's law: volume-weighted harmonic mean
2153 c = 0._wp
2154
2155# 700 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2156#if defined(MFC_OpenACC)
2157# 700 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2158!$acc loop seq
2159# 700 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2160#elif defined(MFC_OpenMP)
2161# 700 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2162
2163# 700 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2164#endif
2165 do q = 1, num_fluids
2166 gamma_q = gammas(q)
2167 pi_inf_q = pi_infs(q)
2168 c = c + adv(q)/f_bulk_modulus(pres, gamma_q, pi_inf_q)
2169 end do
2170 c = 1._wp/(rho*c)
2171 else if (model_eqns == model_eqns_6eq) then ! volume-weighted arithmetic mean
2172 c = 0._wp
2173
2174# 709 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2175#if defined(MFC_OpenACC)
2176# 709 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2177!$acc loop seq
2178# 709 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2179#elif defined(MFC_OpenMP)
2180# 709 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2181
2182# 709 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2183#endif
2184 do q = 1, num_fluids
2185 gamma_q = gammas(q)
2186 pi_inf_q = pi_infs(q)
2187 c = c + adv(q)*f_bulk_modulus(pres, gamma_q, pi_inf_q)
2188 end do
2189 c = c/rho
2190 else ! the mixture coefficients already carry the mixing
2191 c = f_bulk_modulus(pres, gamma, pi_inf)/rho
2192
2193 ! Subgrid bubbles: c = c_l/(1 - alf), the carrier-liquid speed with an O(alf) void
2194 ! correction. alf is dilute by construction; near one means a wrong index or an
2195 ! out-of-regime case, which the toolchain warns about at case load (#1793).
2196 if (model_eqns == model_eqns_5eq .and. bubbles_euler .and. .not. (mpp_lim .and. num_fluids > 1)) then
2197 alf = adv(num_fluids)
2198 c = c/(1._wp - alf)
2199 end if
2200 end if
2201
2202 if (mixture_err .and. c < 0._wp) then
2203 c = 100._wp*sgm_eps
2204 else
2205 c = sqrt(c)
2206 end if
2207 end if
2208
2209 end subroutine s_compute_speed_of_sound
2210
2211 !> Speed of sound of an interface-averaged state. An average of two states is not a state - its enthalpy is not the one its
2212 !! pressure and density imply - so the caller supplies H, |u|^2 and qv. Only the enthalpy-reading branches differ from
2213 !! s_compute_speed_of_sound; keep the condition below in step with the branch list there.
2214 subroutine s_compute_speed_of_sound_avg(pres, rho, gamma, pi_inf, qv, vel_sum, H, c_c, adv, c, alpha_rho)
2215
2216
2217# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2218#if MFC_OpenACC
2219# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2220!$acc routine seq
2221# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2222#elif MFC_OpenMP
2223# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2224
2225# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2226
2227# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2228!$omp declare target device_type(any)
2229# 742 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2230#endif
2231
2232 real(wp), intent(in) :: pres, rho, gamma, pi_inf, qv, vel_sum, h, c_c
2233# 748 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2234 real(wp), dimension(num_fluids), intent(in) :: adv
2235# 750 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2236 real(wp), intent(out) :: c
2237# 754 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2238 real(wp), dimension(num_fluids), intent(in), optional :: alpha_rho
2239# 756 "/home/runner/work/MFC/MFC/src/common/m_eos.fpp"
2240
2241 if (chemistry) then ! Reacting mixture sound speed
2242 if (avg_state == avg_state_roe .and. abs(c_c) > verysmall) then
2243 c = sqrt(c_c - (gamma - 1.0_wp)*(vel_sum - h))
2244 else
2245 call s_compute_speed_of_sound(pres, rho, gamma, pi_inf, adv, c, alpha_rho)
2246 end if
2247 else if (relativity) then ! Relativistic sound speed
2248 c = sqrt((1._wp + 1._wp/gamma)*pres/rho/h)
2249 else if (alt_soundspeed .or. model_eqns == model_eqns_6eq .or. (model_eqns == model_eqns_5eq .and. bubbles_euler) &
2250 & .or. any_state_dependent_eos) then
2251 call s_compute_speed_of_sound(pres, rho, gamma, pi_inf, adv, c, alpha_rho)
2252 else ! Stiffened-gas mixture, the one branch where the averaged enthalpy survives
2253 c = (h - 5.e-1*vel_sum - qv/rho)/gamma
2254
2255 if (mixture_err .and. c < 0._wp) then
2256 c = 100._wp*sgm_eps
2257 else
2258 c = sqrt(c)
2259 end if
2260 end if
2261
2262 end subroutine s_compute_speed_of_sound_avg
2263
2264end module m_eos
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter eos_mie_gruneisen
integer, parameter eos_rk4_steps
Equation of state per fluid (eos_stiffened_gas, eos_ideal_gas, eos_mie_gruneisen, eos_jwl,...
real(wp), parameter sgm_eps
Segmentation tolerance.
real(wp), parameter dflt_real
Default real value.
integer, parameter eos_vinet
integer, parameter eos_ideal_gas
integer, parameter ode_isentrope
integer, parameter ode_reference_temperature
the two ODEs s_rk4 integrates
real(wp), parameter verysmall
Very small number.
integer, parameter eos_jwl
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho).
impure subroutine, public s_finalize_eos_module()
Deallocate the fluid property arrays allocated in s_initialize_eos_module.
impure real(wp) function f_hugoniot_compression_limit(c0, s, s2, s3)
The largest compression a cubic Hugoniot fit can represent. mu(u_p) = u_p/(u_s - u_p) rises,...
subroutine, public s_phase_density_on_isentrope(i, rho_from, p_from, p_to, rho_to, c2_to)
Density of phase i on the isentrope through (rho_from, p_from) at p_to, and c^2 there: Newton on the ...
real(wp) function, public f_relativistic_enthalpy(pres, rho, gamma)
Relativistic specific enthalpy, h = 1 + (Gamma + 1)p/rho. Ideal gas only: the stiffness does not appe...
subroutine, public s_phase_bulk_modulus(pres, alpha, alpha_rho, i, blkmod)
Bulk modulus rho c^2 of phase i at pressure pres: f_bulk_modulus for a constant-coefficient fluid,...
subroutine, public s_phase_pressure_on_isentrope(pres, rho, xi, i, p_isen)
Pressure of phase i after the isentropic density change rho -> xi rho: closed form for the constant-c...
subroutine s_reference_curve(rho, i, p_ref, e_ref, dp_drho, de_drho, g0, dg0)
The reference curve of a state-dependent EOS at rho: p_ref, e_ref, their d/drho, and Gamma_G with its...
real(wp) function, public f_mixture_temperature(alpha_rho_k, pres, gamma_k, pi_inf_k)
Thermal-equilibrium mixture temperature for stiffened gas, from primitives. Algebraically identical t...
subroutine, public s_compute_speed_of_sound_avg(pres, rho, gamma, pi_inf, qv, vel_sum, h, c_c, adv, c, alpha_rho)
Speed of sound of an interface-averaged state. An average of two states is not a state - its enthalpy...
real(wp) function, public f_sg_thermal(pres, rho_or_t, n, b, cv)
Stiffened-gas thermal law p + B = (n - 1)*cv*rho*T. Pass rho to get T, or T to get rho.
subroutine, public s_phase_coefficients(alpha_rho, alpha, i, rho, gamma, pi_inf, dpi, dgamma)
Coefficients of phase i at its own density alpha_rho/alpha: the per-cell dispatch when some fluid's E...
subroutine, public s_phase_temperature(rho, pres, i, t)
Temperature of phase i at (rho, p): the stiffened-gas relation, or T_ref(rho) + (e - e_ref)/c_v.
subroutine, public s_compute_mixture_coefficients_dt(dalpha_rho_dt, dadv_dt, alpha_rho, adv, drho_dt, dgamma_dt, dpi_inf_dt, dqv_dt)
Time derivative of the mixture coefficients, mirroring s_compute_mixture_coefficients.
logical function, public f_is_state_dependent(i)
Whether the EOS of fluid i is a family whose coefficients vary with density.
subroutine s_rk4(kind, i, x0, y0, x1, y)
Fixed-step classical RK4 for the ODE kind from (x0, y0) to x1.
logical function f_has_isentropic_reference(i)
True when fluid i's reference curve is itself an isentrope (de_ref = -p_ref d(1/rho),...
subroutine s_phase_c2(rho, pres, i, c2)
Frozen sound speed squared of one phase at (rho, p) from its own coefficients. These helpers are subr...
impure subroutine, public s_initialize_eos_module()
Resolve every fluid's EOS coefficients once, before any conversion runs.
real(wp) function f_c2_from_coefficients(rho, pres, gamma, pi_inf, dpi, dgamma)
c^2 = [((Gamma + 1) p + Pi)/rho - dPi/drho - p dGamma/drho]/Gamma, the frozen speed of one phase.
real(wp) function, public f_bulk_modulus(pres, gamma, pi_inf)
Isentropic bulk modulus. Takes coefficients rather than a fluid index, so a mixture - whose effective...
subroutine s_eos_coefficients(rho, i, gamma, pi_inf, dpi, dgamma)
Gamma, Pi, dPi/drho and dGamma/drho of fluid i at density rho, the coefficients of rho e = Gamma p + ...
subroutine s_ode_slope(kind, i, x, y, dydx)
Slope of the ODE kind for fluid i: dp/drho = c^2 along an isentrope (x = rho, y = p),...
subroutine, public s_phase_internal_energy(pres, alpha, alpha_rho, i, e_phase)
Internal energy per unit volume of phase i at pressure pres: alpha (Gamma p + Pi) + alpha_rho qv,...
real(wp) function, public f_isentrope_pressure(pi_inf, gamma)
Reference pressure of that isentrope. Precomputed per fluid as isentrope_B.
subroutine, public s_compute_mixture_coefficients(alpha_rho_k, alpha_k, rho_k, gamma_k, pi_inf_k, qv_k)
Mixture coefficients of one state. Under bubbles_euler with num_fluids == 1 the sole advection slot a...
real(wp) function, public f_pressure(e_int, gamma, pi_inf, qv)
Pressure of a stiffened gas from its internal energy density - the inverse of s_compute_energy....
subroutine, public s_compute_speed_of_sound(pres, rho, gamma, pi_inf, adv, c, alpha_rho)
Speed of sound of a thermodynamic state. Enthalpy is not an argument: for a real state H,...
real(wp) function, public f_isentrope_exponent(gamma)
Exponent of the stiffened-gas isentrope p + B = const rho**n. Precomputed per fluid as isentrope_n.
Shared global parameters and equation-index setup for all three executables. Each per-target m_global...
real(wp), dimension(:), allocatable gammas
MPI communication layer: domain decomposition, halo exchange, reductions, and parallel I/O setup.
impure subroutine s_prohibit_abort(condition, message)
Print a case file error with the prohibited condition and message, then abort execution.