From 4d1f49e01a02353ef331447571f1fc36f8e849d3 Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Sat, 5 Sep 2026 19:28:33 -0500 Subject: [PATCH 1/2] Integrate the condensed-phase burn by operator splitting when rburn%substeps > 0 Added to the flow RHS, the burn ties the reaction time scale to the acoustic CFL: a fast burn forces a smaller step for the whole simulation. With rburn%substeps > 0 the flow is frozen and the ODE is integrated over the step in equal sub-steps, re-evaluating the mixture pressure from the frozen internal energy each one so the rate feels the coefficients moving as reactant becomes product. rburn%substeps = 0, the default, keeps the source in the RHS unchanged. Completing a sub-step hands over the reactant's remaining mass along with the last of its volume fraction; capping the two separately strands mass at zero volume, which the EOS then divides by. The rate law is now stated once and called by both integrators. --- src/common/m_derived_types.fpp | 11 +- src/common/m_global_parameters_common.fpp | 1 + src/simulation/m_reactive_burn.fpp | 135 +++++++++++++-- src/simulation/m_rhs.fpp | 4 +- src/simulation/m_time_steppers.fpp | 9 + tests/86893F55/golden-metadata.txt | 157 ++++++++++++++++++ tests/86893F55/golden.txt | 48 ++++++ toolchain/mfc/case_validator.py | 5 + toolchain/mfc/params/definitions.py | 1 + .../mfc/params/generators/fortran_gen.py | 5 +- toolchain/mfc/test/cases.py | 8 + 11 files changed, 358 insertions(+), 26 deletions(-) create mode 100644 tests/86893F55/golden-metadata.txt create mode 100644 tests/86893F55/golden.txt diff --git a/src/common/m_derived_types.fpp b/src/common/m_derived_types.fpp index d80c885b4..a2231062c 100644 --- a/src/common/m_derived_types.fpp +++ b/src/common/m_derived_types.fpp @@ -526,11 +526,12 @@ module m_derived_types !> Condensed-phase reactive-burn (programmed pressure detonation) parameters. The rate is !> dlambda/dt = k (1 - lambda) ((p - pign)/pref)^n, optionally scaled by exp(-ta/T) when ta > 0. type reactive_burn_parameters - real(wp) :: k !< Rate coefficient [1/s] - real(wp) :: pign !< Ignition pressure threshold [Pa] - real(wp) :: pref !< Reference pressure for the pressure drive [Pa] - real(wp) :: n !< Pressure-drive exponent - real(wp) :: ta !< Activation temperature [K] (0 = pure pressure-driven; > 0 adds exp(-ta/T)) + real(wp) :: k !< Rate coefficient [1/s] + real(wp) :: pign !< Ignition pressure threshold [Pa] + real(wp) :: pref !< Reference pressure for the pressure drive [Pa] + real(wp) :: n !< Pressure-drive exponent + real(wp) :: ta !< Activation temperature [K] (0 = pure pressure-driven; > 0 adds exp(-ta/T)) + integer :: substeps !< Operator-split sub-steps per time step (0 = source added to the flow RHS) end type reactive_burn_parameters !> Lagrangian bubble parameters diff --git a/src/common/m_global_parameters_common.fpp b/src/common/m_global_parameters_common.fpp index 3c230ff66..4e0e21a2e 100644 --- a/src/common/m_global_parameters_common.fpp +++ b/src/common/m_global_parameters_common.fpp @@ -339,6 +339,7 @@ contains rburn%pref = dflt_real rburn%n = dflt_real rburn%ta = 0._wp + rburn%substeps = 0 ! Case-optimization params: under case-opt these are compile-time constants in sim (skip assignment); in pre/post ! MFC_CASE_OPTIMIZATION is always False so the block always executes there. diff --git a/src/simulation/m_reactive_burn.fpp b/src/simulation/m_reactive_burn.fpp index 17b4eb1c3..5760ba049 100644 --- a/src/simulation/m_reactive_burn.fpp +++ b/src/simulation/m_reactive_burn.fpp @@ -15,14 +15,44 @@ module m_reactive_burn use m_global_parameters - use m_variables_conversion, only: f_sg_thermal + use m_variables_conversion, only: f_sg_thermal, s_compute_mixture_coefficients, f_pressure implicit none - private; public :: s_compute_reactive_burn + private; public :: s_compute_reactive_burn, s_reactive_burn_substep contains + !> Programmed-burn rate dlambda/dt for one cell state. Both the RHS source and the operator-split integrator call this, so the + !! rate law is stated once. + !! @param pres Mixture pressure + !! @param lambda Reaction progress, i.e. the product volume fraction + !! @param alpha_rho_react Reactant partial density, for the optional Arrhenius factor + !! @param alpha_react Reactant volume fraction, for the optional Arrhenius factor + !! @param rate dlambda/dt; zero below the ignition pressure and once the reactant is spent + subroutine s_burn_rate(pres, lambda, alpha_rho_react, alpha_react, rate) + + $:GPU_ROUTINE(function_name='s_burn_rate', parallelism='[seq]', cray_inline=True) + + real(wp), intent(in) :: pres, lambda, alpha_rho_react, alpha_react + real(wp), intent(out) :: rate + real(wp) :: drive + + ! Pressure-driven programmed burn: fires only behind the shock (p > rburn%pign). + drive = (pres - rburn%pign)/rburn%pref + if (drive > 0._wp .and. lambda < 1._wp) then + rate = rburn%k*(1._wp - lambda)*drive**rburn%n + ! Optional Arrhenius dependence on the reactant phasic temperature from the stiffened-gas + ! EOS. rburn%ta = 0, the default, leaves the pure pressure-driven rate unchanged. + if (rburn%ta > 0._wp) then + rate = rate*exp(-rburn%ta/f_sg_thermal(pres, alpha_rho_react/alpha_react, isentrope_n(1), isentrope_B(1), cvs(1))) + end if + else + rate = 0._wp + end if + + end subroutine s_burn_rate + !> Add the programmed-burn reaction source to the continuity and volume-fraction RHS. !! @param rhs_vf Right-hand-side accumulator (inout) !! @param q_cons_vf Conserved variables (partial densities live here) @@ -34,9 +64,9 @@ contains type(scalar_field), dimension(sys_size), intent(in) :: q_cons_vf, q_prim_vf type(int_bounds_info), dimension(1:3), intent(in) :: bounds integer :: x, y, z - real(wp) :: rho, pres, lambda, rate, mdot, drive, T_r + real(wp) :: rho, pres, lambda, rate, mdot - $:GPU_PARALLEL_LOOP(collapse=3, private='[rho, pres, lambda, rate, mdot, drive, T_r]', copyin='[bounds]') + $:GPU_PARALLEL_LOOP(collapse=3, private='[rho, pres, lambda, rate, mdot]', copyin='[bounds]') do z = bounds(3)%beg, bounds(3)%end do y = bounds(2)%beg, bounds(2)%end do x = bounds(1)%beg, bounds(1)%end @@ -45,20 +75,9 @@ contains pres = q_prim_vf(eqn_idx%E)%sf(x, y, z) lambda = q_prim_vf(eqn_idx%adv%beg + 1)%sf(x, y, z) ! reaction progress = product volume fraction - ! pressure-driven programmed burn: fires only behind the shock (p > rburn%pign) - drive = (pres - rburn%pign)/rburn%pref - if (drive > 0._wp .and. lambda < 1._wp) then - rate = rburn%k*(1._wp - lambda)*drive**rburn%n ! dlambda/dt - - ! Optional Arrhenius temperature dependence: rate *= exp(-rburn%ta/T_r), with T_r the - ! reactant phasic temperature from the stiffened-gas EOS T = (p + pi_inf)/((Gamma-1) rho cv). - ! rburn%ta = 0 (default) leaves the pure pressure-driven rate unchanged. - if (rburn%ta > 0._wp) then - T_r = f_sg_thermal(pres, q_cons_vf(eqn_idx%cont%beg)%sf(x, y, z)/q_prim_vf(eqn_idx%adv%beg)%sf(x, y, & - & z), isentrope_n(1), isentrope_B(1), cvs(1)) - rate = rate*exp(-rburn%ta/T_r) - end if - + call s_burn_rate(pres, lambda, q_cons_vf(eqn_idx%cont%beg)%sf(x, y, z), q_prim_vf(eqn_idx%adv%beg)%sf(x, y, & + & z), rate) + if (rate > 0._wp) then mdot = rho*rate ! mass reactant -> product ! continuity: reactant loses mass, product gains it @@ -76,4 +95,84 @@ contains end subroutine s_compute_reactive_burn + !> Operator-split alternative to s_compute_reactive_burn, used when rburn%substeps > 0. The flow is frozen and the burn ODE is + !! integrated over one time step in equal sub-steps, so the reaction time scale is decoupled from the acoustic CFL. The mixture + !! pressure is re-evaluated from the frozen internal energy each sub-step, which is what carries the rate's own feedback: the + !! coefficients move as the reactant becomes product. + !! @param q_cons_vf Conserved variables, updated in place + !! @param dtime Time step to integrate across + !! @param bounds Interior cell bounds + subroutine s_reactive_burn_substep(q_cons_vf, dtime, bounds) + + type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf + real(wp), intent(in) :: dtime + type(int_bounds_info), dimension(1:3), intent(in) :: bounds + integer :: x, y, z, i, sub + real(wp) :: rho, pres, lambda, rate + real(wp) :: dt_sub, e_int, gamma_mix, pi_inf_mix, qv_mix + real(wp) :: rho_mix, dlambda, dmass + + #:if not MFC_CASE_OPTIMIZATION and USING_AMD + real(wp), dimension(3) :: alpha_rho, alpha + #:else + real(wp), dimension(num_fluids) :: alpha_rho, alpha + #:endif + + dt_sub = dtime/real(rburn%substeps, wp) + + $:GPU_PARALLEL_LOOP(collapse=3, private='[alpha_rho, alpha, rho, pres, lambda, rate, e_int, gamma_mix, pi_inf_mix, & + & qv_mix, rho_mix, dlambda, dmass, i, sub]', copyin='[bounds, dt_sub]') + do z = bounds(3)%beg, bounds(3)%end + do y = bounds(2)%beg, bounds(2)%end + do x = bounds(1)%beg, bounds(1)%end + $:GPU_LOOP(parallelism='[seq]') + do i = 1, num_fluids + alpha_rho(i) = q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(x, y, z) + alpha(i) = q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(x, y, z) + end do + rho = alpha_rho(1) + alpha_rho(2) + + ! Internal energy per unit volume is what the burn conserves: it moves mass and volume + ! between the phases, and the qv difference surfaces as pressure through the mixture EOS. + e_int = q_cons_vf(eqn_idx%E)%sf(x, y, z) + $:GPU_LOOP(parallelism='[seq]') + do i = eqn_idx%mom%beg, eqn_idx%mom%end + e_int = e_int - 0.5_wp*q_cons_vf(i)%sf(x, y, z)**2/rho + end do + + $:GPU_LOOP(parallelism='[seq]') + do sub = 1, rburn%substeps + lambda = alpha(2) + call s_compute_mixture_coefficients(alpha_rho, alpha, rho_mix, gamma_mix, pi_inf_mix, qv_mix) + pres = f_pressure(e_int, gamma_mix, pi_inf_mix, qv_mix) + call s_burn_rate(pres, lambda, alpha_rho(1), alpha(1), rate) + if (rate <= 0._wp) exit + ! A sub-step longer than the reaction time would carry the progress variable past one. + ! Stop it there and hand over the reactant's remaining mass in the same sub-step: capping + ! the two independently strands mass at zero volume, and the EOS divides one by the other. + if (rate*dt_sub >= 1._wp - lambda) then + dlambda = 1._wp - lambda + dmass = alpha_rho(1) + else + dlambda = rate*dt_sub + dmass = min(rho*dlambda, alpha_rho(1)) + end if + alpha(1) = alpha(1) - dlambda + alpha(2) = alpha(2) + dlambda + alpha_rho(1) = alpha_rho(1) - dmass + alpha_rho(2) = alpha_rho(2) + dmass + end do + + $:GPU_LOOP(parallelism='[seq]') + do i = 1, num_fluids + q_cons_vf(i + eqn_idx%cont%beg - 1)%sf(x, y, z) = alpha_rho(i) + q_cons_vf(i + eqn_idx%adv%beg - 1)%sf(x, y, z) = alpha(i) + end do + end do + end do + end do + $:END_GPU_PARALLEL_LOOP() + + end subroutine s_reactive_burn_substep + end module m_reactive_burn diff --git a/src/simulation/m_rhs.fpp b/src/simulation/m_rhs.fpp index b023da948..4f660ba35 100644 --- a/src/simulation/m_rhs.fpp +++ b/src/simulation/m_rhs.fpp @@ -869,7 +869,9 @@ contains call nvtxEndRange end if - if (reactive_burn) then + ! With rburn%substeps > 0 the burn is integrated by operator splitting after the flow + ! update (s_reactive_burn_substep), not added to the flow RHS here. + if (reactive_burn .and. rburn%substeps == 0) then call nvtxStartRange("RHS-REACTIVE-BURN") call s_compute_reactive_burn(rhs_vf, q_cons_qp%vf, q_prim_qp%vf, idwint) call nvtxEndRange diff --git a/src/simulation/m_time_steppers.fpp b/src/simulation/m_time_steppers.fpp index 9a04225b0..e1142cf60 100644 --- a/src/simulation/m_time_steppers.fpp +++ b/src/simulation/m_time_steppers.fpp @@ -12,6 +12,7 @@ module m_time_steppers use m_global_parameters use m_rhs use m_chemistry + use m_reactive_burn, only: s_reactive_burn_substep use m_pressure_relaxation use m_data_output use m_bubbles_EE @@ -585,6 +586,14 @@ contains call nvtxEndRange end if + ! Operator-split condensed-phase burn: integrate the progress variable per cell after the flow + ! update, with sub-stepping, instead of adding the source to the flow RHS (rburn%substeps > 0). + if (reactive_burn .and. rburn%substeps > 0) then + call nvtxStartRange("BURN-SUBSTEP") + call s_reactive_burn_substep(q_cons_ts(1)%vf, dt, idwint) + call nvtxEndRange + end if + if (ib) then if (moving_immersed_boundary_flag) then call s_wrap_periodic_ibs() ! wraps the positions of IBs to the local proc diff --git a/tests/86893F55/golden-metadata.txt b/tests/86893F55/golden-metadata.txt new file mode 100644 index 000000000..a07378d5f --- /dev/null +++ b/tests/86893F55/golden-metadata.txt @@ -0,0 +1,157 @@ +This file was created on 2026-09-05 19:26:52.572871. + +mfc.sh: + + Invocation: test --generate --only 86893F55 -j 8 + Lock: mpi=Yes & gpu=Mp & debug=No & reldebug=No & gcov=No & unified=No & single=No & mixed=No & fastmath=No + Git: 70589fd57b39a04730100f91e6c07005d000203b on feat/reactive-burn-substeps (dirty) + +syscheck: + + CMake Configuration: + + CMake v3.25.2 on k006-005-v4.hpcfund + + C : GNU v12.2.0 (/opt/ohpc/pub/compiler/gcc/12.2.0/bin/cc) + Fortran : LLVMFlang v23.0.0 (/work1/spencerbryngelson/sbryngelson/software/therock-afar-23.2.1-gfx90a-7.13.0-7357b5084b/bin/amdflang) + + PRE_PROCESS : OFF + SIMULATION : OFF + POST_PROCESS : OFF + SYSCHECK : ON + DOCUMENTATION : OFF + ALL : OFF + + MPI : ON + OpenACC : OFF + OpenMP : ON + + Fypp : /work1/spencerbryngelson/sbryngelson/mfc-burnsplit/build/venv/bin/fypp + Doxygen : + + Build Type : Release + + Configuration Environment: + + CC : /opt/ohpc/pub/compiler/gcc/12.2.0/bin/cc + CXX : /opt/ohpc/pub/compiler/gcc/12.2.0/bin/c++ + FC : /work1/spencerbryngelson/sbryngelson/software/therock-afar-23.2.1-gfx90a-7.13.0-7357b5084b/bin/amdflang + OMPI_CC : + OMPI_CXX : + OMPI_FC : + +pre_process: + + CMake Configuration: + + CMake v3.25.2 on k006-005-v4.hpcfund + + C : GNU v12.2.0 (/opt/ohpc/pub/compiler/gcc/12.2.0/bin/cc) + Fortran : LLVMFlang v23.0.0 (/work1/spencerbryngelson/sbryngelson/software/therock-afar-23.2.1-gfx90a-7.13.0-7357b5084b/bin/amdflang) + + PRE_PROCESS : ON + SIMULATION : OFF + POST_PROCESS : OFF + SYSCHECK : OFF + DOCUMENTATION : OFF + ALL : OFF + + MPI : ON + OpenACC : OFF + OpenMP : ON + + Fypp : /work1/spencerbryngelson/sbryngelson/mfc-burnsplit/build/venv/bin/fypp + Doxygen : + + Build Type : Release + + Configuration Environment: + + CC : + CXX : + FC : /work1/spencerbryngelson/sbryngelson/software/therock-afar-23.2.1-gfx90a-7.13.0-7357b5084b/bin/amdflang + OMPI_CC : + OMPI_CXX : + OMPI_FC : + +simulation: + + CMake Configuration: + + CMake v3.25.2 on k006-005-v4.hpcfund + + C : GNU v12.2.0 (/opt/ohpc/pub/compiler/gcc/12.2.0/bin/cc) + Fortran : LLVMFlang v23.0.0 (/work1/spencerbryngelson/sbryngelson/software/therock-afar-23.2.1-gfx90a-7.13.0-7357b5084b/bin/amdflang) + + PRE_PROCESS : OFF + SIMULATION : ON + POST_PROCESS : OFF + SYSCHECK : OFF + DOCUMENTATION : OFF + ALL : OFF + + MPI : ON + OpenACC : OFF + OpenMP : ON + + Fypp : /work1/spencerbryngelson/sbryngelson/mfc-burnsplit/build/venv/bin/fypp + Doxygen : + + Build Type : Release + + Configuration Environment: + + CC : /opt/ohpc/pub/compiler/gcc/12.2.0/bin/cc + CXX : /opt/ohpc/pub/compiler/gcc/12.2.0/bin/c++ + FC : /work1/spencerbryngelson/sbryngelson/software/therock-afar-23.2.1-gfx90a-7.13.0-7357b5084b/bin/amdflang + OMPI_CC : + OMPI_CXX : + OMPI_FC : + +CPU: + + CPU Info: + From lscpu + Architecture: x86_64 + CPU op-mode(s): 32-bit, 64-bit + Address sizes: 48 bits physical, 48 bits virtual + Byte Order: Little Endian + CPU(s): 16 + On-line CPU(s) list: 0-15 + Vendor ID: AuthenticAMD + Model name: AMD EPYC 7V13 64-Core Processor + CPU family: 25 + Model: 1 + Thread(s) per core: 1 + Core(s) per socket: 1 + Socket(s): 16 + Stepping: 1 + BogoMIPS: 4890.80 + Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero xsaveerptr wbnoinvd arat npt lbrv nrip_save tsc_scale vmcb_clean flushbyasid pausefilter pfthreshold v_vmsave_vmload vgif umip pku ospke vaes vpclmulqdq rdpid overflow_recov succor fsrm arch_capabilities + Virtualization: AMD-V + Hypervisor vendor: KVM + Virtualization type: full + L1d cache: 1 MiB (16 instances) + L1i cache: 1 MiB (16 instances) + L2 cache: 8 MiB (16 instances) + L3 cache: 256 MiB (16 instances) + NUMA node(s): 1 + NUMA node0 CPU(s): 0-15 + Vulnerability Gather data sampling: Not affected + Vulnerability Indirect target selection: Not affected + Vulnerability Itlb multihit: Not affected + Vulnerability L1tf: Not affected + Vulnerability Mds: Not affected + Vulnerability Meltdown: Not affected + Vulnerability Mmio stale data: Not affected + Vulnerability Reg file data sampling: Not affected + Vulnerability Retbleed: Not affected + Vulnerability Spec rstack overflow: Mitigation; Safe RET + Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl + Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization + Vulnerability Spectre v2: Mitigation; Retpolines; IBPB conditional; IBRS_FW; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected + Vulnerability Srbds: Not affected + Vulnerability Tsa: Vulnerable: No microcode + Vulnerability Tsx async abort: Not affected + Vulnerability Vmscape: Not affected + diff --git a/tests/86893F55/golden.txt b/tests/86893F55/golden.txt new file mode 100644 index 000000000..60865cc0f --- /dev/null +++ b/tests/86893F55/golden.txt @@ -0,0 +1,48 @@ +D/cons.1.00.000000.dat 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 +D/cons.1.00.000040.dat 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 +D/cons.1.01.000000.dat 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 +D/cons.1.01.000040.dat 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 +D/cons.2.00.000000.dat 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 +D/cons.2.00.000040.dat 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 +D/cons.2.01.000000.dat 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 +D/cons.2.01.000040.dat 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 +D/cons.3.00.000000.dat 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 +D/cons.3.00.000040.dat 189999.9999999999 190000.00000000003 190000.0000000002 189999.9999999999 189999.99999999997 190000.0000000002 189999.99999999997 189999.9999999999 190000.00000000012 189999.99999999977 190000.0 190000.0000000001 190000.0 189999.99999999997 190000.00000000003 190000.0000000001 189999.99999999985 190000.0000000001 189999.99999999997 190000.00000000015 189999.99999999997 190000.00000000003 190000.00000000003 190000.0 189999.9999999999 189999.99999999988 190000.00000000023 189999.99999999997 190000.00000000003 189999.9999999999 189999.99999999988 190000.00000000023 189999.99999999997 190000.00000000003 189999.9999999999 189999.99999999988 190000.00000000023 189999.99999999997 190000.00000000003 189999.9999999999 189999.9999999999 190000.00000000012 190000.00000000003 189999.99999999985 190000.0000000001 190000.00000000003 189999.99999999985 190000.0000000001 190000.00000000003 189999.99999999985 +D/cons.3.01.000000.dat 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 190000.0 +D/cons.3.01.000040.dat 190000.00000000012 190000.00000000003 189999.9999999998 190000.00000000003 190000.00000000003 190000.0 189999.9999999999 189999.99999999997 190000.0000000001 190000.00000000003 189999.99999999988 190000.0 190000.00000000003 189999.99999999985 190000.0000000001 190000.00000000003 189999.99999999985 190000.0000000001 190000.00000000003 189999.99999999985 190000.00000000012 190000.00000000003 189999.9999999998 189999.9999999999 190000.00000000015 189999.99999999997 189999.99999999997 190000.0000000001 190000.0 189999.99999999997 190000.0000000001 190000.0 190000.0 190000.0000000001 189999.99999999988 190000.0 190000.0 190000.0 190000.0 190000.0000000001 189999.99999999988 190000.0 190000.00000000003 190000.0 190000.0 190000.0 189999.99999999997 189999.99999999985 190000.0000000001 190000.00000000012 +D/cons.4.00.000000.dat 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 +D/cons.4.00.000040.dat 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 +D/cons.4.01.000000.dat 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 +D/cons.4.01.000040.dat 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 9129500000.0 +D/cons.5.00.000000.dat 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 +D/cons.5.00.000040.dat 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 +D/cons.5.01.000000.dat 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 +D/cons.5.01.000040.dat 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 +D/cons.6.00.000000.dat 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 +D/cons.6.00.000040.dat 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 +D/cons.6.01.000000.dat 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 +D/cons.6.01.000040.dat 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 +D/prim.1.00.000000.dat 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 +D/prim.1.00.000040.dat 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 +D/prim.1.01.000000.dat 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 1805.0 +D/prim.1.01.000040.dat 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 768.6566305325617 +D/prim.2.00.000000.dat 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 +D/prim.2.00.000040.dat 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 +D/prim.2.01.000000.dat 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 95.0 +D/prim.2.01.000040.dat 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 1131.3433694674397 +D/prim.3.00.000000.dat 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 +D/prim.3.00.000040.dat 99.99999999999989 99.99999999999994 100.00000000000003 99.99999999999989 99.99999999999991 100.00000000000003 99.99999999999991 99.99999999999989 99.99999999999999 99.9999999999998 99.99999999999993 99.99999999999997 99.99999999999993 99.99999999999991 99.99999999999994 99.99999999999997 99.99999999999986 99.99999999999997 99.99999999999991 100.0 99.99999999999991 99.99999999999994 99.99999999999994 99.99999999999993 99.99999999999989 99.99999999999987 100.00000000000006 99.99999999999991 99.99999999999994 99.99999999999989 99.99999999999987 100.00000000000006 99.99999999999991 99.99999999999994 99.99999999999989 99.99999999999987 100.00000000000006 99.99999999999991 99.99999999999994 99.99999999999989 99.99999999999989 99.99999999999999 99.99999999999994 99.99999999999986 99.99999999999997 99.99999999999994 99.99999999999986 99.99999999999997 99.99999999999994 99.99999999999986 +D/prim.3.01.000000.dat 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 +D/prim.3.01.000040.dat 99.99999999999999 99.99999999999994 99.99999999999982 99.99999999999994 99.99999999999994 99.99999999999993 99.99999999999989 99.99999999999991 99.99999999999997 99.99999999999994 99.99999999999987 99.99999999999993 99.99999999999994 99.99999999999986 99.99999999999997 99.99999999999994 99.99999999999986 99.99999999999997 99.99999999999994 99.99999999999986 99.99999999999999 99.99999999999994 99.99999999999982 99.99999999999989 100.0 99.99999999999991 99.99999999999991 99.99999999999997 99.99999999999993 99.99999999999991 99.99999999999997 99.99999999999993 99.99999999999993 99.99999999999997 99.99999999999987 99.99999999999993 99.99999999999993 99.99999999999993 99.99999999999993 99.99999999999997 99.99999999999987 99.99999999999993 99.99999999999994 99.99999999999993 99.99999999999993 99.99999999999993 99.99999999999991 99.99999999999986 99.99999999999997 99.99999999999999 +D/prim.4.00.000000.dat 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 +D/prim.4.00.000040.dat 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 +D/prim.4.01.000000.dat 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 2000000000.0 +D/prim.4.01.000040.dat 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 10290746955.739494 +D/prim.5.00.000000.dat 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 +D/prim.5.00.000040.dat 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 +D/prim.5.01.000000.dat 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 0.95 +D/prim.5.01.000040.dat 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 0.40455612133293 +D/prim.6.00.000000.dat 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 +D/prim.6.00.000040.dat 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 +D/prim.6.01.000000.dat 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 +D/prim.6.01.000040.dat 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 0.59544387866707 \ No newline at end of file diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 9d7351245..12ceda665 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -1960,6 +1960,11 @@ def check_reactive_burn(self): self.prohibit(not self._is_numeric(rn) or rn < 0, "reactive_burn requires rburn%n >= 0 (pressure-drive exponent)") rta = self.get("rburn%ta") self.prohibit(self._is_numeric(rta) and rta < 0, "reactive_burn requires rburn%ta >= 0 (activation temperature [K]; 0 disables the Arrhenius factor)") + rsub = self.get("rburn%substeps") + self.prohibit( + self._is_numeric(rsub) and rsub < 0, + "reactive_burn requires rburn%substeps >= 0 (operator-split sub-steps per time step; 0 adds the source to the flow RHS)", + ) cv1 = self.get("fluid_pp(1)%cv") self.prohibit( self._is_numeric(rta) and rta > 0 and (not self._is_numeric(cv1) or cv1 <= 0), diff --git a/toolchain/mfc/params/definitions.py b/toolchain/mfc/params/definitions.py index 5128bc08e..2518ba224 100644 --- a/toolchain/mfc/params/definitions.py +++ b/toolchain/mfc/params/definitions.py @@ -652,6 +652,7 @@ def _load(): _r("reactive_burn", LOG, {"reactive_burn"}) for a in ["k", "pign", "pref", "n", "ta"]: _r(f"rburn%{a}", REAL, {"reactive_burn"}) + _r("rburn%substeps", INT, {"reactive_burn"}) # Acoustic _r("num_source", INT, {"acoustic"}) diff --git a/toolchain/mfc/params/generators/fortran_gen.py b/toolchain/mfc/params/generators/fortran_gen.py index 66e8c4cf4..7feb4077a 100644 --- a/toolchain/mfc/params/generators/fortran_gen.py +++ b/toolchain/mfc/params/generators/fortran_gen.py @@ -553,12 +553,13 @@ def _emit_chem_params(lines: List[str]) -> None: def _emit_rburn(lines: List[str]) -> None: """Emit the rburn member broadcast block (sim-only, under reactive_burn guard). - All rburn members are REAL, so they broadcast with mpi_p (extend the type split if other kinds appear). + Members are REAL apart from the integer sub-step count, so the kind comes from the registry. """ rburn_members = sorted(k.split("%", 1)[1] for k in REGISTRY.all_params if k.startswith("rburn%")) lines.append(" if (reactive_burn) then") for mem in rburn_members: - lines.append(f" call MPI_BCAST(rburn%{mem}, 1, mpi_p, 0, MPI_COMM_WORLD, ierr)") + kind = _mpi_type_for(REGISTRY.all_params[f"rburn%{mem}"].param_type) + lines.append(f" call MPI_BCAST(rburn%{mem}, 1, {kind}, 0, MPI_COMM_WORLD, ierr)") lines.append(" end if") diff --git a/toolchain/mfc/test/cases.py b/toolchain/mfc/test/cases.py index 34a8c4bc5..eb0cf14f5 100644 --- a/toolchain/mfc/test/cases.py +++ b/toolchain/mfc/test/cases.py @@ -3273,6 +3273,14 @@ def reactive_burn_cases(): stack.push("Arrhenius", {"rburn%ta": 500.0, "fluid_pp(1)%cv": 1500.0, "fluid_pp(2)%cv": 1500.0}) cases.append(define_case_d(stack, "", {})) stack.pop() + # Operator-split burn (rburn%substeps > 0): the source is integrated per cell after the flow + # update rather than entering the flow RHS, so the reaction time scale is decoupled from the + # acoustic CFL. Nothing else reaches s_reactive_burn_substep. Run on 2 ranks because substeps + # is the one integer among the rburn members: a broadcast emitted with the real kind leaves + # rank 1 sub-stepping a garbage count, which a single-rank golden cannot see. + stack.push("substeps", {"rburn%substeps": 10}) + cases.append(define_case_d(stack, "", {}, ppn=2)) + stack.pop() # Same burn on 2 MPI ranks: the rburn parameters must be broadcast to non-root ranks, or # rank 1's half of the domain burns with the sentinel default and diverges. The single-rank # goldens cannot catch a broken rburn broadcast; this one does. From ed51f3348d7f2899297af31ab6acea78b6c58d6a Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Sat, 5 Sep 2026 21:49:00 -0500 Subject: [PATCH 2/2] Guard the reactant phasic density in the Arrhenius factor Completing a sub-step drives the reactant volume fraction to exactly zero, and the lambda >= 1 test only covers the same iteration if the volume fractions still sum to one, which the six-equation model does not guarantee. Use the max(alpha, sgm_eps) form the Riemann solvers already use for this. --- src/simulation/m_reactive_burn.fpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/simulation/m_reactive_burn.fpp b/src/simulation/m_reactive_burn.fpp index 5760ba049..ae625bd54 100644 --- a/src/simulation/m_reactive_burn.fpp +++ b/src/simulation/m_reactive_burn.fpp @@ -45,7 +45,8 @@ contains ! Optional Arrhenius dependence on the reactant phasic temperature from the stiffened-gas ! EOS. rburn%ta = 0, the default, leaves the pure pressure-driven rate unchanged. if (rburn%ta > 0._wp) then - rate = rate*exp(-rburn%ta/f_sg_thermal(pres, alpha_rho_react/alpha_react, isentrope_n(1), isentrope_B(1), cvs(1))) + rate = rate*exp(-rburn%ta/f_sg_thermal(pres, alpha_rho_react/max(alpha_react, sgm_eps), isentrope_n(1), & + & isentrope_B(1), cvs(1))) end if else rate = 0._wp