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