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