MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_checker.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
2!>
3!!@file
4!!@brief Contains module m_checker
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# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 167 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34! New line at end of file is required for FYPP
35# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
36# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
37# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
38# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
42# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 167 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63! New line at end of file is required for FYPP
64# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
65
66# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
68# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
70# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142! New line at end of file is required for FYPP
143# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
144# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
145# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
146# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
148# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
154# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161
162# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165
166# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 167 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171! New line at end of file is required for FYPP
172# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
173
174# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229! New line at end of file is required for FYPP
230# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
231
232! GPU parallel region (scalar reductions, maxval/minval)
233# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
234
235! GPU parallel loop over threads (most common GPU macro)
236# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238! Required closing for GPU_PARALLEL_LOOP
239# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
240
241! Mark routine for device compilation
242# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244! Declare device-resident data
245# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! Inner loop within a GPU parallel region
248# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Scoped GPU data region
251# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Host code with device pointers (for MPI with GPU buffers)
254# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Allocate device memory (unscoped)
257# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Free device memory
260# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Atomic operation on device
263# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! End atomic capture block
266# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Copy data between host and device
269# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Synchronization barrier
272# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Import GPU library module (openacc or omp_lib)
275# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Emit code only for AMD compiler
278# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Emit code for non-Cray compilers
281# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Emit code only for Cray compiler
284# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Emit code for non-NVIDIA compilers
287# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291! New line at end of file is required for FYPP
292# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
293
294# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
295
296! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
297! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
298! example see misc/nvidia_uvm/bind.sh.
299# 55 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
300
301! Allocate and create GPU device memory
302# 75 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
303
304! Free GPU device memory and deallocate
305# 83 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Cray-specific GPU pointer setup for vector fields
308# 107 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
309
310! Cray-specific GPU pointer setup for scalar fields
311# 123 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Cray-specific GPU pointer setup for acoustic source spatials
314# 148 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316# 154 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318# 161 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
319! New line at end of file is required for FYPP
320# 6 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp" 2
321# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
322! This file exists so that Fypp can be run without generating case.fpp files for
323! each target. This is useful when generating documentation, for example. This
324! should also let MFC be built with CMake directly, without invoking mfc.sh.
325
326! For pre-process.
327# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
328
329! For moving immersed boundaries in simulation
330# 12 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
331# 7 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp" 2
332
333!> @brief Validates simulation input parameters for consistency and supported configurations
335
337 use m_mpi_proxy
338 use m_helper
342
343 implicit none
344
345 private; public :: s_check_inputs
346
347contains
348
349 !> Checks compatibility of parameters in the input file. Used by the simulation stage
350 impure subroutine s_check_inputs
351
353
354 if (igr) then
356 else
357 if (recon_type == recon_type_weno) then
359 else if (recon_type == recon_type_muscl) then
361 end if
362 end if
363
365
367
369
370 if (chemistry .and. chem_params%reaction_substeps < 0) then
371# 45 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
372 call s_prohibit_abort(.and."chemistry chem_params%reaction_substeps < 0", "chem_params%reaction_substeps must be >= 0 (0 = reaction source in the flow RHS; > 0 = operator-split sub-stepping)")
373# 45 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
374 end if
375# 47 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
376
377 if (chemistry .and. igr .and. chem_params%reaction_substeps > 0) then
378# 48 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
379 call s_prohibit_abort(.and..and."chemistry igr chem_params%reaction_substeps > 0", "operator-split reaction sub-stepping (reaction_substeps > 0) is not supported with igr: the reactor reads the post-flow (rho, e, T) state, which the IGR update path does not guarantee")
380# 48 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
381 end if
382# 50 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
383
384 if (chemistry .and. chem_params%adap_substeps .and. chem_params%reaction_substeps < 1) then
385# 51 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
386 call s_prohibit_abort(.and..and."chemistry chem_params%adap_substeps chem_params%reaction_substeps < 1", "chem_params%adap_substeps requires reaction_substeps >= 1 (the operator-split floor)")
387# 51 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
388 end if
389# 53 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
390
391 if (chemistry .and. chem_params%adap_substeps .and. chem_params%reaction_substeps_max < chem_params%reaction_substeps) then
392# 54 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
393 call s_prohibit_abort(.and..and."chemistry chem_params%adap_substeps chem_params%reaction_substeps_max < chem_params%reaction_substeps", "chem_params%reaction_substeps_max must be >= reaction_substeps when adap_substeps = T")
394# 54 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
395 end if
396# 57 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
397
398 ! Chemistry with Euler bubbles is not currently supported: the IBM image-point
399 ! interpolation selects the bubbles/QBMM branch before the chemistry branch, so the
400 ! species state (Ys_IP) is not carried when both are enabled. Disallow until implemented.
401 if (chemistry .and. (bubbles_euler .or. qbmm)) then
402# 61 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
403 call s_prohibit_abort(.and..or."chemistry (bubbles_euler qbmm)", "chemistry is not currently supported with Euler bubbles (bubbles_euler/qbmm)")
404# 61 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
405 end if
406# 63 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
407
408 if (ib_state_wrt .and. .not. ib) then
409# 64 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
410 call s_prohibit_abort(.and..not."ib_state_wrt ib", "ib_state_wrt requires ib to be enabled")
411# 64 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
412 end if
413 if (many_ib_patch_parallelism .and. .not. ib) then
414# 65 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
415 call s_prohibit_abort(.and..not."many_ib_patch_parallelism ib", "many_ib_patch_parallelism requires ib to be enabled")
416# 65 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
417 end if
418
419 if (bf_spatial_support .and. (n == 0 .or. p /= 0)) then
420# 67 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
421 call s_prohibit_abort(.and..or."bf_spatial_support (n == 0 p /= 0)", "bf_spatial_support is implemented for 2D only (it forces mom%beg and mom%beg+1)")
422# 67 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
423 end if
424# 69 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
425
426 ! Condensed-phase reactive burn assumes exactly two fluids (reactant=1, product=2) that share the
427 ! stiffened-gas EOS and differ only in qv; violating these silently corrupts the mass/energy balance.
428 if (reactive_burn .and. num_fluids /= 2) then
429# 72 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
430 call s_prohibit_abort(.and."reactive_burn num_fluids /= 2", "reactive_burn requires num_fluids = 2 (reactant then product)")
431# 72 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
432 end if
433 if (reactive_burn .and. .not. f_approx_equal(fluid_pp(1)%gamma, fluid_pp(2)%gamma)) then
434# 73 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
435 call s_prohibit_abort(.and..not."reactive_burn f_approx_equal(fluid_pp(1)%gamma, fluid_pp(2)%gamma)", "reactive_burn requires fluid_pp(1)%gamma == fluid_pp(2)%gamma (reactant and product share the EOS)")
436# 73 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
437 end if
438# 75 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
439 if (reactive_burn .and. .not. f_approx_equal(fluid_pp(1)%pi_inf, fluid_pp(2)%pi_inf)) then
440# 75 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
441 call s_prohibit_abort(.and..not."reactive_burn f_approx_equal(fluid_pp(1)%pi_inf, fluid_pp(2)%pi_inf)", "reactive_burn requires fluid_pp(1)%pi_inf == fluid_pp(2)%pi_inf (reactant and product share the EOS)")
442# 75 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
443 end if
444# 77 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
445 if (reactive_burn .and. fluid_pp(1)%qv <= fluid_pp(2)%qv) then
446# 77 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
447 call s_prohibit_abort(.and."reactive_burn fluid_pp(1)%qv <= fluid_pp(2)%qv", "reactive_burn requires fluid_pp(1)%qv > fluid_pp(2)%qv (reactant releases energy on conversion to product)")
448# 77 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
449 end if
450# 79 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
451 if (reactive_burn .and. rburn%pref <= 0._wp) then
452# 79 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
453 call s_prohibit_abort(.and."reactive_burn rburn%pref <= 0._wp", "reactive_burn requires rburn%pref > 0 (it normalizes the pressure drive (p - rburn%pign)/rburn%pref and is used as a divisor)")
454# 79 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
455 end if
456# 81 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
457 ! The rate uses rburn%k, rburn%pign, rburn%n directly; each defaults to the sentinel dflt_real,
458 ! so an unset value silently produces spurious ignition (pign), NaN via drive**n (n), or a
459 ! backward reaction (k). Require each to be set to a physical value.
460 if (reactive_burn .and. rburn%k <= 0._wp) then
461# 84 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
462 call s_prohibit_abort(.and."reactive_burn rburn%k <= 0._wp", "reactive_burn requires rburn%k > 0 (rate coefficient [1/s]; unset defaults to a negative sentinel that runs the reaction backward)")
463# 84 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
464 end if
465# 86 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
466 if (reactive_burn .and. f_is_default(rburn%pign)) then
467# 86 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
468 call s_prohibit_abort(.and."reactive_burn f_is_default(rburn%pign)", "reactive_burn requires rburn%pign to be set (ignition pressure threshold [Pa]; unset defaults to a negative sentinel, so the reactant ignites everywhere from t = 0)")
469# 86 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
470 end if
471# 88 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
472 if (reactive_burn .and. rburn%n < 0._wp) then
473# 88 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
474 call s_prohibit_abort(.and."reactive_burn rburn%n < 0._wp", "reactive_burn requires rburn%n >= 0 (pressure-drive exponent; unset defaults to a negative sentinel, so drive**n overflows to Inf and the field goes NaN)")
475# 88 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
476 end if
477# 90 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
478 if (reactive_burn .and. model_eqns /= 2 .and. model_eqns /= 3) then
479# 90 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
480 call s_prohibit_abort(.and..and."reactive_burn model_eqns /= 2 model_eqns /= 3", "reactive_burn requires model_eqns = 2 or 3 (the 5-equation pressure-equilibrium or 6-equation multi-fluid model)")
481# 90 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
482 end if
483# 92 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
484 if (reactive_burn .and. rburn%ta < 0._wp) then
485# 92 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
486 call s_prohibit_abort(.and."reactive_burn rburn%ta < 0._wp", "reactive_burn requires rburn%ta >= 0 (activation temperature [K]; 0 disables the Arrhenius factor)")
487# 92 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
488 end if
489# 94 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
490 if (reactive_burn .and. rburn%ta > 0._wp .and. fluid_pp(1)%cv <= 0._wp) then
491# 94 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
492 call s_prohibit_abort(.and..and."reactive_burn rburn%ta > 0._wp fluid_pp(1)%cv <= 0._wp", "reactive_burn with rburn%ta > 0 requires fluid_pp(1)%cv > 0 (the reactant temperature T = (p + pi_inf)/((gamma - 1) cv rho) needs a physical heat capacity; cv = 0 silently disables the Arrhenius factor)")
493# 94 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
494 end if
495# 96 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
496
497 if (ib .and. chemistry) then
499 end if
500
501 if (num_particle_clouds > 0) then
503 end if
504
505 if (synthetic_turbulence) then
507 end if
508
509 end subroutine s_check_inputs
510
511 !> Checks constraints on compiler options
512 impure subroutine s_check_inputs_compilers
513
514#if !defined(MFC_OpenACC) && !(defined(__PGI) || defined(_CRAYFTN))
515 if (rdma_mpi) then
516# 115 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
517 call s_prohibit_abort("rdma_mpi", "Unsupported value of rdma_mpi for the current compiler")
518# 115 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
519 end if
520#endif
521
522 end subroutine s_check_inputs_compilers
523
524 !> Checks constraints on WENO scheme parameters
525 impure subroutine s_check_inputs_weno
526
527 character(len=5) :: numstr !< for int to string conversion
528
529 call s_int_to_str(num_stcls_min*weno_order, numstr)
530 if (m + 1 < num_stcls_min*weno_order) then
531# 126 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
532 call s_prohibit_abort("m + 1 < num_stcls_min*weno_order", "m must be greater than or equal to (num_stcls_min*weno_order - 1), whose value is " // trim(numstr))
533# 126 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
534 end if
535# 128 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
536 if (n + 1 < min(1, n)*num_stcls_min*weno_order) then
537# 128 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
538 call s_prohibit_abort("n + 1 < min(1, n)*num_stcls_min*weno_order", "For 2D simulation, n must be greater than or equal to (num_stcls_min*weno_order - 1), whose value is " // trim(numstr))
539# 128 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
540 end if
541# 131 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
542 if (p + 1 < min(1, p)*num_stcls_min*weno_order) then
543# 131 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
544 call s_prohibit_abort("p + 1 < min(1, p)*num_stcls_min*weno_order", "For 3D simulation, p must be greater than or equal to (num_stcls_min*weno_order - 1), whose value is " // trim(numstr))
545# 131 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
546 end if
547# 134 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
548
549 end subroutine s_check_inputs_weno
550
551 !> Validate that the grid resolution is sufficient for the MUSCL reconstruction order
552 impure subroutine s_check_inputs_muscl
553
554 character(len=5) :: numstr !< for int to string conversion
555
556 call s_int_to_str(num_stcls_min*muscl_order, numstr)
557 if (m + 1 < num_stcls_min*muscl_order) then
558# 143 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
559 call s_prohibit_abort("m + 1 < num_stcls_min*muscl_order", "m must be greater than or equal to (num_stcls_min*muscl_order - 1), whose value is " // trim(numstr))
560# 143 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
561 end if
562# 145 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
563 if (n + 1 < min(1, n)*num_stcls_min*muscl_order) then
564# 145 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
565 call s_prohibit_abort("n + 1 < min(1, n)*num_stcls_min*muscl_order", "For 2D simulation, n must be greater than or equal to (num_stcls_min*muscl_order - 1), whose value is " // trim(numstr))
566# 145 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
567 end if
568# 148 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
569 if (p + 1 < min(1, p)*num_stcls_min*muscl_order) then
570# 148 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
571 call s_prohibit_abort("p + 1 < min(1, p)*num_stcls_min*muscl_order", "For 3D simulation, p must be greater than or equal to (num_stcls_min*muscl_order - 1), whose value is " // trim(numstr))
572# 148 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
573 end if
574# 151 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
575 if (muscl_order == muscl_order_first_order .and. int_comp > 0) then
576# 151 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
577 call s_prohibit_abort(.and."muscl_order == muscl_order_first_order int_comp > 0", "int_comp requires muscl_order >= 2 (muscl_order=1 leaves the reconstruction workspace uninitialised)")
578# 151 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
579 end if
580# 153 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
581
582 end subroutine s_check_inputs_muscl
583
584 !> Checks constraints on time stepping parameters
586
587 if (.not. cfl_dt) then
588 if (dt <= 0) then
589# 160 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
590 call s_prohibit_abort("dt <= 0", "")
591# 160 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
592 end if
593 end if
594
595 end subroutine s_check_inputs_time_stepping
596
597 !> Validate NVIDIA unified virtual memory configuration parameters
599
600#ifdef __NVCOMPILER_GPU_UNIFIED_MEM
601 if (nv_uvm_igr_temps_on_gpu > 3 .or. nv_uvm_igr_temps_on_gpu < 0) then
602# 169 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
603 call s_prohibit_abort(.or."nv_uvm_igr_temps_on_gpu > 3 nv_uvm_igr_temps_on_gpu < 0", "nv_uvm_igr_temps_on_gpu must be in the range [0, 3]")
604# 169 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
605 end if
606# 171 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
607 if (nv_uvm_igr_temps_on_gpu == 3 .and. igr_iter_solver == 2) then
608# 171 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
609 call s_prohibit_abort(.and."nv_uvm_igr_temps_on_gpu == 3 igr_iter_solver == 2", "nv_uvm_igr_temps_on_gpu must be in the range [0, 2] for igr_iter_solver == 2")
610# 171 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
611 end if
612# 173 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
613#endif
614
615 end subroutine s_check_inputs_nvidia_uvm
616
618
619 if ((riemann_solver == riemann_solver_hll) .and. hll_u_interface .and. cyl_coord .and. p > 0) then
620# 179 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
621 call s_prohibit_abort(.and..and..and."(riemann_solver == riemann_solver_hll) hll_u_interface cyl_coord p > 0", "HLL Method 2 is not supported for 3D cylindrical geometry")
622# 179 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
623 end if
624# 181 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
625 if (alt_soundspeed .and. riemann_solver == riemann_solver_hll .and. (.not. hll_u_interface) .and. cyl_coord .and. p == 0) then
626# 181 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
627 call s_prohibit_abort(.and..and..not..and..and."alt_soundspeed riemann_solver == riemann_solver_hll ( hll_u_interface) cyl_coord p == 0", "alt_soundspeed with HLL Method 1 is not supported for 2D axisymmetric geometry")
628# 181 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
629 end if
630# 183 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
631 if (alt_soundspeed .and. riemann_solver == riemann_solver_hll .and. cyl_coord .and. p > 0) then
632# 183 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
633 call s_prohibit_abort(.and..and..and."alt_soundspeed riemann_solver == riemann_solver_hll cyl_coord p > 0", "alt_soundspeed with HLL is not currently supported for 3D cylindrical geometry")
634# 183 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
635 end if
636# 185 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
637 if (hll_u_interface .and. riemann_solver /= riemann_solver_hll) then
638# 185 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
639 call s_prohibit_abort(.and."hll_u_interface riemann_solver /= riemann_solver_hll", "hll_u_interface requires the HLL Riemann solver (riemann_solver = 1)")
640# 185 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
641 end if
642# 187 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
643 if (hll_u_interface .and. mhd) then
644# 187 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
645 call s_prohibit_abort(.and."hll_u_interface mhd", "HLL Method 2 does not support MHD (the MHD path zeroes the shared interface-velocity trace)")
646# 187 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
647 end if
648# 189 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
649 if (surface_tension .and. riemann_solver == riemann_solver_hll .and. (.not. hll_u_interface)) then
650# 189 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
651 call s_prohibit_abort(.and..and..not."surface_tension riemann_solver == riemann_solver_hll ( hll_u_interface)", "surface_tension requires a shared interface-velocity representation (HLL Method 2 or HLLC)")
652# 189 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
653 end if
654# 191 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
655 if (surface_tension .and. riemann_solver == riemann_solver_lax_friedrichs) then
656# 191 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
657 call s_prohibit_abort(.and."surface_tension riemann_solver == riemann_solver_lax_friedrichs", "surface_tension requires a shared interface-velocity representation (HLL Method 2 or HLLC)")
658# 191 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
659 end if
660# 193 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
661
663
665
666 if (hypoelasticity .and. cyl_coord .and. p > 0) then
667# 198 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
668 call s_prohibit_abort(.and..and."hypoelasticity cyl_coord p > 0", "3D cylindrical hypoelasticity is not supported")
669# 198 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
670 end if
671
672 ! Hypoelasticity solver restrictions
673 if (hypoelasticity .and. model_eqns /= model_eqns_5eq) then
674# 201 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
675 call s_prohibit_abort(.and."hypoelasticity model_eqns /= model_eqns_5eq", "hypoelasticity requires model_eqns = 2")
676# 201 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
677 end if
678 if (hypoelasticity .and. riemann_solver /= riemann_solver_hll .and. riemann_solver /= riemann_solver_hllc .and. riemann_solver /= riemann_solver_hlld) then
679# 202 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
680 call s_prohibit_abort(.and..and..and."hypoelasticity riemann_solver /= riemann_solver_hll riemann_solver /= riemann_solver_hllc riemann_solver /= riemann_solver_hlld", "hypoelasticity requires HLL (1), HLLC (2), or HLLD (4) Riemann solver")
681# 202 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
682 end if
683# 205 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
684 if (hypoelasticity .and. riemann_solver == riemann_solver_hlld .and. n == 0) then
685# 205 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
686 call s_prohibit_abort(.and..and."hypoelasticity riemann_solver == riemann_solver_hlld n == 0", "HLLD hypoelasticity requires at least 2D (n must be > 0)")
687# 205 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
688 end if
689# 207 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
690 if (hypoelasticity .and. riemann_solver == riemann_solver_hlld .and. num_fluids /= 2) then
691# 207 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
692 call s_prohibit_abort(.and..and."hypoelasticity riemann_solver == riemann_solver_hlld num_fluids /= 2", "HLLD hypoelasticity currently requires exactly 2 fluid components")
693# 207 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
694 end if
695# 209 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
696 if (hypoelasticity .and. mhd) then
697# 209 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
698 call s_prohibit_abort(.and."hypoelasticity mhd", "MHD and hypoelasticity cannot be enabled together")
699# 209 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
700 end if
701 if (hypoelasticity .and. bubbles_euler) then
702# 210 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
703 call s_prohibit_abort(.and."hypoelasticity bubbles_euler", "Hypoelasticity does not support Euler-Euler bubbles")
704# 210 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
705 end if
706 if (hypoelasticity .and. riemann_solver == riemann_solver_hlld .and. viscous) then
707# 211 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
708 call s_prohibit_abort(.and..and."hypoelasticity riemann_solver == riemann_solver_hlld viscous", "HLLD hypoelasticity does not support viscous effects (the dual-pass omits the viscous source term)")
709# 211 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
710 end if
711# 213 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
712 if (hypoelasticity .and. riemann_solver == riemann_solver_hlld .and. surface_tension) then
713# 213 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
714 call s_prohibit_abort(.and..and."hypoelasticity riemann_solver == riemann_solver_hlld surface_tension", "HLLD hypoelasticity does not support surface tension (the dual-pass omits the surface-tension source term)")
715# 213 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
716 end if
717# 215 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
718 if (hypoelasticity .and. riemann_solver == riemann_solver_hlld .and. cont_damage) then
719# 215 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
720 call s_prohibit_abort(.and..and."hypoelasticity riemann_solver == riemann_solver_hlld cont_damage", "HLLD hypoelasticity does not support continuum damage (the dual-pass does not damage-scale the shear modulus)")
721# 215 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
722 end if
723# 217 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
724 if (hypoelasticity .and. riemann_solver == riemann_solver_hlld .and. chemistry) then
725# 217 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
726 call s_prohibit_abort(.and..and."hypoelasticity riemann_solver == riemann_solver_hlld chemistry", "HLLD hypoelasticity does not support chemistry")
727# 217 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
728 end if
729# 219 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
730 if (riemann_solver == riemann_solver_hlld .and. (.not. mhd) .and. (.not. hypoelasticity)) then
731# 219 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
732 call s_prohibit_abort(.and..not..and..not."riemann_solver == riemann_solver_hlld ( mhd) ( hypoelasticity)", "HLLD is only available for MHD or hypoelasticity")
733# 219 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
734 end if
735# 221 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
736
737 ! Feature flag prerequisites
738 if (riemann_hypo_adc .and. .not. hypoelasticity) then
739# 223 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
740 call s_prohibit_abort(.and..not."riemann_hypo_ADC hypoelasticity", "riemann_hypo_ADC requires hypoelasticity = T")
741# 223 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
742 end if
743 if (riemann_hypo_adc .and. riemann_solver /= riemann_solver_hllc .and. riemann_solver /= riemann_solver_hlld) then
744# 224 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
745 call s_prohibit_abort(.and..and."riemann_hypo_ADC riemann_solver /= riemann_solver_hllc riemann_solver /= riemann_solver_hlld", "riemann_hypo_ADC only applies to hypo HLLC/HLLD")
746# 224 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
747 end if
748# 226 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
749 if (riemann_hypo_adc .and. (bubbles_euler .or. surface_tension .or. chemistry .or. cont_damage)) then
750# 226 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
751 call s_prohibit_abort(.and..or..or..or."riemann_hypo_ADC (bubbles_euler surface_tension chemistry cont_damage)", "riemann_hypo_ADC does not support bubbles, surface tension, chemistry, or continuum damage (the ADC HLL blend omits their flux components)")
752# 226 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
753 end if
754# 228 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
755 if (hypo_hll_interface_rhs .and. .not. hypoelasticity) then
756# 228 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
757 call s_prohibit_abort(.and..not."hypo_hll_interface_rhs hypoelasticity", "hypo_hll_interface_rhs requires hypoelasticity = T")
758# 228 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
759 end if
760 if (hypo_hll_interface_rhs .and. riemann_solver /= riemann_solver_hll) then
761# 229 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
762 call s_prohibit_abort(.and."hypo_hll_interface_rhs riemann_solver /= riemann_solver_hll", "hypo_hll_interface_rhs requires HLL Riemann solver (riemann_solver = 1)")
763# 229 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
764 end if
765# 231 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
766 if (alt_soundspeed .and. riemann_solver == riemann_solver_hlld .and. .not. hypoelasticity) then
767# 231 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
768 call s_prohibit_abort(.and..and..not."alt_soundspeed riemann_solver == riemann_solver_hlld hypoelasticity", "alt_soundspeed with HLLD requires hypoelasticity = T")
769# 231 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
770 end if
771# 233 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
772 if (alt_soundspeed .and. num_fluids /= 2) then
773# 233 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
774 call s_prohibit_abort(.and."alt_soundspeed num_fluids /= 2", "alt_soundspeed requires exactly 2 fluid components (the Kapila K coefficient is a two-fluid closure)")
775# 233 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
776 end if
777# 235 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
778 if (cont_damage .and. alt_soundspeed) then
779# 235 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
780 call s_prohibit_abort(.and."cont_damage alt_soundspeed", "Continuum damage does not support alt_soundspeed")
781# 235 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
782 end if
783 if (hypoelasticity .and. igr) then
784# 236 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
785 call s_prohibit_abort(.and."hypoelasticity igr", "Hypoelasticity is not compatible with IGR")
786# 236 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
787 end if
788 if (hypoelasticity .and. fd_order /= 1 .and. fd_order /= 2 .and. fd_order /= 4) then
789# 237 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
790 call s_prohibit_abort(.and..and..and."hypoelasticity fd_order /= 1 fd_order /= 2 fd_order /= 4", "hypoelasticity requires fd_order to be set to 1, 2, or 4 (the finite-difference coefficients are initialized unconditionally)")
791# 237 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
792 end if
793# 239 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
794 if (hypoelasticity .and. wave_speeds == wave_speeds_pressure) then
795# 239 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
796 call s_prohibit_abort(.and."hypoelasticity wave_speeds == wave_speeds_pressure", "Pressure-based wave speeds (wave_speeds = 2) omit the elastic longitudinal speed and are not supported with hypoelasticity")
797# 239 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
798 end if
799# 241 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
800 if (riemann_solver == riemann_solver_hlld .and. wave_speeds == wave_speeds_pressure) then
801# 241 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
802 call s_prohibit_abort(.and."riemann_solver == riemann_solver_hlld wave_speeds == wave_speeds_pressure", "HLLD uses its own direct wave-speed estimates; wave_speeds = 2 is not supported")
803# 241 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
804 end if
805# 243 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
806 if (riemann_solver == riemann_solver_hlld .and. low_mach > 0) then
807# 243 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
808 call s_prohibit_abort(.and."riemann_solver == riemann_solver_hlld low_Mach > 0", "low_Mach corrections are not implemented for HLLD")
809# 243 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
810 end if
811 if (riemann_hypo_adc .and. low_mach > 0) then
812# 244 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
813 call s_prohibit_abort(.and."riemann_hypo_ADC low_Mach > 0", "riemann_hypo_ADC does not support low_Mach (the ADC HLL reference flux uses pre-correction velocities)")
814# 244 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
815 end if
816# 246 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
817 if (riemann_hypo_adc .and. adc_kappa <= 0._wp) then
818# 246 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
819 call s_prohibit_abort(.and."riemann_hypo_ADC ADC_kappa <= 0._wp", "ADC_kappa must be positive")
820# 246 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
821 end if
822 if (hypoelasticity .and. (cfl_const_dt .or. cfl_adap_dt)) then
823# 247 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
824 call s_prohibit_abort(.and..or."hypoelasticity (cfl_const_dt cfl_adap_dt)", "Automatic CFL time stepping uses the acoustic sound speed only and does not bound the elastic characteristic speed; set dt explicitly for hypoelastic runs")
825# 247 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
826 end if
827# 249 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
828
829 end subroutine s_check_inputs_hypo_branch
830
831 !> Validates that each burning immersed-boundary patch injects a species index within the mechanism. inj_species indexes the
832 !! image-point mass-fraction array Ys_IP(1:num_species) in m_ibm; an out-of-range value is an out-of-bounds write (silent
833 !! corruption). Only reachable with chemistry.
835
836 integer :: i
837
838 do i = 1, num_ibs
839 if (patch_ib(i)%inj_species > num_species) then
840# 260 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
841 call s_prohibit_abort("patch_ib(i)%inj_species > num_species", "patch_ib inj_species must be <= num_species (it indexes the image-point species mass fractions; an out-of-range value writes out of bounds)")
842# 260 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
843 end if
844# 262 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
845 end do
846
847 end subroutine s_check_inputs_ib_injection
848
849 !> Checks that each active particle cloud has a valid packing_method specified
851
852 integer :: i
853 character(len=5) :: idxstr
854
855 do i = 1, num_particle_clouds
856 call s_int_to_str(i, idxstr)
857 if (particle_cloud(i)%packing_method == dflt_int) then
858# 274 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
859 call s_prohibit_abort("particle_cloud(i)%packing_method == dflt_int", "particle_cloud("//trim(idxstr) //")%packing_method must be specified (1 = rejection sampling, 2 = lattice)")
860# 274 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
861 end if
862# 277 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
863 if (particle_cloud(i)%packing_method /= 1 .and. particle_cloud(i)%packing_method /= 2) then
864# 277 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
865 call s_prohibit_abort(.and."particle_cloud(i)%packing_method /= 1 particle_cloud(i)%packing_method /= 2", "particle_cloud("//trim(idxstr) //")%packing_method must be 1 (rejection sampling) or 2 (lattice)")
866# 277 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
867 end if
868# 279 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
869 end do
870
871 end subroutine s_check_inputs_particle_clouds
872
873 !> Checks that each active synthetic-turbulence forcing zone has a fully specified position and a positive size in every active
874 !! dimension
876
877 integer :: i, d
878 character(len=5) :: idxstr
879
880 if (num_turbulent_sources <= 0) then
881# 290 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
882 call s_prohibit_abort("num_turbulent_sources <= 0", "num_turbulent_sources must be > 0 when synthetic_turbulence is enabled")
883# 290 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
884 end if
885
886 do i = 1, num_turbulent_sources
887 call s_int_to_str(i, idxstr)
888 do d = 1, num_dims
889 if (f_is_default(turb_pos(i, d))) then
890# 295 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
891 call s_prohibit_abort("f_is_default(turb_pos(i, d))", "turb_pos("//trim(idxstr) //",:) must be specified for all num_dims when synthetic_turbulence is enabled")
892# 295 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
893 end if
894# 298 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
895 if (f_is_default(synth_l(i, d)) .or. synth_l(i, d) <= 0._wp) then
896# 298 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
897 call s_prohibit_abort(.or."f_is_default(synth_L(i, d)) synth_L(i, d) <= 0._wp", "synth_L("//trim(idxstr)//",:) must be positive for all num_dims when synthetic_turbulence is enabled")
898# 298 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
899 end if
900# 300 "/home/runner/work/MFC/MFC/src/simulation/m_checker.fpp"
901 end do
902 end do
903
905
906end module m_checker
Validates simulation input parameters for consistency and supported configurations.
impure subroutine s_check_inputs_hypo_branch
impure subroutine, public s_check_inputs
Checks compatibility of parameters in the input file. Used by the simulation stage.
impure subroutine s_check_inputs_time_stepping
Checks constraints on time stepping parameters.
impure subroutine s_check_inputs_particle_clouds
Checks that each active particle cloud has a valid packing_method specified.
impure subroutine s_check_inputs_ib_injection
Validates that each burning immersed-boundary patch injects a species index within the mechanism....
impure subroutine s_check_inputs_hll_non_conservative
impure subroutine s_check_inputs_weno
Checks constraints on WENO scheme parameters.
impure subroutine s_check_inputs_synthetic_turbulence
Checks that each active synthetic-turbulence forcing zone has a fully specified position and a positi...
impure subroutine s_check_inputs_muscl
Validate that the grid resolution is sufficient for the MUSCL reconstruction order.
impure subroutine s_check_inputs_compilers
Checks constraints on compiler options.
impure subroutine s_check_inputs_nvidia_uvm
Validate NVIDIA unified virtual memory configuration parameters.
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter model_eqns_5eq
integer, parameter dflt_int
Default integer value.
integer, parameter num_stcls_min
Minimum # of stencils.
integer, parameter riemann_solver_hll
integer, parameter riemann_solver_hlld
integer, parameter recon_type_muscl
integer, parameter riemann_solver_hllc
integer, parameter muscl_order_first_order
integer, parameter wave_speeds_pressure
integer, parameter riemann_solver_lax_friedrichs
integer, parameter recon_type_weno
Global parameters for the computational domain, fluid properties, and simulation algorithm configurat...
real(wp), dimension(num_turb_sources_max, 3) turb_pos
real(wp), dimension(num_turb_sources_max, 3) synth_l
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
logical elemental function, public f_approx_equal(a, b, tol_input)
Check if two floating point numbers of wp are within tolerance.
logical elemental function, public f_is_default(var)
Check if a real(wp) variable is of default value.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
elemental subroutine, public s_int_to_str(i, res)
Convert an integer to its trimmed string representation.
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.