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