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# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
323
324! For moving immersed boundaries in simulation
325# 12 "/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 type(int_bounds_info) :: isc1, isc2, isc3
341
342# 22 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
343#if defined(MFC_OpenACC)
344# 22 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
345!$acc declare create(isc1, isc2, isc3)
346# 22 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
347#elif defined(MFC_OpenMP)
348# 22 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
349!$omp declare target (isc1, isc2, isc3)
350# 22 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
351#endif
352 integer, dimension(3) :: offsets
353
354# 24 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
355#if defined(MFC_OpenACC)
356# 24 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
357!$acc declare create(offsets)
358# 24 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
359#elif defined(MFC_OpenMP)
360# 24 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
361!$omp declare target (offsets)
362# 24 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
363#endif
364
365contains
366
367 !> Compute mixture viscosities for left and right states and invert them for use as reciprocal Reynolds numbers.
368 subroutine compute_viscosity_and_inversion(T_L, Ys_L, T_R, Ys_R, Re_L, Re_R)
369
370
371# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
372#ifdef _CRAYFTN
373# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
374#if MFC_OpenACC
375# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
376!$acc routine seq
377# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
378#elif MFC_OpenMP
379# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
380
381# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
382
383# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
384!$omp declare target device_type(any)
385# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
386#else
387# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
388!DIR$ INLINEALWAYS compute_viscosity_and_inversion
389# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
390#endif
391# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
392#elif MFC_OpenACC
393# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
394!$acc routine seq
395# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
396#elif MFC_OpenMP
397# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
398
399# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
400
401# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
402!$omp declare target device_type(any)
403# 31 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
404#endif
405
406 real(wp), intent(inout) :: T_L, T_R, Re_L, Re_R
407 real(wp), dimension(num_species), intent(inout) :: Ys_R, Ys_L
408
409 call get_mixture_viscosity_mixavg(t_l, ys_l, re_l)
410 call get_mixture_viscosity_mixavg(t_r, ys_r, re_r)
411 ! Convert dynamic viscosity to inverse (MFC stores 1/mu for Reynolds number convention)
412 re_l = 1.0_wp/re_l
413 re_r = 1.0_wp/re_r
414
416
417 !> Initialize the temperature field from conservative variables by inverting the energy equation.
418 subroutine s_compute_q_t_sf(q_T_sf, q_cons_vf, bounds)
419
420 ! Initialize the temperature field at the start of the simulation to reasonable values. Temperature is computed the regular
421 ! way using the conservative variables.
422
423 type(scalar_field), intent(inout) :: q_T_sf
424 type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf
425 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
426 integer :: x, y, z, eqn
427 real(wp) :: energy, T_in
428 real(wp), dimension(num_species) :: Ys
429
430 do z = bounds(3)%beg, bounds(3)%end
431 do y = bounds(2)%beg, bounds(2)%end
432 do x = bounds(1)%beg, bounds(1)%end
433 do eqn = eqn_idx%species%beg, eqn_idx%species%end
434 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)
435 end do
436
437 ! 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
438 ! + i = \rho u_i
439 energy = q_cons_vf(eqn_idx%E)%sf(x, y, z)/q_cons_vf(eqn_idx%cont%beg)%sf(x, y, z)
440 do eqn = eqn_idx%mom%beg, eqn_idx%mom%end
441 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
442 end do
443
444 t_in = real(q_t_sf%sf(x, y, z), kind=wp)
445 call get_temperature(energy, dflt_t_guess, ys, .true., t_in)
446 q_t_sf%sf(x, y, z) = t_in
447 end do
448 end do
449 end do
450
451 end subroutine s_compute_q_t_sf
452
453 !> Compute the temperature field from primitive variables using the ideal gas law and mixture molecular weight.
454 subroutine s_compute_t_from_primitives(q_T_sf, q_prim_vf, bounds)
455
456 type(scalar_field), intent(inout) :: q_T_sf
457 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_vf
458 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
459 integer :: x, y, z, i
460 real(wp), dimension(num_species) :: Ys
461 real(wp) :: mix_mol_weight
462
463 do z = bounds(3)%beg, bounds(3)%end
464 do y = bounds(2)%beg, bounds(2)%end
465 do x = bounds(1)%beg, bounds(1)%end
466 do i = eqn_idx%species%beg, eqn_idx%species%end
467 ys(i - eqn_idx%species%beg + 1) = q_prim_vf(i)%sf(x, y, z)
468 end do
469
470 call get_mixture_molecular_weight(ys, mix_mol_weight)
471 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))
472 end do
473 end do
474 end do
475
476 end subroutine s_compute_t_from_primitives
477
478 !> Add chemical reaction source terms to the species transport RHS using net production rates.
479 subroutine s_compute_chemistry_reaction_flux(rhs_vf, q_cons_qp, q_T_sf, q_prim_qp, bounds)
480
481 type(scalar_field), dimension(sys_size), intent(inout) :: rhs_vf
482 type(scalar_field), intent(inout) :: q_T_sf
483 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_qp, q_prim_qp
484 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
485 integer :: x, y, z
486 integer :: eqn
487 real(wp) :: T
488 real(wp) :: rho, omega_m
489
490# 121 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
491 real(wp), dimension(num_species) :: Ys
492 real(wp), dimension(num_species) :: omega
493# 124 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
494
495
496# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
497
498# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
499#if defined(MFC_OpenACC)
500# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
501!$acc parallel loop collapse(3) gang vector default(present) private(Ys, omega, eqn, T, rho, omega_m) copyin(bounds)
502# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
503#elif defined(MFC_OpenMP)
504# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
505
506# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
507
508# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
509
510# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
511!$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)
512# 125 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
513#endif
514 do z = bounds(3)%beg, bounds(3)%end
515 do y = bounds(2)%beg, bounds(2)%end
516 do x = bounds(1)%beg, bounds(1)%end
517
518# 129 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
519#if defined(MFC_OpenACC)
520# 129 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
521!$acc loop seq
522# 129 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
523#elif defined(MFC_OpenMP)
524# 129 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
525
526# 129 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
527#endif
528 do eqn = eqn_idx%species%beg, eqn_idx%species%end
529 ys(eqn - eqn_idx%species%beg + 1) = q_prim_qp(eqn)%sf(x, y, z)
530 end do
531
532 rho = q_cons_qp(eqn_idx%cont%end)%sf(x, y, z)
533 t = q_t_sf%sf(x, y, z)
534
535 call get_net_production_rates(rho, t, ys, omega)
536
537
538# 139 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
539#if defined(MFC_OpenACC)
540# 139 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
541!$acc loop seq
542# 139 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
543#elif defined(MFC_OpenMP)
544# 139 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
545
546# 139 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
547#endif
548 do eqn = eqn_idx%species%beg, eqn_idx%species%end
549 omega_m = molecular_weights(eqn - eqn_idx%species%beg + 1)*omega(eqn - eqn_idx%species%beg + 1)
550 rhs_vf(eqn)%sf(x, y, z) = rhs_vf(eqn)%sf(x, y, z) + omega_m
551 end do
552 end do
553 end do
554 end do
555
556# 147 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
557#if defined(MFC_OpenACC)
558# 147 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
559!$acc end parallel loop
560# 147 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
561#elif defined(MFC_OpenMP)
562# 147 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
563
564# 147 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
565!$omp end target teams loop
566# 147 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
567#endif
568
570
571 !> Compute species mass diffusion fluxes at cell interfaces using mixture-averaged diffusivities.
572 subroutine s_compute_chemistry_diffusion_flux(idir, q_prim_qp, flux_src_vf, irx, iry, irz, q_T_sf)
573
574 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_qp
575 type(scalar_field), dimension(sys_size), intent(inout) :: flux_src_vf
576 type(int_bounds_info), intent(in) :: irx, iry, irz
577 integer, intent(in) :: idir
578 type(scalar_field), intent(in) :: q_T_sf
579
580# 166 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
581 real(wp), dimension(num_species) :: Xs_L, Xs_R, Xs_cell, Ys_L, Ys_R, Ys_cell
582 real(wp), dimension(num_species) :: mass_diffusivities_mixavg1, mass_diffusivities_mixavg2
583 real(wp), dimension(num_species) :: mass_diffusivities_mixavg_Cell, dXk_dxi, h_l, h_r, h_k
584 real(wp), dimension(num_species) :: Mass_Diffu_Flux, dYk_dxi
585# 171 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
586
587 real(wp) :: Mass_Diffu_Energy
588 real(wp) :: MW_L, MW_R, MW_cell, T_L, T_R, P_L, P_R, rho_L, rho_R, rho_cell, rho_Vic
589 real(wp) :: lambda_L, lambda_R, lambda_Cell, dT_dxi, grid_spacing
590 real(wp) :: Cp_L, Cp_R
591 real(wp) :: diffusivity_L, diffusivity_R, diffusivity_cell
592 real(wp) :: hmix_L, hmix_R, dh_dxi
593 integer :: x, y, z, i, n, eqn
594 integer, dimension(3) :: offsets
595
596 isc1 = irx; isc2 = iry; isc3 = irz
597
598
599# 183 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
600#if defined(MFC_OpenACC)
601# 183 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
602!$acc update device(isc1, isc2, isc3)
603# 183 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
604#elif defined(MFC_OpenMP)
605# 183 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
606!$omp target update to(isc1, isc2, isc3)
607# 183 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
608#endif
609
610 if (chemistry) then
611 ! Set offsets based on direction using array indexing
612 offsets = 0
613 offsets(idir) = 1
614 ! Model 1: Mixture-Average Transport
615 if (chem_params%transport_model == 1) then
616 ! Note: Added 'i' and 'eqn' to private list.
617
618# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
619
620# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
621#if defined(MFC_OpenACC)
622# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
623!$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, 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)
624# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
625#elif defined(MFC_OpenMP)
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
630# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
631
632# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
633!$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, 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)
634# 192 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
635#endif
636# 197 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
637 do z = isc3%beg, isc3%end
638 do y = isc2%beg, isc2%end
639 do x = isc1%beg, isc1%end
640 ! Calculate grid spacing using direction-based indexing
641 select case (idir)
642 case (1)
643 grid_spacing = x_cc(x + 1) - x_cc(x)
644 case (2)
645 grid_spacing = y_cc(y + 1) - y_cc(y)
646 case (3)
647 grid_spacing = z_cc(z + 1) - z_cc(z)
648 end select
649
650 ! Extract species mass fractions
651
652# 211 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
653#if defined(MFC_OpenACC)
654# 211 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
655!$acc loop seq
656# 211 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
657#elif defined(MFC_OpenMP)
658# 211 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
659
660# 211 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
661#endif
662 do i = eqn_idx%species%beg, eqn_idx%species%end
663 ys_l(i - eqn_idx%species%beg + 1) = q_prim_qp(i)%sf(x, y, z)
664 ys_r(i - eqn_idx%species%beg + 1) = q_prim_qp(i)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
665 ys_cell(i - eqn_idx%species%beg + 1) = 0.5_wp*(ys_l(i - eqn_idx%species%beg + 1) + ys_r(i &
666 & - eqn_idx%species%beg + 1))
667 end do
668
669 ! Calculate molecular weights and mole fractions
670 call get_mixture_molecular_weight(ys_l, mw_l)
671 call get_mixture_molecular_weight(ys_r, mw_r)
672 mw_cell = 0.5_wp*(mw_l + mw_r)
673
674 call get_mole_fractions(mw_l, ys_l, xs_l)
675 call get_mole_fractions(mw_r, ys_r, xs_r)
676
677 p_l = q_prim_qp(eqn_idx%E)%sf(x, y, z)
678 p_r = q_prim_qp(eqn_idx%E)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
679
680 rho_l = q_prim_qp(1)%sf(x, y, z)
681 rho_r = q_prim_qp(1)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
682
683 t_l = q_t_sf%sf(x, y, z)
684 t_r = q_t_sf%sf(x + offsets(1), y + offsets(2), z + offsets(3))
685
686 rho_cell = 0.5_wp*(rho_l + rho_r)
687 dt_dxi = (t_r - t_l)/grid_spacing
688
689 ! Get transport properties
690 call get_species_mass_diffusivities_mixavg(p_l, t_l, ys_l, mass_diffusivities_mixavg1)
691 call get_species_mass_diffusivities_mixavg(p_r, t_r, ys_r, mass_diffusivities_mixavg2)
692
693 call get_mixture_thermal_conductivity_mixavg(t_l, ys_l, lambda_l)
694 call get_mixture_thermal_conductivity_mixavg(t_r, ys_r, lambda_r)
695
696 call get_species_enthalpies_rt(t_l, h_l)
697 call get_species_enthalpies_rt(t_r, h_r)
698
699 ! Calculate species properties and gradients
700
701# 250 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
702#if defined(MFC_OpenACC)
703# 250 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
704!$acc loop seq
705# 250 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
706#elif defined(MFC_OpenMP)
707# 250 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
708
709# 250 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
710#endif
711 do i = eqn_idx%species%beg, eqn_idx%species%end
712 h_l(i - eqn_idx%species%beg + 1) = h_l(i - eqn_idx%species%beg + 1) &
713 & *gas_constant*t_l/molecular_weights(i - eqn_idx%species%beg + 1)
714 h_r(i - eqn_idx%species%beg + 1) = h_r(i - eqn_idx%species%beg + 1) &
715 & *gas_constant*t_r/molecular_weights(i - eqn_idx%species%beg + 1)
716 xs_cell(i - eqn_idx%species%beg + 1) = 0.5_wp*(xs_l(i - eqn_idx%species%beg + 1) + xs_r(i &
717 & - eqn_idx%species%beg + 1))
718 h_k(i - eqn_idx%species%beg + 1) = 0.5_wp*(h_l(i - eqn_idx%species%beg + 1) + h_r(i &
719 & - eqn_idx%species%beg + 1))
720 dxk_dxi(i - eqn_idx%species%beg + 1) = (xs_r(i - eqn_idx%species%beg + 1) - xs_l(i &
721 & - eqn_idx%species%beg + 1))/grid_spacing
722 end do
723
724 ! Calculate mixture-averaged diffusivities
725
726# 265 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
727#if defined(MFC_OpenACC)
728# 265 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
729!$acc loop seq
730# 265 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
731#elif defined(MFC_OpenMP)
732# 265 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
733
734# 265 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
735#endif
736 do i = eqn_idx%species%beg, eqn_idx%species%end
737 mass_diffusivities_mixavg_cell(i - eqn_idx%species%beg + 1) = (mass_diffusivities_mixavg2(i &
738 & - eqn_idx%species%beg + 1) + mass_diffusivities_mixavg1(i &
739 & - eqn_idx%species%beg + 1))/2.0_wp
740 end do
741
742 lambda_cell = 0.5_wp*(lambda_r + lambda_l)
743
744 ! Calculate mass diffusion fluxes
745 rho_vic = 0.0_wp
746 mass_diffu_energy = 0.0_wp
747
748
749# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
750#if defined(MFC_OpenACC)
751# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
752!$acc loop seq
753# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
754#elif defined(MFC_OpenMP)
755# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
756
757# 278 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
758#endif
759 do eqn = eqn_idx%species%beg, eqn_idx%species%end
760 mass_diffu_flux(eqn - eqn_idx%species%beg + 1) = rho_cell*mass_diffusivities_mixavg_cell(eqn &
761 & - eqn_idx%species%beg + 1)*molecular_weights(eqn - eqn_idx%species%beg + 1) &
762 & /mw_cell*dxk_dxi(eqn - eqn_idx%species%beg + 1)
763 rho_vic = rho_vic + mass_diffu_flux(eqn - eqn_idx%species%beg + 1)
764 mass_diffu_energy = mass_diffu_energy + h_k(eqn - eqn_idx%species%beg + 1)*mass_diffu_flux(eqn &
765 & - eqn_idx%species%beg + 1)
766 end do
767
768 ! Apply corrections for mass conservation
769
770# 289 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
771#if defined(MFC_OpenACC)
772# 289 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
773!$acc loop seq
774# 289 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
775#elif defined(MFC_OpenMP)
776# 289 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
777
778# 289 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
779#endif
780 do eqn = eqn_idx%species%beg, eqn_idx%species%end
781 mass_diffu_energy = mass_diffu_energy - h_k(eqn - eqn_idx%species%beg + 1)*ys_cell(eqn &
782 & - eqn_idx%species%beg + 1)*rho_vic
783 mass_diffu_flux(eqn - eqn_idx%species%beg + 1) = mass_diffu_flux(eqn - eqn_idx%species%beg + 1) &
784 & - rho_vic*ys_cell(eqn - eqn_idx%species%beg + 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(eqn_idx%E)%sf(x, y, z) = flux_src_vf(eqn_idx%E)%sf(x, y, z) - mass_diffu_energy
792
793
794# 303 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
795#if defined(MFC_OpenACC)
796# 303 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
797!$acc loop seq
798# 303 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
799#elif defined(MFC_OpenMP)
800# 303 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
801
802# 303 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
803#endif
804 do eqn = eqn_idx%species%beg, eqn_idx%species%end
805 flux_src_vf(eqn)%sf(x, y, z) = flux_src_vf(eqn)%sf(x, y, &
806 & z) - mass_diffu_flux(eqn - eqn_idx%species%beg + 1)
807 end do
808 end do
809 end do
810 end do
811
812# 311 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
813#if defined(MFC_OpenACC)
814# 311 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
815!$acc end parallel loop
816# 311 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
817#elif defined(MFC_OpenMP)
818# 311 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
819
820# 311 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
821!$omp end target teams loop
822# 311 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
823#endif
824
825 ! Model 2: Unity Lewis Number
826 else if (chem_params%transport_model == 2) then
827 ! Note: Added ALL scalars and 'i'/'eqn' to private list to prevent race conditions.
828
829# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
830
831# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
832#if defined(MFC_OpenACC)
833# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
834!$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, 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)
835# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
836#elif defined(MFC_OpenMP)
837# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
838
839# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
840
841# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
842
843# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
844!$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, 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)
845# 316 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
846#endif
847# 320 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
848 do z = isc3%beg, isc3%end
849 do y = isc2%beg, isc2%end
850 do x = isc1%beg, isc1%end
851 ! Calculate grid spacing using direction-based indexing
852 select case (idir)
853 case (1)
854 grid_spacing = x_cc(x + 1) - x_cc(x)
855 case (2)
856 grid_spacing = y_cc(y + 1) - y_cc(y)
857 case (3)
858 grid_spacing = z_cc(z + 1) - z_cc(z)
859 end select
860
861 ! Extract species mass fractions
862
863# 334 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
864#if defined(MFC_OpenACC)
865# 334 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
866!$acc loop seq
867# 334 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
868#elif defined(MFC_OpenMP)
869# 334 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
870
871# 334 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
872#endif
873 do i = eqn_idx%species%beg, eqn_idx%species%end
874 ys_l(i - eqn_idx%species%beg + 1) = q_prim_qp(i)%sf(x, y, z)
875 ys_r(i - eqn_idx%species%beg + 1) = q_prim_qp(i)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
876 ys_cell(i - eqn_idx%species%beg + 1) = 0.5_wp*(ys_l(i - eqn_idx%species%beg + 1) + ys_r(i &
877 & - eqn_idx%species%beg + 1))
878 end do
879
880 ! Calculate molecular weights and mole fractions
881 call get_mixture_molecular_weight(ys_l, mw_l)
882 call get_mixture_molecular_weight(ys_r, mw_r)
883 mw_cell = 0.5_wp*(mw_l + mw_r)
884
885 p_l = q_prim_qp(eqn_idx%E)%sf(x, y, z)
886 p_r = q_prim_qp(eqn_idx%E)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
887
888 rho_l = q_prim_qp(1)%sf(x, y, z)
889 rho_r = q_prim_qp(1)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
890
891 t_l = q_t_sf%sf(x, y, z)
892 t_r = q_t_sf%sf(x + offsets(1), y + offsets(2), z + offsets(3))
893
894 rho_cell = 0.5_wp*(rho_l + rho_r)
895
896 call get_mixture_specific_heat_cp_mass(t_l, ys_l, cp_l)
897 call get_mixture_specific_heat_cp_mass(t_r, ys_r, cp_r)
898 call get_mixture_enthalpy_mass(t_l, ys_l, hmix_l)
899 call get_mixture_enthalpy_mass(t_r, ys_r, hmix_r)
900 dh_dxi = (hmix_r - hmix_l)/grid_spacing
901
902 ! Get transport properties
903 call get_mixture_thermal_conductivity_mixavg(t_l, ys_l, lambda_l)
904 call get_mixture_thermal_conductivity_mixavg(t_r, ys_r, lambda_r)
905
906 ! Calculate species properties and gradients
907
908# 369 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
909#if defined(MFC_OpenACC)
910# 369 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
911!$acc loop seq
912# 369 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
913#elif defined(MFC_OpenMP)
914# 369 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
915
916# 369 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
917#endif
918 do i = eqn_idx%species%beg, eqn_idx%species%end
919 dyk_dxi(i - eqn_idx%species%beg + 1) = (ys_r(i - eqn_idx%species%beg + 1) - ys_l(i &
920 & - eqn_idx%species%beg + 1))/grid_spacing
921 end do
922
923 ! Calculate mixture-averaged diffusivities
924 diffusivity_l = lambda_l/rho_l/cp_l
925 diffusivity_r = lambda_r/rho_r/cp_r
926
927 lambda_cell = 0.5_wp*(lambda_r + lambda_l)
928 diffusivity_cell = 0.5_wp*(diffusivity_r + diffusivity_l)
929
930 ! Calculate mass diffusion fluxes
931 mass_diffu_energy = 0.0_wp
932
933
934# 385 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
935#if defined(MFC_OpenACC)
936# 385 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
937!$acc loop seq
938# 385 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
939#elif defined(MFC_OpenMP)
940# 385 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
941
942# 385 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
943#endif
944 do eqn = eqn_idx%species%beg, eqn_idx%species%end
945 mass_diffu_flux(eqn - eqn_idx%species%beg + 1) = rho_cell*diffusivity_cell*dyk_dxi(eqn &
946 & - eqn_idx%species%beg + 1)
947 end do
948 mass_diffu_energy = rho_cell*diffusivity_cell*dh_dxi
949
950 ! Update flux arrays
951 flux_src_vf(eqn_idx%E)%sf(x, y, z) = flux_src_vf(eqn_idx%E)%sf(x, y, z) - mass_diffu_energy
952
953
954# 395 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
955#if defined(MFC_OpenACC)
956# 395 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
957!$acc loop seq
958# 395 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
959#elif defined(MFC_OpenMP)
960# 395 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
961
962# 395 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
963#endif
964 do eqn = eqn_idx%species%beg, eqn_idx%species%end
965 flux_src_vf(eqn)%sf(x, y, z) = flux_src_vf(eqn)%sf(x, y, &
966 & z) - mass_diffu_flux(eqn - eqn_idx%species%beg + 1)
967 end do
968 end do
969 end do
970 end do
971
972# 403 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
973#if defined(MFC_OpenACC)
974# 403 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
975!$acc end parallel loop
976# 403 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
977#elif defined(MFC_OpenMP)
978# 403 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
979
980# 403 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
981!$omp end target teams loop
982# 403 "/home/runner/work/MFC/MFC/src/common/m_chemistry.fpp"
983#endif
984 end if
985 end if
986
988
989end 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...
logical, parameter chemistry
Chemistry modeling.
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
type(eqn_idx_info) eqn_idx
All conserved-variable equation index ranges and scalars.