MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_chemistry.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
2!>
3!! @file
4!! @brief Contains module m_chemistry
5!! @author Henry Le Berre <hberre3@gatech.edu>
6
7# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
9# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
10# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
15
16# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
19
20# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21
22# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
23
24# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
25
26# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
27
28# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29
30# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31
32# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33! New line at end of file is required for FYPP
34# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
35# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
36# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
37# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
42
43# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46
47# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
48
49# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50
51# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52
53# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54
55# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56
57# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58
59# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60! New line at end of file is required for FYPP
61# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
62
63# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
64# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
65# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
66# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
68
69# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
70
71# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
72
73# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
74
75# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
76
77# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78
79# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
80
81# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
82
83# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
84
85# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86
87# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88
89# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90
91# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92
93# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
94
95# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
96
97# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
98
99# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
100
101# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
102
103# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
104
105# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
106
107# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
108
109# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110
111# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112
113# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125
126# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139! New line at end of file is required for FYPP
140# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
141# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
142# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
143# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
144# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
145# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
146# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
148
149# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
152
153# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
154
155# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
156
157# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158
159# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
160
161# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162
163# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
164
165# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166! New line at end of file is required for FYPP
167# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
168
169# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
170
171# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
172
173# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
174
175# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
176
177# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
178
179# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
180
181# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
182
183# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
184
185# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
186
187# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
188
189# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
190
191# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
192
193# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
194
195# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
196
197# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
198
199# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
200
201# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
202
203# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204
205# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206
207# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224! New line at end of file is required for FYPP
225# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
226
227! GPU parallel region (scalar reductions, maxval/minval)
228# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
229
230! GPU parallel loop over threads (most common GPU macro)
231# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
232
233! Required closing for GPU_PARALLEL_LOOP
234# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
235
236! Mark routine for device compilation
237# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
238
239! Declare device-resident data
240# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
241
242! Inner loop within a GPU parallel region
243# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
244
245! Scoped GPU data region
246# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
247
248! Host code with device pointers (for MPI with GPU buffers)
249# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
250
251! Allocate device memory (unscoped)
252# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
253
254! Free device memory
255# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
256
257! Atomic operation on device
258# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
259
260! End atomic capture block
261# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
262
263! Copy data between host and device
264# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
265
266! Synchronization barrier
267# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
268
269! Import GPU library module (openacc or omp_lib)
270# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
271
272! Emit code only for AMD compiler
273# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
274
275! Emit code for non-Cray compilers
276# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
277
278! Emit code only for Cray compiler
279# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
280
281! Emit code for non-NVIDIA compilers
282# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
283
284# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
286! New line at end of file is required for FYPP
287# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
288
289# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
290
291! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
292! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
293! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
294# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
295
296! Allocate and create GPU device memory
297# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
298
299! Free GPU device memory and deallocate
300# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
301
302! Cray-specific GPU pointer setup for vector fields
303# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
304
305! Cray-specific GPU pointer setup for scalar fields
306# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
307
308! Cray-specific GPU pointer setup for acoustic source spatials
309# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
310
311# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
314! New line at end of file is required for FYPP
315# 7 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp" 2
316# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
317! This file exists so that Fypp can be run without generating case.fpp files for
318! each target. This is useful when generating documentation, for example. This
319! should also let MFC be built with CMake directly, without invoking mfc.sh.
320
321! For pre-process.
322# 9 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
323
324! For moving immersed boundaries in simulation
325# 14 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
326# 8 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp" 2
327
328!> @brief Multi-species chemistry interface for thermodynamic properties, reaction rates, and transport coefficients
330
331 use m_thermochem, only: num_species, molecular_weights, get_temperature, get_net_production_rates, get_mole_fractions, &
332 & get_species_binary_mass_diffusivities, get_species_mass_diffusivities_mixavg, gas_constant, &
333 & get_mixture_molecular_weight, get_mixture_energy_mass, get_mixture_thermal_conductivity_mixavg, &
334 & get_species_enthalpies_rt, get_mixture_viscosity_mixavg, get_mixture_specific_heat_cp_mass, get_mixture_enthalpy_mass
335
337
338 implicit none
339
340# 26 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
341
342 type(int_bounds_info) :: isc1, isc2, isc3
343
344# 28 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
345#if defined(MFC_OpenACC)
346# 28 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
347!$acc declare create(isc1, isc2, isc3)
348# 28 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
349#elif defined(MFC_OpenMP)
350# 28 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
351!$omp declare target (isc1, isc2, isc3)
352# 28 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
353#endif
354 integer, dimension(3) :: offsets
355
356# 30 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
357#if defined(MFC_OpenACC)
358# 30 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
359!$acc declare create(offsets)
360# 30 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
361#elif defined(MFC_OpenMP)
362# 30 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
363!$omp declare target (offsets)
364# 30 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
365#endif
366
367contains
368
369 !> Compute mixture viscosities for left and right states and invert them for use as reciprocal Reynolds numbers.
370 subroutine compute_viscosity_and_inversion(T_L, Ys_L, T_R, Ys_R, Re_L, Re_R)
371
372
373# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
374#ifdef _CRAYFTN
375# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
376#if MFC_OpenACC
377# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
378!$acc routine seq
379# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
380#elif MFC_OpenMP
381# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
382
383# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
384
385# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
386!$omp declare target device_type(any)
387# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
388#else
389# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
390!DIR$ INLINEALWAYS compute_viscosity_and_inversion
391# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
392#endif
393# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
394#elif MFC_OpenACC
395# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
396!$acc routine seq
397# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
398#elif MFC_OpenMP
399# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
400
401# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
402
403# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
404!$omp declare target device_type(any)
405# 37 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
406#endif
407
408 real(wp), intent(inout) :: T_L, T_R, Re_L, Re_R
409 real(wp), dimension(num_species), intent(inout) :: Ys_R, Ys_L
410
411 call get_mixture_viscosity_mixavg(t_l, ys_l, re_l)
412 call get_mixture_viscosity_mixavg(t_r, ys_r, re_r)
413 ! Convert dynamic viscosity to inverse (MFC stores 1/mu for Reynolds number convention)
414 re_l = 1.0_wp/re_l
415 re_r = 1.0_wp/re_r
416
418
419 !> Initialize the temperature field from conservative variables by inverting the energy equation.
420 subroutine s_compute_q_t_sf(q_T_sf, q_cons_vf, bounds)
421
422 ! Initialize the temperature field at the start of the simulation to reasonable values. Temperature is computed the regular
423 ! way using the conservative variables.
424
425 type(scalar_field), intent(inout) :: q_T_sf
426 type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf
427 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
428 integer :: x, y, z, eqn
429 real(wp) :: energy, T_in
430 real(wp), dimension(num_species) :: Ys
431
432 do z = bounds(3)%beg, bounds(3)%end
433 do y = bounds(2)%beg, bounds(2)%end
434 do x = bounds(1)%beg, bounds(1)%end
435 do eqn = chemxb, chemxe
436 ys(eqn - chemxb + 1) = q_cons_vf(eqn)%sf(x, y, z)/q_cons_vf(contxb)%sf(x, y, z)
437 end do
438
439 ! e = E - 1/2*|u|^2 cons. E_idx = \rho E cons. contxb = \rho (1-fluid model) cons. momxb + i = \rho u_i
440 energy = q_cons_vf(e_idx)%sf(x, y, z)/q_cons_vf(contxb)%sf(x, y, z)
441 do eqn = momxb, momxe
442 energy = energy - 0.5_wp*(q_cons_vf(eqn)%sf(x, y, z)/q_cons_vf(contxb)%sf(x, y, z))**2._wp
443 end do
444
445 t_in = real(q_t_sf%sf(x, y, z), kind=wp)
446 call get_temperature(energy, dflt_t_guess, ys, .true., t_in)
447 q_t_sf%sf(x, y, z) = t_in
448 end do
449 end do
450 end do
451
452 end subroutine s_compute_q_t_sf
453
454 !> Compute the temperature field from primitive variables using the ideal gas law and mixture molecular weight.
455 subroutine s_compute_t_from_primitives(q_T_sf, q_prim_vf, bounds)
456
457 type(scalar_field), intent(inout) :: q_T_sf
458 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_vf
459 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
460 integer :: x, y, z, i
461 real(wp), dimension(num_species) :: Ys
462 real(wp) :: mix_mol_weight
463
464 do z = bounds(3)%beg, bounds(3)%end
465 do y = bounds(2)%beg, bounds(2)%end
466 do x = bounds(1)%beg, bounds(1)%end
467 do i = chemxb, chemxe
468 ys(i - chemxb + 1) = q_prim_vf(i)%sf(x, y, z)
469 end do
470
471 call get_mixture_molecular_weight(ys, mix_mol_weight)
472 q_t_sf%sf(x, y, z) = q_prim_vf(e_idx)%sf(x, y, z)*mix_mol_weight/(gas_constant*q_prim_vf(1)%sf(x, y, z))
473 end do
474 end do
475 end do
476
477 end subroutine s_compute_t_from_primitives
478
479 !> Add chemical reaction source terms to the species transport RHS using net production rates.
480 subroutine s_compute_chemistry_reaction_flux(rhs_vf, q_cons_qp, q_T_sf, q_prim_qp, bounds)
481
482 type(scalar_field), dimension(sys_size), intent(inout) :: rhs_vf
483 type(scalar_field), intent(inout) :: q_T_sf
484 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_qp, q_prim_qp
485 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
486 integer :: x, y, z
487 integer :: eqn
488 real(wp) :: T
489 real(wp) :: rho, omega_m
490
491# 126 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
492 real(wp), dimension(num_species) :: Ys
493 real(wp), dimension(num_species) :: omega
494# 129 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
495
496
497# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
498
499# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
500#if defined(MFC_OpenACC)
501# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
502!$acc parallel loop collapse(3) gang vector default(present) private(Ys, omega, eqn, T, rho, omega_m) copyin(bounds)
503# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
504#elif defined(MFC_OpenMP)
505# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
506
507# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
508
509# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
510
511# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
512!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(Ys, omega, eqn, T, rho, omega_m) map(to:bounds)
513# 130 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
514#endif
515 do z = bounds(3)%beg, bounds(3)%end
516 do y = bounds(2)%beg, bounds(2)%end
517 do x = bounds(1)%beg, bounds(1)%end
518
519# 134 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
520#if defined(MFC_OpenACC)
521# 134 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
522!$acc loop seq
523# 134 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
524#elif defined(MFC_OpenMP)
525# 134 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
526
527# 134 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
528#endif
529 do eqn = chemxb, chemxe
530 ys(eqn - chemxb + 1) = q_prim_qp(eqn)%sf(x, y, z)
531 end do
532
533 rho = q_cons_qp(contxe)%sf(x, y, z)
534 t = q_t_sf%sf(x, y, z)
535
536 call get_net_production_rates(rho, t, ys, omega)
537
538
539# 144 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
540#if defined(MFC_OpenACC)
541# 144 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
542!$acc loop seq
543# 144 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
544#elif defined(MFC_OpenMP)
545# 144 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
546
547# 144 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
548#endif
549 do eqn = chemxb, chemxe
550# 149 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
551 omega_m = molecular_weights(eqn - chemxb + 1)*omega(eqn - chemxb + 1)
552# 151 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
553 rhs_vf(eqn)%sf(x, y, z) = rhs_vf(eqn)%sf(x, y, z) + omega_m
554 end do
555 end do
556 end do
557 end do
558
559# 156 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
560#if defined(MFC_OpenACC)
561# 156 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
562!$acc end parallel loop
563# 156 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
564#elif defined(MFC_OpenMP)
565# 156 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
566
567# 156 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
568!$omp end target teams loop
569# 156 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
570#endif
571
573
574 !> Compute species mass diffusion fluxes at cell interfaces using mixture-averaged diffusivities.
575 subroutine s_compute_chemistry_diffusion_flux(idir, q_prim_qp, flux_src_vf, irx, iry, irz)
576
577 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_qp
578 type(scalar_field), dimension(sys_size), intent(inout) :: flux_src_vf
579 type(int_bounds_info), intent(in) :: irx, iry, irz
580 integer, intent(in) :: idir
581
582# 174 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
583 real(wp), dimension(num_species) :: Xs_L, Xs_R, Xs_cell, Ys_L, Ys_R, Ys_cell
584 real(wp), dimension(num_species) :: mass_diffusivities_mixavg1, mass_diffusivities_mixavg2
585 real(wp), dimension(num_species) :: mass_diffusivities_mixavg_Cell, dXk_dxi, h_l, h_r, h_k
586 real(wp), dimension(num_species) :: Mass_Diffu_Flux, dYk_dxi
587# 179 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
588
589 real(wp) :: Mass_Diffu_Energy
590 real(wp) :: MW_L, MW_R, MW_cell, Rgas_L, Rgas_R, T_L, T_R, P_L, P_R, rho_L, rho_R, rho_cell, rho_Vic
591 real(wp) :: lambda_L, lambda_R, lambda_Cell, dT_dxi, grid_spacing
592 real(wp) :: Cp_L, Cp_R
593 real(wp) :: diffusivity_L, diffusivity_R, diffusivity_cell
594 real(wp) :: hmix_L, hmix_R, dh_dxi
595 integer :: x, y, z, i, n, eqn
596 integer, dimension(3) :: offsets
597
598 isc1 = irx; isc2 = iry; isc3 = irz
599
600
601# 191 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
602#if defined(MFC_OpenACC)
603# 191 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
604!$acc update device(isc1, isc2, isc3)
605# 191 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
606#elif defined(MFC_OpenMP)
607# 191 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
608!$omp target update to(isc1, isc2, isc3)
609# 191 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
610#endif
611
612 if (chemistry .or. dummy) then
613 ! Set offsets based on direction using array indexing
614 offsets = 0
615 offsets(idir) = 1
616 ! Model 1: Mixture-Average Transport
617 if (chem_params%transport_model == 1) then
618 ! Note: Added 'i' and 'eqn' to private list.
619
620# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
621
622# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
623#if defined(MFC_OpenACC)
624# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
625!$acc parallel loop collapse(3) gang vector default(present) private(x, y, z, i, eqn, Ys_L, Ys_R, Ys_cell, Xs_L, Xs_R, mass_diffusivities_mixavg1, mass_diffusivities_mixavg2, mass_diffusivities_mixavg_Cell, h_l, h_r, Xs_cell, h_k, dXk_dxi, Mass_Diffu_Flux, Mass_Diffu_Energy, MW_L, MW_R, MW_cell, Rgas_L, Rgas_R, T_L, T_R, P_L, P_R, rho_L, rho_R, rho_cell, rho_Vic, lambda_L, lambda_R, lambda_Cell, dT_dxi, grid_spacing) copyin(offsets)
626# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
627#elif defined(MFC_OpenMP)
628# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
629
630# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
631
632# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
633
634# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
635!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(x, y, z, i, eqn, Ys_L, Ys_R, Ys_cell, Xs_L, Xs_R, mass_diffusivities_mixavg1, mass_diffusivities_mixavg2, mass_diffusivities_mixavg_Cell, h_l, h_r, Xs_cell, h_k, dXk_dxi, Mass_Diffu_Flux, Mass_Diffu_Energy, MW_L, MW_R, MW_cell, Rgas_L, Rgas_R, T_L, T_R, P_L, P_R, rho_L, rho_R, rho_cell, rho_Vic, lambda_L, lambda_R, lambda_Cell, dT_dxi, grid_spacing) map(to:offsets)
636# 200 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
637#endif
638# 205 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
639 do z = isc3%beg, isc3%end
640 do y = isc2%beg, isc2%end
641 do x = isc1%beg, isc1%end
642 ! Calculate grid spacing using direction-based indexing
643 select case (idir)
644 case (1)
645 grid_spacing = x_cc(x + 1) - x_cc(x)
646 case (2)
647 grid_spacing = y_cc(y + 1) - y_cc(y)
648 case (3)
649 grid_spacing = z_cc(z + 1) - z_cc(z)
650 end select
651
652 ! Extract species mass fractions
653
654# 219 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
655#if defined(MFC_OpenACC)
656# 219 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
657!$acc loop seq
658# 219 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
659#elif defined(MFC_OpenMP)
660# 219 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
661
662# 219 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
663#endif
664 do i = chemxb, chemxe
665 ys_l(i - chemxb + 1) = q_prim_qp(i)%sf(x, y, z)
666 ys_r(i - chemxb + 1) = q_prim_qp(i)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
667 ys_cell(i - chemxb + 1) = 0.5_wp*(ys_l(i - chemxb + 1) + ys_r(i - chemxb + 1))
668 end do
669
670 ! Calculate molecular weights and mole fractions
671 call get_mixture_molecular_weight(ys_l, mw_l)
672 call get_mixture_molecular_weight(ys_r, mw_r)
673 mw_cell = 0.5_wp*(mw_l + mw_r)
674
675 call get_mole_fractions(mw_l, ys_l, xs_l)
676 call get_mole_fractions(mw_r, ys_r, xs_r)
677
678 ! Calculate gas constants and thermodynamic properties
679 rgas_l = gas_constant/mw_l
680 rgas_r = gas_constant/mw_r
681
682 p_l = q_prim_qp(e_idx)%sf(x, y, z)
683 p_r = q_prim_qp(e_idx)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
684
685 rho_l = q_prim_qp(1)%sf(x, y, z)
686 rho_r = q_prim_qp(1)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
687
688 t_l = p_l/rho_l/rgas_l
689 t_r = p_r/rho_r/rgas_r
690
691 rho_cell = 0.5_wp*(rho_l + rho_r)
692 dt_dxi = (t_r - t_l)/grid_spacing
693
694 ! Get transport properties
695 call get_species_mass_diffusivities_mixavg(p_l, t_l, ys_l, mass_diffusivities_mixavg1)
696 call get_species_mass_diffusivities_mixavg(p_r, t_r, ys_r, mass_diffusivities_mixavg2)
697
698 call get_mixture_thermal_conductivity_mixavg(t_l, ys_l, lambda_l)
699 call get_mixture_thermal_conductivity_mixavg(t_r, ys_r, lambda_r)
700
701 call get_species_enthalpies_rt(t_l, h_l)
702 call get_species_enthalpies_rt(t_r, h_r)
703
704 ! Calculate species properties and gradients
705
706# 261 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
707#if defined(MFC_OpenACC)
708# 261 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
709!$acc loop seq
710# 261 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
711#elif defined(MFC_OpenMP)
712# 261 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
713
714# 261 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
715#endif
716 do i = chemxb, chemxe
717# 269 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
718 h_l(i - chemxb + 1) = h_l(i - chemxb + 1)*gas_constant*t_l/molecular_weights(i - chemxb + 1)
719 h_r(i - chemxb + 1) = h_r(i - chemxb + 1)*gas_constant*t_r/molecular_weights(i - chemxb + 1)
720# 272 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
721 xs_cell(i - chemxb + 1) = 0.5_wp*(xs_l(i - chemxb + 1) + xs_r(i - chemxb + 1))
722 h_k(i - chemxb + 1) = 0.5_wp*(h_l(i - chemxb + 1) + h_r(i - chemxb + 1))
723 dxk_dxi(i - chemxb + 1) = (xs_r(i - chemxb + 1) - xs_l(i - chemxb + 1))/grid_spacing
724 end do
725
726 ! Calculate mixture-averaged diffusivities
727
728# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
729#if defined(MFC_OpenACC)
730# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
731!$acc loop seq
732# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
733#elif defined(MFC_OpenMP)
734# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
735
736# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
737#endif
738 do i = chemxb, chemxe
739 mass_diffusivities_mixavg_cell(i - chemxb + 1) = (mass_diffusivities_mixavg2(i - chemxb + 1) &
740 & + mass_diffusivities_mixavg1(i - chemxb + 1))/2.0_wp
741 end do
742
743 lambda_cell = 0.5_wp*(lambda_r + lambda_l)
744
745 ! Calculate mass diffusion fluxes
746 rho_vic = 0.0_wp
747 mass_diffu_energy = 0.0_wp
748
749
750# 290 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
751#if defined(MFC_OpenACC)
752# 290 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
753!$acc loop seq
754# 290 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
755#elif defined(MFC_OpenMP)
756# 290 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
757
758# 290 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
759#endif
760 do eqn = chemxb, chemxe
761# 297 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
762 mass_diffu_flux(eqn - chemxb + 1) = rho_cell*mass_diffusivities_mixavg_cell(eqn - chemxb + 1) &
763 & *molecular_weights(eqn - chemxb + 1)/mw_cell*dxk_dxi(eqn - chemxb + 1)
764# 300 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
765 rho_vic = rho_vic + mass_diffu_flux(eqn - chemxb + 1)
766 mass_diffu_energy = mass_diffu_energy + h_k(eqn - chemxb + 1)*mass_diffu_flux(eqn - chemxb + 1)
767 end do
768
769 ! Apply corrections for mass conservation
770
771# 305 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
772#if defined(MFC_OpenACC)
773# 305 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
774!$acc loop seq
775# 305 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
776#elif defined(MFC_OpenMP)
777# 305 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
778
779# 305 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
780#endif
781 do eqn = chemxb, chemxe
782 mass_diffu_energy = mass_diffu_energy - h_k(eqn - chemxb + 1)*ys_cell(eqn - chemxb + 1)*rho_vic
783 mass_diffu_flux(eqn - chemxb + 1) = mass_diffu_flux(eqn - chemxb + 1) - rho_vic*ys_cell(eqn &
784 & - chemxb + 1)
785 end do
786
787 ! Add thermal conduction contribution
788 mass_diffu_energy = lambda_cell*dt_dxi + mass_diffu_energy
789
790 ! Update flux arrays
791 flux_src_vf(e_idx)%sf(x, y, z) = flux_src_vf(e_idx)%sf(x, y, z) - mass_diffu_energy
792
793
794# 318 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
795#if defined(MFC_OpenACC)
796# 318 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
797!$acc loop seq
798# 318 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
799#elif defined(MFC_OpenMP)
800# 318 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
801
802# 318 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
803#endif
804 do eqn = chemxb, chemxe
805 flux_src_vf(eqn)%sf(x, y, z) = flux_src_vf(eqn)%sf(x, y, z) - mass_diffu_flux(eqn - chemxb + 1)
806 end do
807 end do
808 end do
809 end do
810
811# 325 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
812#if defined(MFC_OpenACC)
813# 325 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
814!$acc end parallel loop
815# 325 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
816#elif defined(MFC_OpenMP)
817# 325 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
818
819# 325 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
820!$omp end target teams loop
821# 325 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
822#endif
823
824 ! Model 2: Unity Lewis Number
825 else if (chem_params%transport_model == 2) then
826 ! Note: Added ALL scalars and 'i'/'eqn' to private list to prevent race conditions.
827
828# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
829
830# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
831#if defined(MFC_OpenACC)
832# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
833!$acc parallel loop collapse(3) gang vector default(present) private(x, y, z, i, eqn, Ys_L, Ys_R, Ys_cell, dYk_dxi, Mass_Diffu_Flux, grid_spacing, MW_L, MW_R, MW_cell, Rgas_L, Rgas_R, P_L, P_R, rho_L, rho_R, rho_cell, T_L, T_R, Cp_L, Cp_R, hmix_L, hmix_R, dh_dxi, lambda_L, lambda_R, lambda_Cell, diffusivity_L, diffusivity_R, diffusivity_cell, Mass_Diffu_Energy) copyin(offsets)
834# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
835#elif defined(MFC_OpenMP)
836# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
837
838# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
839
840# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
841
842# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
843!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(x, y, z, i, eqn, Ys_L, Ys_R, Ys_cell, dYk_dxi, Mass_Diffu_Flux, grid_spacing, MW_L, MW_R, MW_cell, Rgas_L, Rgas_R, P_L, P_R, rho_L, rho_R, rho_cell, T_L, T_R, Cp_L, Cp_R, hmix_L, hmix_R, dh_dxi, lambda_L, lambda_R, lambda_Cell, diffusivity_L, diffusivity_R, diffusivity_cell, Mass_Diffu_Energy) map(to:offsets)
844# 330 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
845#endif
846# 334 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
847 do z = isc3%beg, isc3%end
848 do y = isc2%beg, isc2%end
849 do x = isc1%beg, isc1%end
850 ! Calculate grid spacing using direction-based indexing
851 select case (idir)
852 case (1)
853 grid_spacing = x_cc(x + 1) - x_cc(x)
854 case (2)
855 grid_spacing = y_cc(y + 1) - y_cc(y)
856 case (3)
857 grid_spacing = z_cc(z + 1) - z_cc(z)
858 end select
859
860 ! Extract species mass fractions
861
862# 348 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
863#if defined(MFC_OpenACC)
864# 348 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
865!$acc loop seq
866# 348 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
867#elif defined(MFC_OpenMP)
868# 348 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
869
870# 348 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
871#endif
872 do i = chemxb, chemxe
873 ys_l(i - chemxb + 1) = q_prim_qp(i)%sf(x, y, z)
874 ys_r(i - chemxb + 1) = q_prim_qp(i)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
875 ys_cell(i - chemxb + 1) = 0.5_wp*(ys_l(i - chemxb + 1) + ys_r(i - chemxb + 1))
876 end do
877
878 ! Calculate molecular weights and mole fractions
879 call get_mixture_molecular_weight(ys_l, mw_l)
880 call get_mixture_molecular_weight(ys_r, mw_r)
881 mw_cell = 0.5_wp*(mw_l + mw_r)
882
883 ! Calculate gas constants and thermodynamic properties
884 rgas_l = gas_constant/mw_l
885 rgas_r = gas_constant/mw_r
886
887 p_l = q_prim_qp(e_idx)%sf(x, y, z)
888 p_r = q_prim_qp(e_idx)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
889
890 rho_l = q_prim_qp(1)%sf(x, y, z)
891 rho_r = q_prim_qp(1)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
892
893 t_l = p_l/rho_l/rgas_l
894 t_r = p_r/rho_r/rgas_r
895
896 rho_cell = 0.5_wp*(rho_l + rho_r)
897
898 call get_mixture_specific_heat_cp_mass(t_l, ys_l, cp_l)
899 call get_mixture_specific_heat_cp_mass(t_r, ys_r, cp_r)
900 call get_mixture_enthalpy_mass(t_l, ys_l, hmix_l)
901 call get_mixture_enthalpy_mass(t_r, ys_r, hmix_r)
902 dh_dxi = (hmix_r - hmix_l)/grid_spacing
903
904 ! Get transport properties
905 call get_mixture_thermal_conductivity_mixavg(t_l, ys_l, lambda_l)
906 call get_mixture_thermal_conductivity_mixavg(t_r, ys_r, lambda_r)
907
908 ! Calculate species properties and gradients
909
910# 386 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
911#if defined(MFC_OpenACC)
912# 386 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
913!$acc loop seq
914# 386 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
915#elif defined(MFC_OpenMP)
916# 386 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
917
918# 386 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
919#endif
920 do i = chemxb, chemxe
921 dyk_dxi(i - chemxb + 1) = (ys_r(i - chemxb + 1) - ys_l(i - chemxb + 1))/grid_spacing
922 end do
923
924 ! Calculate mixture-averaged diffusivities
925 diffusivity_l = lambda_l/rho_l/cp_l
926 diffusivity_r = lambda_r/rho_r/cp_r
927
928 lambda_cell = 0.5_wp*(lambda_r + lambda_l)
929 diffusivity_cell = 0.5_wp*(diffusivity_r + diffusivity_l)
930
931 ! Calculate mass diffusion fluxes
932 mass_diffu_energy = 0.0_wp
933
934
935# 401 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
936#if defined(MFC_OpenACC)
937# 401 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
938!$acc loop seq
939# 401 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
940#elif defined(MFC_OpenMP)
941# 401 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
942
943# 401 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
944#endif
945 do eqn = chemxb, chemxe
946 mass_diffu_flux(eqn - chemxb + 1) = rho_cell*diffusivity_cell*dyk_dxi(eqn - chemxb + 1)
947 end do
948 mass_diffu_energy = rho_cell*diffusivity_cell*dh_dxi
949
950 ! Update flux arrays
951 flux_src_vf(e_idx)%sf(x, y, z) = flux_src_vf(e_idx)%sf(x, y, z) - mass_diffu_energy
952
953
954# 410 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
955#if defined(MFC_OpenACC)
956# 410 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
957!$acc loop seq
958# 410 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
959#elif defined(MFC_OpenMP)
960# 410 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
961
962# 410 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
963#endif
964 do eqn = chemxb, chemxe
965 flux_src_vf(eqn)%sf(x, y, z) = flux_src_vf(eqn)%sf(x, y, z) - mass_diffu_flux(eqn - chemxb + 1)
966 end do
967 end do
968 end do
969 end do
970
971# 417 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
972#if defined(MFC_OpenACC)
973# 417 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
974!$acc end parallel loop
975# 417 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
976#elif defined(MFC_OpenMP)
977# 417 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
978
979# 417 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
980!$omp end target teams loop
981# 417 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
982#endif
983 end if
984 end if
985
987
988end module m_chemistry
Multi-species chemistry interface for thermodynamic properties, reaction rates, and transport coeffic...
subroutine s_compute_chemistry_diffusion_flux(idir, q_prim_qp, flux_src_vf, irx, iry, irz)
Compute species mass diffusion fluxes at cell interfaces using mixture-averaged diffusivities.
subroutine s_compute_q_t_sf(q_t_sf, q_cons_vf, bounds)
Initialize the temperature field from conservative variables by inverting the energy equation.
type(int_bounds_info) isc2
subroutine s_compute_chemistry_reaction_flux(rhs_vf, q_cons_qp, q_t_sf, q_prim_qp, bounds)
Add chemical reaction source terms to the species transport RHS using net production rates.
integer, dimension(3) offsets
type(int_bounds_info) isc1
type(int_bounds_info) isc3
subroutine compute_viscosity_and_inversion(t_l, ys_l, t_r, ys_r, re_l, re_r)
Compute mixture viscosities for left and right states and invert them for use as reciprocal Reynolds ...
subroutine s_compute_t_from_primitives(q_t_sf, q_prim_vf, bounds)
Compute the temperature field from primitive variables using the ideal gas law and mixture molecular ...
Global parameters for the post-process: domain geometry, equation of state, and output database setti...
logical, parameter chemistry
Chemistry modeling.
real(wp), dimension(:), allocatable y_cc
logical dummy
AMDFlang workaround for case-optimization + GPU-kernel bug.
real(wp), dimension(:), allocatable x_cc
type(chemistry_parameters) chem_params
real(wp), dimension(:), allocatable z_cc
integer e_idx
Index of energy equation.