MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_reactive_burn.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
2!>
3!! @file
4!! @brief Contains module m_reactive_burn
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
21! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
22! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
23# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
24# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
25# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
26
27# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29
30# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31
32# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33
34# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35
36# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39
40# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45! New line at end of file is required for FYPP
46# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
47# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
48# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
49# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54
55# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58
59# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
61! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
62! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
63# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
64# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
65# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
66
67# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69
70# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71
72# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
73
74# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
75
76# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
77
78# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
79
80# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
81
82# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
83
84# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
85! New line at end of file is required for FYPP
86# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
87
88# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 95 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 100 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 105 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 110 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 115 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 120 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 125 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 130 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125
126# 135 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 165 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 219 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 233 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 258 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 269 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 271 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139# 282 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 332 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142
143# 342 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144
145# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146
147# 361 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148
149# 378 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150
151# 388 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
152
153# 395 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
154
155# 401 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
156
157# 407 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
158
159# 413 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
160
161# 419 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
162
163# 425 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
164! New line at end of file is required for FYPP
165# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
166# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
167# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
168# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173
174# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177
178# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
179# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
180! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
181! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
182# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
183# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
184# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
185
186# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
187# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
188
189# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
190
191# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
192
193# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
194
195# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
196
197# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
198
199# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
200
201# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
202
203# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
204! New line at end of file is required for FYPP
205# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
206
207# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234
235# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236
237# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238
239# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240
241# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
242
243# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
244
245# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
246
247# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
248
249# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
250
251# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
252
253# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
254
255# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
256
257# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
258
259# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
260
261# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
262! New line at end of file is required for FYPP
263# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
264
265! GPU parallel region (scalar reductions, maxval/minval)
266# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! GPU parallel loop over threads (most common GPU macro)
269# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Required closing for GPU_PARALLEL_LOOP
272# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Mark routine for device compilation
275# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Declare device-resident data
278# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Inner loop within a GPU parallel region
281# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Scoped GPU data region
284# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Host code with device pointers (for MPI with GPU buffers)
287# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289! Allocate device memory (unscoped)
290# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291
292! Free device memory
293# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
294
295! Atomic operation on device
296# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
297
298! End atomic capture block
299# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
300
301! Copy data between host and device
302# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303
304! Synchronization barrier
305# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
306
307! Import GPU library module (openacc or omp_lib)
308# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
309
310! Emit code only for AMD compiler
311# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
312
313! Emit code for non-Cray compilers
314# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
315
316! Emit code only for Cray compiler
317# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
318
319! Emit code for non-NVIDIA compilers
320# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
321
322# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
323# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
324! New line at end of file is required for FYPP
325# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
326
327# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
328
329! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
330! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
331! example see misc/nvidia_uvm/bind.sh.
332# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
333
334! Allocate and create GPU device memory
335# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
336
337! Free GPU device memory and deallocate
338# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
339
340! Cray-specific GPU pointer setup for vector fields
341# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
342
343! Cray-specific GPU pointer setup for scalar fields
344# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
345
346! Cray-specific GPU pointer setup for acoustic source spatials
347# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
348
349# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
350
351# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
352! New line at end of file is required for FYPP
353# 6 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp" 2
354# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
355! This file exists so that Fypp can be run without generating case.fpp files for
356! each target. This is useful when generating documentation, for example. This
357! should also let MFC be built with CMake directly, without invoking mfc.sh.
358
359! For pre-process.
360# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
361
362! For moving immersed boundaries in simulation
363# 12 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
364# 7 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp" 2
365
366!> @brief Condensed-phase reactive burn: a pressure-driven programmed-burn source that converts a "reactant" fluid into a "product"
367!! fluid on the multi-fluid model (num_fluids=2, chemistry='F'). The two fluids share the same stiffened-gas EOS (gamma, pi_inf) and
368!! differ only in their reference energy qv, so the reactant->product conversion releases (qv_reactant - qv_product) per unit mass
369!! through the mixture EOS with no explicit energy source. Because the two fluids are mechanically identical the volume-fraction
370!! swap is exact (the product volume fraction is the reaction progress), making this a reactive-Euler/ZND detonation model expressed
371!! through the diffuse-interface framework. A shock raises the pressure above rburn%pign, the reactant burns, and the energy release
372!! sustains the shock -- a self-propagating condensed-phase detonation.
374
376 use m_variables_conversion, only: s_compute_mixture_coefficients
378
379 implicit none
380
382
383contains
384
385 !> Programmed-burn rate dlambda/dt for one cell state. Both the RHS source and the operator-split integrator call this, so the
386 !! rate law is stated once.
387 !! @param pres Mixture pressure
388 !! @param lambda Reaction progress, i.e. the product volume fraction
389 !! @param alpha_rho_react Reactant partial density, for the optional Arrhenius factor
390 !! @param alpha_react Reactant volume fraction, for the optional Arrhenius factor
391 !! @param rate dlambda/dt; zero below the ignition pressure and once the reactant is spent
392 subroutine s_burn_rate(pres, lambda, alpha_rho_react, alpha_react, rate)
393
394
395# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
396#ifdef _CRAYFTN
397# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
398#if MFC_OpenACC
399# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
400!$acc routine seq
401# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
402#elif MFC_OpenMP
403# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
404
405# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
406
407# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
408!$omp declare target device_type(any)
409# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
410#else
411# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
412!DIR$ INLINEALWAYS s_burn_rate
413# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
414#endif
415# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
416#elif MFC_OpenACC
417# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
418!$acc routine seq
419# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
420#elif MFC_OpenMP
421# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
422
423# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
424
425# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
426!$omp declare target device_type(any)
427# 36 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
428#endif
429# 37 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
430
431 real(wp), intent(in) :: pres, lambda, alpha_rho_react, alpha_react
432 real(wp), intent(out) :: rate
433 real(wp) :: drive, T_r
434
435 ! Pressure-driven programmed burn: fires only behind the shock (p > rburn%pign).
436 drive = (pres - rburn%pign)/rburn%pref
437 if (drive > 0._wp .and. lambda < 1._wp) then
438 rate = rburn%k*(1._wp - lambda)*drive**rburn%n
439 ! Optional Arrhenius dependence on the reactant's phasic temperature, from the reactant's own
440 ! EOS. rburn%ta = 0, the default, leaves the pure pressure-driven rate unchanged.
441 if (rburn%ta > 0._wp) then
442 call s_phase_temperature(alpha_rho_react/max(alpha_react, sgm_eps), pres, 1, t_r)
443 rate = rate*exp(-rburn%ta/t_r)
444 end if
445 else
446 rate = 0._wp
447 end if
448
449 end subroutine s_burn_rate
450
451 !> Add the programmed-burn reaction source to the continuity and volume-fraction RHS.
452 !! @param rhs_vf Right-hand-side accumulator (inout)
453 !! @param q_cons_vf Conserved variables (partial densities live here)
454 !! @param q_prim_vf Primitive variables (pressure and volume fractions live here)
455 !! @param bounds Interior cell bounds
456 subroutine s_compute_reactive_burn(rhs_vf, q_cons_vf, q_prim_vf, bounds)
457
458 type(scalar_field), dimension(sys_size), intent(inout) :: rhs_vf
459 type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf, q_prim_vf
460 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
461 integer :: x, y, z
462 real(wp) :: rho, pres, lambda, rate, mdot
463 real(wp) :: alpha_rho_react, alpha_react
464
465
466# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
467
468# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
469#if defined(MFC_OpenACC)
470# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
471!$acc parallel loop collapse(3) gang vector default(present) private(rho, pres, lambda, rate, mdot, alpha_rho_react, alpha_react) copyin(bounds)
472# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
473#elif defined(MFC_OpenMP)
474# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
475
476# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
477
478# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
479
480# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
481!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
482# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
483!$omp& private(rho, pres, lambda, rate, mdot, alpha_rho_react, alpha_react) map(to:bounds)
484# 72 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
485#endif
486# 73 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
487 do z = bounds(3)%beg, bounds(3)%end
488 do y = bounds(2)%beg, bounds(2)%end
489 do x = bounds(1)%beg, bounds(1)%end
490 ! reactant is fluid 1, product is fluid 2
491 rho = q_cons_vf(eqn_idx%cont%beg)%sf(x, y, z) + q_cons_vf(eqn_idx%cont%beg + 1)%sf(x, y, z)
492 pres = q_prim_vf(eqn_idx%E)%sf(x, y, z)
493 lambda = q_prim_vf(eqn_idx%adv%beg + 1)%sf(x, y, z) ! reaction progress = product volume fraction
494
495 alpha_rho_react = q_cons_vf(eqn_idx%cont%beg)%sf(x, y, z)
496 alpha_react = q_prim_vf(eqn_idx%adv%beg)%sf(x, y, z)
497 call s_burn_rate(pres, lambda, alpha_rho_react, alpha_react, rate)
498 if (rate > 0._wp) then
499 mdot = rho*rate ! mass reactant -> product
500
501 ! continuity: reactant loses mass, product gains it
502 rhs_vf(eqn_idx%cont%beg)%sf(x, y, z) = rhs_vf(eqn_idx%cont%beg)%sf(x, y, z) - mdot
503 rhs_vf(eqn_idx%cont%beg + 1)%sf(x, y, z) = rhs_vf(eqn_idx%cont%beg + 1)%sf(x, y, z) + mdot
504
505 ! volume fraction: exact swap (fluids share the EOS), so d(alpha)/dt = +/- rate
506 rhs_vf(eqn_idx%adv%beg)%sf(x, y, z) = rhs_vf(eqn_idx%adv%beg)%sf(x, y, z) - rate
507 rhs_vf(eqn_idx%adv%beg + 1)%sf(x, y, z) = rhs_vf(eqn_idx%adv%beg + 1)%sf(x, y, z) + rate
508 end if
509 end do
510 end do
511 end do
512
513# 98 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
514#if defined(MFC_OpenACC)
515# 98 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
516!$acc end parallel loop
517# 98 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
518#elif defined(MFC_OpenMP)
519# 98 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
520
521# 98 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
522!$omp end target teams loop
523# 98 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
524#endif
525# 99 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
526
527 end subroutine s_compute_reactive_burn
528
529 !> Operator-split alternative to s_compute_reactive_burn, used when rburn%substeps > 0. The flow is frozen and the burn ODE is
530 !! integrated over one time step in equal sub-steps, so the reaction time scale is decoupled from the acoustic CFL. The mixture
531 !! pressure is re-evaluated from the frozen internal energy each sub-step, which is what carries the rate's own feedback: the
532 !! coefficients move as the reactant becomes product.
533 !! @param q_cons_vf Conserved variables, updated in place
534 !! @param dtime Time step to integrate across
535 !! @param bounds Interior cell bounds
536 subroutine s_reactive_burn_substep(q_cons_vf, dtime, bounds)
537
538 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf
539 real(wp), intent(in) :: dtime
540 type(int_bounds_info), dimension(1:3), intent(in) :: bounds
541 integer :: x, y, z, i, sub
542 real(wp) :: rho, pres, lambda, rate
543 real(wp) :: dt_sub, e_int, gamma_mix, pi_inf_mix, qv_mix
544 real(wp) :: rho_mix, dlambda, dmass
545 real(wp) :: alpha_rho_react, alpha_react
546
547 ! Bounded by num_fluids_max, not num_fluids: under case optimization num_fluids is a compile-time
548 ! constant that can be 1, and the reactant/product indices below are literal. The validator holds
549 ! reactive_burn to two fluids, so only the first two entries are ever used.
550 real(wp), dimension(num_fluids_max) :: alpha_rho, alpha
551
552 dt_sub = dtime/real(rburn%substeps, wp)
553
554
555# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
556
557# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
558#if defined(MFC_OpenACC)
559# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
560!$acc parallel loop collapse(3) gang vector default(present) &
561# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
562!$acc& private(alpha_rho, alpha, rho, pres, lambda, rate, e_int, gamma_mix, pi_inf_mix, qv_mix, rho_mix, dlambda, dmass, alpha_rho_react, alpha_react, i, sub) copyin(bounds, dt_sub)
563# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
564#elif defined(MFC_OpenMP)
565# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
566
567# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
568
569# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
570
571# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
572!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(3) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
573# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
574!$omp& private(alpha_rho, alpha, rho, pres, lambda, rate, e_int, gamma_mix, pi_inf_mix, qv_mix, rho_mix, dlambda, dmass, alpha_rho_react, alpha_react, i, sub) map(to:bounds, dt_sub)
575# 127 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
576#endif
577# 129 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
578 do z = bounds(3)%beg, bounds(3)%end
579 do y = bounds(2)%beg, bounds(2)%end
580 do x = bounds(1)%beg, bounds(1)%end
581
582# 132 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
583#if defined(MFC_OpenACC)
584# 132 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
585!$acc loop seq
586# 132 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
587#elif defined(MFC_OpenMP)
588# 132 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
589
590# 132 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
591#endif
592# 133 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
593 do i = 1, num_fluids
594 alpha_rho(i) = q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(x, y, z)
595 alpha(i) = q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(x, y, z)
596 end do
597 rho = alpha_rho(1) + alpha_rho(2)
598
599 ! Internal energy per unit volume is what the burn conserves: it moves mass and volume
600 ! between the phases, and the qv difference surfaces as pressure through the mixture EOS.
601 e_int = q_cons_vf(eqn_idx%E)%sf(x, y, z)
602
603# 142 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
604#if defined(MFC_OpenACC)
605# 142 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
606!$acc loop seq
607# 142 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
608#elif defined(MFC_OpenMP)
609# 142 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
610
611# 142 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
612#endif
613# 143 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
614 do i = eqn_idx%mom%beg, eqn_idx%mom%end
615 e_int = e_int - 0.5_wp*q_cons_vf(i)%sf(x, y, z)**2/rho
616 end do
617
618
619# 147 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
620#if defined(MFC_OpenACC)
621# 147 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
622!$acc loop seq
623# 147 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
624#elif defined(MFC_OpenMP)
625# 147 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
626
627# 147 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
628#endif
629# 148 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
630 do sub = 1, rburn%substeps
631 lambda = alpha(2)
632 call s_compute_mixture_coefficients(alpha_rho, alpha, rho_mix, gamma_mix, pi_inf_mix, qv_mix)
633 pres = f_pressure(e_int, gamma_mix, pi_inf_mix, qv_mix)
634 alpha_rho_react = alpha_rho(1)
635 alpha_react = alpha(1)
636 call s_burn_rate(pres, lambda, alpha_rho_react, alpha_react, rate)
637 if (rate <= 0._wp) exit
638 ! A sub-step longer than the reaction time would carry the progress variable past one.
639 ! Stop it there and hand over the reactant's remaining mass in the same sub-step: capping
640 ! the two independently strands mass at zero volume, and the EOS divides one by the other.
641 if (rate*dt_sub >= 1._wp - lambda) then
642 dlambda = 1._wp - lambda
643 dmass = alpha_rho(1)
644 else
645 dlambda = rate*dt_sub
646 dmass = min(rho*dlambda, alpha_rho(1))
647 end if
648 alpha(1) = alpha(1) - dlambda
649 alpha(2) = alpha(2) + dlambda
650 alpha_rho(1) = alpha_rho(1) - dmass
651 alpha_rho(2) = alpha_rho(2) + dmass
652 end do
653
654
655# 172 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
656#if defined(MFC_OpenACC)
657# 172 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
658!$acc loop seq
659# 172 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
660#elif defined(MFC_OpenMP)
661# 172 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
662
663# 172 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
664#endif
665# 173 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
666 do i = 1, num_fluids
667 q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(x, y, z) = alpha_rho(i)
668 q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(x, y, z) = alpha(i)
669 end do
670 end do
671 end do
672 end do
673
674# 180 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
675#if defined(MFC_OpenACC)
676# 180 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
677!$acc end parallel loop
678# 180 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
679#elif defined(MFC_OpenMP)
680# 180 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
681
682# 180 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
683!$omp end target teams loop
684# 180 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
685#endif
686# 181 "/home/runner/work/MFC/MFC/src/simulation/m_reactive_burn.fpp"
687
688 end subroutine s_reactive_burn_substep
689
690end module m_reactive_burn
type(scalar_field), dimension(sys_size), intent(inout) q_cons_vf
Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho).
subroutine, public s_phase_temperature(rho, pres, i, t)
Temperature of phase i at (rho, p): the stiffened-gas relation, or T_ref(rho) + (e - e_ref)/c_v.
subroutine, public s_compute_mixture_coefficients(alpha_rho_k, alpha_k, rho_k, gamma_k, pi_inf_k, qv_k)
Mixture coefficients of one state. Under bubbles_euler with num_fluids == 1 the sole advection slot a...
real(wp) function, public f_pressure(e_int, gamma, pi_inf, qv)
Pressure of a stiffened gas from its internal energy density - the inverse of s_compute_energy....
Global parameters for the computational domain, fluid properties, and simulation algorithm configurat...
Condensed-phase reactive burn: a pressure-driven programmed-burn source that converts a "reactant" fl...
subroutine, public s_compute_reactive_burn(rhs_vf, q_cons_vf, q_prim_vf, bounds)
Add the programmed-burn reaction source to the continuity and volume-fraction RHS.
subroutine s_burn_rate(pres, lambda, alpha_rho_react, alpha_react, rate)
Programmed-burn rate dlambda/dt for one cell state. Both the RHS source and the operator-split integr...
subroutine, public s_reactive_burn_substep(q_cons_vf, dtime, bounds)
Operator-split alternative to s_compute_reactive_burn, used when rburnsubsteps > 0....
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.