diff --git a/docs/documentation/case.md b/docs/documentation/case.md index 259b0bed4..2883189d9 100644 --- a/docs/documentation/case.md +++ b/docs/documentation/case.md @@ -1256,6 +1256,7 @@ When ``cyl_coord = 'T'`` is set in 2D the following constraints must be met: | `chem_params%%transport_model` | Integer | Methodology for calculating the diffusion coefficients | | `chem_params%%reaction_substeps` | Integer | Sub-steps for operator-split reaction integration (0 = off) | | `chem_params%%adap_substeps` | Logical | Per-rank adaptive sub-step count driven by local stiffness | +| `chem_params%%transport_dt` | Logical | Limit the adaptive dt by the local chemistry transport | | `chem_params%%reaction_substeps_max` | Integer | Sub-step ceiling when `adap_substeps` is enabled | | `cantera_file` | String | Cantera-format mechanism file (e.g., .yaml) | | `surface_cantera_file` | String | Cantera-format mechanism file for heterogeneous surface chemistry | @@ -1265,6 +1266,8 @@ When ``cyl_coord = 'T'`` is set in 2D the following constraints must be met: - `chem_params%%reaction_substeps` controls how the reaction source is integrated. With `0` (default) the net production rates are added to the flow right-hand side and advanced by the flow time stepper (fine for hydrogen). With a value `> 0`, the reaction is instead integrated by operator splitting after each flow update: every cell's constant-density, constant-internal-energy reactor is advanced over the timestep with that many sub-steps of an **α-QSS** (quasi-steady-state) integrator — a matrix-free, Jacobian-free predictor–corrector (Mott/CHEMEQ2) that splits the net rate into creation/destruction parts and applies a Padé α-weighting, so it stays stable on stiff mechanisms where an explicit source diverges. This decouples the (often much faster) chemical timescale from the flow timestep and is required for stiff mechanisms — e.g. hydrocarbons such as GRI-Mech methane, which otherwise diverge on the first step - `chem_params%%adap_substeps` (default `F`) makes each rank choose its α-QSS sub-step count per flow step from the largest chemical stiffness among its own cells: the count sits at `reaction_substeps` (the floor) in inert or burned gas and rises toward `reaction_substeps_max` (the ceiling) only across the reaction front. It uses no MPI collectives. When enabled, `reaction_substeps >= 1` and `reaction_substeps_max >= reaction_substeps` are required +- `chem_params%%transport_dt` (default `F`) replaces the constant `fluid_pp%%Re` in the viscous time-step limit with the local mixture transport: dt <= `cfl_target`·Δx²/(d·D), with d the number of dimensions (explicit diffusion is stable while the d per-direction diffusion numbers sum below the limit) and D the largest of μ/ρ (with `viscous`), and λ/(ρ c_v) and the mixture-averaged species diffusivities (with `chem_params%%diffusion`); c_v, not c_p, because a cell cannot expand within a step. Mixture transport grows steeply with temperature, so near hot walls and flames a dt limited by the free-stream viscosity can exceed the explicit diffusion limit. Requires `cfl_adap_dt` or `cfl_const_dt`, and `viscous` or `chem_params%%diffusion`. A non-Newtonian `mu_max` or bulk viscosity (`fluid_pp%%Re(2)`) still bounds dt when it is tighter. Not supported with `igr` + - `cantera_file` specifies the chemical mechanism file. If the file is part of the standard Cantera library, only the filename is required. Otherwise, the file must be located in the same directory as your `case.py` file - `surface_cantera_file` and `surface_phase` specify the Cantera mechanism file and interface phase used for heterogeneous surface chemistry. These parameters must be specified together when a surface mechanism is used. diff --git a/src/common/m_chemistry.fpp b/src/common/m_chemistry.fpp index 7cd7a08c4..0b4aea1c5 100644 --- a/src/common/m_chemistry.fpp +++ b/src/common/m_chemistry.fpp @@ -13,7 +13,7 @@ module m_chemistry & get_creation_destruction_rates, get_mole_fractions, get_species_binary_mass_diffusivities, & & get_species_mass_diffusivities_mixavg, gas_constant, get_mixture_molecular_weight, get_mixture_energy_mass, & & get_mixture_thermal_conductivity_mixavg, get_species_enthalpies_rt, get_mixture_viscosity_mixavg, & - & get_mixture_specific_heat_cp_mass, get_mixture_enthalpy_mass + & get_mixture_specific_heat_cp_mass, get_mixture_specific_heat_cv_mass, get_mixture_enthalpy_mass use m_thermochem_state, only: get_mixavg_transport_state, get_species_enthalpies_mass use m_global_parameters @@ -42,6 +42,39 @@ contains end subroutine compute_viscosity_and_inversion + !> Effective Reynolds numbers 1/(rho*D) from the largest local transport diffusivity D -- mu/rho with viscous, and + !! lambda/(rho*cv) and the mixture-averaged species diffusivities with chem_params%diffusion -- so the viscous dt limit + !! (dx^2*rho*Re) tracks the transport actually integrated, summed over the num_dims directions. + subroutine s_compute_transport_dt_re(pres, rho, T, Ys, Re) + + $:GPU_ROUTINE(function_name='s_compute_transport_dt_re',parallelism='[seq]', cray_inline=True) + + real(wp), intent(in) :: pres, rho, T + real(wp), dimension(num_species), intent(in) :: Ys + real(wp), dimension(2), intent(out) :: Re + real(wp) :: D_max, prop, cv + real(wp), dimension(num_species) :: D_k + + D_max = 0._wp + if (viscous) then + call get_mixture_viscosity_mixavg(T, Ys, prop) + D_max = prop/rho + end if + if (chem_params%diffusion) then + ! cv, not cp: a cell cannot expand within a step, so the grid-scale mode of T diffuses at lambda/(rho*cv) + call get_mixture_thermal_conductivity_mixavg(T, Ys, prop) + call get_mixture_specific_heat_cv_mass(T, Ys, cv) + D_max = max(D_max, prop/(rho*cv)) + if (chem_params%transport_model == 1) then + call get_species_mass_diffusivities_mixavg(pres, T, Ys, D_k) + D_max = max(D_max, maxval(D_k)) + end if + end if + ! The diffusion numbers of the num_dims directions add up + Re(:) = 1._wp/(rho*real(num_dims, wp)*max(D_max, sgm_eps)) + + end subroutine s_compute_transport_dt_re + !> Initialize the temperature field from conservative variables by inverting the energy equation. subroutine s_compute_q_T_sf(q_T_sf, q_cons_vf, bounds) diff --git a/src/common/m_derived_types.fpp b/src/common/m_derived_types.fpp index 1232e3f5a..c70ca414c 100644 --- a/src/common/m_derived_types.fpp +++ b/src/common/m_derived_types.fpp @@ -567,6 +567,8 @@ module m_derived_types !> Zero MPI: each rank sizes its own work from its own cells. Default F = fixed reaction_substeps. logical :: adap_substeps integer :: reaction_substeps_max + !> Limit dt by the mixture's local viscous, thermal and species diffusivities rather than fluid_pp%Re. + logical :: transport_dt end type chemistry_parameters !> Condensed-phase reactive-burn (programmed pressure detonation) parameters. The rate is diff --git a/src/post_process/m_global_parameters.fpp b/src/post_process/m_global_parameters.fpp index bd90c28ed..85bfe9332 100644 --- a/src/post_process/m_global_parameters.fpp +++ b/src/post_process/m_global_parameters.fpp @@ -205,6 +205,7 @@ contains chem_params%reaction_substeps = 0 chem_params%adap_substeps = .false. chem_params%reaction_substeps_max = 0 + chem_params%transport_dt = .false. ! Fluids physical parameters (post-specific; G = dflt_real differs from pre/sim) do i = 1, num_fluids_max diff --git a/src/pre_process/m_global_parameters.fpp b/src/pre_process/m_global_parameters.fpp index b358516fb..6a6ec29e2 100644 --- a/src/pre_process/m_global_parameters.fpp +++ b/src/pre_process/m_global_parameters.fpp @@ -422,6 +422,7 @@ contains chem_params%reaction_substeps = 0 chem_params%adap_substeps = .false. chem_params%reaction_substeps_max = 0 + chem_params%transport_dt = .false. ! Fluids physical parameters do i = 1, num_fluids_max diff --git a/src/simulation/m_global_parameters.fpp b/src/simulation/m_global_parameters.fpp index 6157db87e..cf63fef96 100644 --- a/src/simulation/m_global_parameters.fpp +++ b/src/simulation/m_global_parameters.fpp @@ -423,6 +423,7 @@ contains chem_params%reaction_substeps = 0 chem_params%adap_substeps = .false. chem_params%reaction_substeps_max = 0 + chem_params%transport_dt = .false. num_bc_patches = 0 bc_io = .false. diff --git a/src/simulation/m_sim_helpers.fpp b/src/simulation/m_sim_helpers.fpp index 82e56e943..67c7860dd 100644 --- a/src/simulation/m_sim_helpers.fpp +++ b/src/simulation/m_sim_helpers.fpp @@ -254,7 +254,7 @@ contains end if ! Viscous calculations - if (viscous) then + if (viscous .or. chem_params%transport_dt) then if (p > 0) then if (grid_geometry == 3) then fltr_dtheta = f_compute_filtered_dtheta(k, l) diff --git a/src/simulation/m_time_steppers.fpp b/src/simulation/m_time_steppers.fpp index c1f46719a..70475b737 100644 --- a/src/simulation/m_time_steppers.fpp +++ b/src/simulation/m_time_steppers.fpp @@ -671,22 +671,24 @@ contains real(wp), dimension(num_vels) :: vel !< Cell-avg. velocity real(wp), dimension(num_fluids) :: alpha, alpha_rho !< Cell-avg. volume fraction, partial density #:endif - real(wp) :: vel_sum !< Cell-avg. velocity sum - real(wp) :: pres !< Cell-avg. pressure - real(wp) :: gamma !< Cell-avg. sp. heat ratio - real(wp) :: pi_inf !< Cell-avg. liquid stiffness function - real(wp) :: qv !< Cell-avg. fluid reference energy - real(wp) :: c !< Cell-avg. sound speed - real(wp), dimension(2) :: Re !< Cell-avg. Reynolds numbers - real(wp), dimension(4) :: max_dt !< Cell dt candidates (inviscid, viscous, capillary, thermal) - real(wp) :: icfl_dt_local, vcfl_dt_local, ccfl_dt_local, tcfl_dt_local, coll_dt_local - real(wp), dimension(5) :: dt_candidates_loc !< Rank-local dt candidates (ICFL, VCFL, CCFL, TCFL, collision cap) - real(wp), dimension(5) :: dt_candidates_glb !< Global dt candidates (ICFL, VCFL, CCFL, TCFL, collision cap) - real(wp) :: dt_prev - logical :: is_fluid_cell !< Cell lies outside every immersed boundary - integer :: bad_cell !< 1 + linear index of a fluid cell with no valid dt, 0 if none - integer :: j, k, l !< Generic loop iterators - integer :: fl !< Fluid loop iterator + real(wp) :: vel_sum !< Cell-avg. velocity sum + real(wp) :: pres !< Cell-avg. pressure + real(wp) :: gamma !< Cell-avg. sp. heat ratio + real(wp) :: pi_inf !< Cell-avg. liquid stiffness function + real(wp) :: qv !< Cell-avg. fluid reference energy + real(wp) :: c !< Cell-avg. sound speed + real(wp), dimension(2) :: Re !< Cell-avg. Reynolds numbers + real(wp), dimension(4) :: max_dt !< Cell dt candidates (inviscid, viscous, capillary, thermal) + real(wp) :: icfl_dt_local, vcfl_dt_local, ccfl_dt_local, tcfl_dt_local, coll_dt_local + real(wp), dimension(5) :: dt_candidates_loc !< Rank-local dt candidates (ICFL, VCFL, CCFL, TCFL, collision cap) + real(wp), dimension(5) :: dt_candidates_glb !< Global dt candidates (ICFL, VCFL, CCFL, TCFL, collision cap) + real(wp) :: dt_prev + real(wp), dimension(num_species) :: Ys !< Cell mass fractions, for chem_params%transport_dt + real(wp), dimension(2) :: Re_chem !< Transport-limited Reynolds numbers, for chem_params%transport_dt + logical :: is_fluid_cell !< Cell lies outside every immersed boundary + integer :: bad_cell !< 1 + linear index of a fluid cell with no valid dt, 0 if none + integer :: j, k, l !< Generic loop iterators + integer :: fl !< Fluid loop iterator if (.not. igr) then call s_convert_conservative_to_primitive_variables(q_cons_ts(1)%vf, q_T_sf, q_prim_vf, idwint) @@ -700,7 +702,7 @@ contains coll_dt_local = huge(1.0_wp) bad_cell = 0 $:GPU_PARALLEL_LOOP(collapse=3, private='[vel, alpha, alpha_rho, Re, rho, vel_sum, pres, gamma, pi_inf, c, qv, fl, & - & max_dt, is_fluid_cell]', reduction='[[icfl_dt_local, vcfl_dt_local, ccfl_dt_local, & + & max_dt, is_fluid_cell, Ys, Re_chem]', reduction='[[icfl_dt_local, vcfl_dt_local, ccfl_dt_local, & & tcfl_dt_local], [bad_cell]]', reductionOp='[min, max]') do l = 0, p do k = 0, n @@ -733,6 +735,21 @@ contains Re(1) = 1._wp/max(Re(1), sgm_eps) end if + if (chemistry .and. chem_params%transport_dt) then + $:GPU_LOOP(parallelism='[seq]') + do fl = 1, num_species + Ys(fl) = q_prim_vf(eqn_idx%species%beg + fl - 1)%sf(j, k, l) + end do + call s_compute_transport_dt_re(pres, rho, q_T_sf%sf(j, k, l), Ys, Re_chem) + ! Keep the bounds Cantera does not replace: the HB mu_max in Re(1) and bulk viscosity in Re(2). + ! Without viscous, Re holds dflt_real, not a bound + if (viscous) then + if (any_non_newtonian) Re_chem(1) = min(Re_chem(1), Re(1)) + Re_chem(2) = min(Re_chem(2), Re(2)) + end if + Re = Re_chem + end if + call s_compute_dt_from_cfl(vel, c, max_dt, rho, Re, alpha, alpha_rho, j, k, l) ! min() drops a NaN candidate, so a cell with a NaN or non-positive dt would otherwise vanish from diff --git a/tests/88B73ED4/golden-metadata.txt b/tests/88B73ED4/golden-metadata.txt new file mode 100644 index 000000000..4ef7dfcef --- /dev/null +++ b/tests/88B73ED4/golden-metadata.txt @@ -0,0 +1,42 @@ +This file was created on 2026-10-06 21:31:50.689085. + +mfc.sh: + + Invocation: test --no-mpi -j 16 --generate -o 88B73ED4 + Lock: mpi=No & gpu=No & debug=No & reldebug=No & gcov=No & unified=No & single=No & mixed=No & fastmath=No + Git: f4cc200acd8c414efc756810fe7a181efe61c178 on chem-transport-dt (clean) + +CPU: + + CPU Info: + From lscpu + Architecture: x86_64 + CPU op-mode(s): 32-bit, 64-bit + Byte Order: Little Endian + CPU(s): 192 + On-line CPU(s) list: 0-95 + Off-line CPU(s) list: 96-191 + Thread(s) per core: 1 + Core(s) per socket: 24 + Socket(s): 4 + NUMA node(s): 4 + Vendor ID: AuthenticAMD + CPU family: 25 + Model: 144 + Model name: AMD Instinct MI300A Accelerator + Stepping: 1 + CPU MHz: 3699.889 + CPU max MHz: 3700.0000 + CPU min MHz: 1500.0000 + BogoMIPS: 7399.79 + Virtualization: AMD-V + L1d cache: 32K + L1i cache: 32K + L2 cache: 1024K + L3 cache: 32768K + NUMA node0 CPU(s): 0-23 + NUMA node1 CPU(s): 24-47 + NUMA node2 CPU(s): 48-71 + NUMA node3 CPU(s): 72-95 + Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good amd_lbr_v2 nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 invpcid_single hw_pstate ssbd mba perfmon_v2 ibrs ibpb stibp ibrs_enhanced vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local avx512_bf16 clzero irperf xsaveerptr wbnoinvd amd_ppin cppc arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif x2avic v_spec_ctrl avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid overflow_recov succor smca fsrm flush_l1d + diff --git a/tests/88B73ED4/golden.txt b/tests/88B73ED4/golden.txt new file mode 100644 index 000000000..b6b763520 --- /dev/null +++ b/tests/88B73ED4/golden.txt @@ -0,0 +1,56 @@ +D/cons.1.00.000000.dat 0.03509524834168 0.03509512801574 0.03509500769061 0.03509488736632 0.03509476704285 0.0350946467202 0.03509452639838 0.03509440607738 0.03509428575721 0.03509416543786 0.03509404511934 0.03509392480165 0.03509380448477 0.03509368416873 0.03509356385351 0.03509344353911 0.03509332322554 0.03509320291279 0.03509308260087 0.03509296228977 0.0350928419795 0.03509272167005 0.03509260136143 0.03509248105364 0.03509236074666 0.03509224044052 0.03509212013519 0.0350919998307 0.03509187952702 0.03509175922418 0.03509163892215 0.03509151862095 0.03509139832058 0.03509127802103 0.03509115772231 0.03509103742441 0.03509091712734 0.03509079683109 0.03509067653566 0.03509055624106 0.03509043594729 0.03509031565434 0.03509019536221 0.03509007507091 0.03508995478044 0.03508983449079 0.03508971420196 0.03508959391396 0.03508947362678 0.03508935334043 +D/cons.1.00.000001.dat 0.03794363812361 0.03681024547314 0.03583358472128 0.03512477758962 0.03466095393403 0.03440353762851 0.03430723923139 0.03432370694116 0.03440935170637 0.03452807101456 0.03465339858069 0.03476843224256 0.03486448463976 0.03493901414094 0.03499340125407 0.03503101369888 0.03505579436131 0.03507140550059 0.03508083147561 0.03508629165314 0.03508932348723 0.03509093249048 0.03509174749045 0.03509215541133 0.03509240844722 0.03509269864636 0.0350932418575 0.03509437285856 0.03509665256651 0.03510104679664 0.03510917377129 0.03512363035863 0.03514837164745 0.03518905341216 0.03525314386314 0.03534947225876 0.03548673954932 0.03567045772066 0.03589798423477 0.03615204517849 0.0363946337718 0.03656515193161 0.03658838968223 0.0363916793428 0.03593002784523 0.03520442097719 0.03426004490283 0.03316239337788 0.03199233593493 0.03092213024417 +D/cons.10.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.10.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.11.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.11.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.12.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.12.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.13.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.13.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.14.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.14.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.2.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.2.00.000001.dat -0.25002989715578 -0.73225843784671 -1.28148340319563 -1.7889982102781 -2.15384879067542 -2.33752137455586 -2.34046422513297 -2.19080630063756 -1.93297144683618 -1.61621799332603 -1.28562096835077 -0.97582189047462 -0.70853430967551 -0.49322079013167 -0.32982386321895 -0.21226841997932 -0.1317028716282 -0.07890508745531 -0.04571710962068 -0.02565894012754 -0.01398767935447 -0.00746209114481 -0.00400820768153 -0.0024064506088 -0.0020560819473 -0.00284786625568 -0.00517362842464 -0.01005125679641 -0.01943028886767 -0.03668372669268 -0.06729678371509 -0.11971362506743 -0.20618694238365 -0.34329644663416 -0.55156501221086 -0.85336401593689 -1.26819926108761 -1.80474851133294 -2.45002955938754 -3.15815567376815 -3.84418479271293 -4.39117250073939 -4.67618104910204 -4.61133239184917 -4.18293702934569 -3.46199137405928 -2.57762170162179 -1.67682996543547 -0.89721866457965 -0.28873729909944 +D/cons.3.00.000000.dat 103262.14288000875 103262.66752437576 103263.19216533063 103263.71680287327 103264.24143700396 103264.76606772236 103265.29069502898 103265.81531892356 103266.33993940616 103266.86455647676 103267.38917013555 103267.91378038241 103268.43838721754 103268.96299064095 103269.48759065257 103270.01218725248 103270.53678044086 103271.0613702176 103271.58595658276 103272.11053953644 103272.63511907872 103273.15969520948 103273.68426792884 103274.20883723682 103274.73340313349 103275.25796561892 103275.78252469297 103276.30708035611 103276.83163260782 103277.35618144856 103277.8807268781 103278.40526889663 103278.9298075043 103279.45434270077 103279.97887448643 103280.50340286134 103281.02792782518 103281.5524493784 103282.07696752084 103282.60148225249 103283.1259935734 103283.65050148388 103284.17500598353 103284.69950707283 103285.22400475132 103285.7484990196 103286.27298987733 103286.7974773246 103287.32196136151 103287.84644198816 +D/cons.3.00.000001.dat 75614.00859774771 79538.85070060013 82703.957477024 85420.58207673118 87811.98162201305 89983.17533788082 92003.29055173529 93896.10903033313 95653.62399446263 97249.0985963337 98652.13188033656 99840.3600772954 100806.39782134288 101559.36126742899 102121.9750726384 102525.27067478184 102802.95123513546 102986.87641833219 103104.28195871197 103176.66848081183 103219.92452891043 103245.16275835171 103259.8392656254 103268.89155783132 103275.7745409759 103283.36672701893 103294.92442574726 103315.17382745977 103351.64180392661 103416.4907536034 103528.86417223788 103717.66906791105 104024.43865246483 104505.52322213115 105232.40315528386 106288.5344652799 107761.04738383362 109726.14861901886 112228.67842551926 115259.46368795744 118738.90965100192 122519.4084643149 126418.82249497858 130274.70102636599 133998.5117631693 137594.47249962468 141119.03244670632 144591.9804737343 148021.93449235085 151840.555746307 +D/cons.4.00.000000.dat 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +D/cons.4.00.000001.dat 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +D/cons.5.00.000000.dat 0.03509524834168 0.03509512801574 0.03509500769061 0.03509488736632 0.03509476704285 0.0350946467202 0.03509452639838 0.03509440607738 0.03509428575721 0.03509416543786 0.03509404511934 0.03509392480165 0.03509380448477 0.03509368416873 0.03509356385351 0.03509344353911 0.03509332322554 0.03509320291279 0.03509308260087 0.03509296228977 0.0350928419795 0.03509272167005 0.03509260136143 0.03509248105364 0.03509236074666 0.03509224044052 0.03509212013519 0.0350919998307 0.03509187952702 0.03509175922418 0.03509163892215 0.03509151862095 0.03509139832058 0.03509127802103 0.03509115772231 0.03509103742441 0.03509091712734 0.03509079683109 0.03509067653566 0.03509055624106 0.03509043594729 0.03509031565434 0.03509019536221 0.03509007507091 0.03508995478044 0.03508983449079 0.03508971420196 0.03508959391396 0.03508947362678 0.03508935334043 +D/cons.5.00.000001.dat 0.03794363812361 0.03681024547314 0.03583358472128 0.03512477758962 0.03466095393403 0.03440353762851 0.03430723923139 0.03432370694116 0.03440935170637 0.03452807101456 0.03465339858069 0.03476843224256 0.03486448463976 0.03493901414094 0.03499340125407 0.03503101369888 0.03505579436131 0.03507140550059 0.03508083147561 0.03508629165314 0.03508932348723 0.03509093249048 0.03509174749045 0.03509215541133 0.03509240844722 0.03509269864636 0.0350932418575 0.03509437285856 0.03509665256651 0.03510104679664 0.03510917377129 0.03512363035863 0.03514837164745 0.03518905341216 0.03525314386314 0.03534947225876 0.03548673954932 0.03567045772066 0.03589798423477 0.03615204517849 0.0363946337718 0.03656515193161 0.03658838968223 0.0363916793428 0.03593002784523 0.03520442097719 0.03426004490283 0.03316239337788 0.03199233593493 0.03092213024417 +D/cons.6.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.6.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.7.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.7.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.8.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.8.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.9.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/cons.9.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.1.00.000000.dat 0.03509524834168 0.03509512801574 0.03509500769061 0.03509488736632 0.03509476704285 0.0350946467202 0.03509452639838 0.03509440607738 0.03509428575721 0.03509416543786 0.03509404511934 0.03509392480165 0.03509380448477 0.03509368416873 0.03509356385351 0.03509344353911 0.03509332322554 0.03509320291279 0.03509308260087 0.03509296228977 0.0350928419795 0.03509272167005 0.03509260136143 0.03509248105364 0.03509236074666 0.03509224044052 0.03509212013519 0.0350919998307 0.03509187952702 0.03509175922418 0.03509163892215 0.03509151862095 0.03509139832058 0.03509127802103 0.03509115772231 0.03509103742441 0.03509091712734 0.03509079683109 0.03509067653566 0.03509055624106 0.03509043594729 0.03509031565434 0.03509019536221 0.03509007507091 0.03508995478044 0.03508983449079 0.03508971420196 0.03508959391396 0.03508947362678 0.03508935334043 +D/prim.1.00.000001.dat 0.03794363812361 0.03681024547314 0.03583358472128 0.03512477758962 0.03466095393403 0.03440353762851 0.03430723923139 0.03432370694116 0.03440935170637 0.03452807101456 0.03465339858069 0.03476843224256 0.03486448463976 0.03493901414094 0.03499340125407 0.03503101369888 0.03505579436131 0.03507140550059 0.03508083147561 0.03508629165314 0.03508932348723 0.03509093249048 0.03509174749045 0.03509215541133 0.03509240844722 0.03509269864636 0.0350932418575 0.03509437285856 0.03509665256651 0.03510104679664 0.03510917377129 0.03512363035863 0.03514837164745 0.03518905341216 0.03525314386314 0.03534947225876 0.03548673954932 0.03567045772066 0.03589798423477 0.03615204517849 0.0363946337718 0.03656515193161 0.03658838968223 0.0363916793428 0.03593002784523 0.03520442097719 0.03426004490283 0.03316239337788 0.03199233593493 0.03092213024417 +D/prim.10.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.10.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.11.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.11.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.12.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.12.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.13.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.13.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.14.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.14.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.2.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.2.00.000001.dat -6.58950774148846 -19.89278877211144 -35.76207664298889 -50.93265589265932 -62.14049373179273 -67.94421549889441 -68.22071019318977 -63.82778830949569 -56.17575894282795 -46.80881224568351 -37.09941942222952 -28.06631842548352 -20.32252353638899 -14.11662012391187 -9.42531595669287 -6.05944269280752 -3.75695014270031 -2.24984104084415 -1.30319344490077 -0.731309549074 -0.39863063645456 -0.21265012398384 -0.11422080597775 -0.06857517244514 -0.05859050541931 -0.08115267179594 -0.14742520641567 -0.28640650844274 -0.55362228152257 -1.04508925061995 -1.91678631213229 -3.40834998674895 -5.86618761323515 -9.75577383719797 -15.64583897402641 -24.14078517750454 -35.73727192730789 -50.59504774135797 -68.24978091707293 -87.3575936900738 -105.625043978089 -120.09173403551313 -127.80505208658619 -126.71392128983892 -116.4189754420386 -98.3396766077314 -75.23696215030982 -50.56420223740147 -28.04480005475323 -9.337561701588 +D/prim.3.00.000000.dat 101325.00000000001 101325.00000000003 101324.99999999999 101324.99999999996 101325.00000000001 101324.99999999996 101325.0 101325.00000000001 101325.00000000004 101325.00000000003 101325.00000000004 101325.0 101325.0 101325.00000000001 101324.99999999999 101324.99999999999 101325.00000000001 101325.0 101324.99999999994 101324.99999999997 101325.00000000001 101325.0 101325.0 101325.0 101324.99999999999 101325.0 101324.99999999997 101325.00000000003 101324.99999999999 101325.00000000001 101325.0 101324.99999999999 101325.00000000006 101324.99999999993 101324.99999999997 101325.00000000001 101324.99999999997 101324.99999999999 101324.99999999999 101325.0 101324.99999999993 101325.00000000001 101324.99999999997 101325.00000000004 101324.99999999997 101325.0 101325.00000000003 101325.00000000001 101325.0 101324.99999999996 +D/prim.3.00.000001.dat 95264.82017340139 94871.51003590005 94441.82190694966 94291.30583117167 94433.06295879149 94845.66813884115 95480.09650090772 96262.03998655413 97111.57170962507 97954.09778642478 98730.74703416074 99403.07388585083 99953.29312389897 100381.01049858727 100698.00357271545 100922.66916657898 101075.3368217574 101175.03146304049 101237.72282425567 101275.76278058185 101298.09375714551 101310.84649505513 101318.05418885782 101322.33636535957 101325.49382938583 101328.99571335547 101334.50146683407 101344.45649544428 101362.80267099006 101396.01048493473 101454.42892427278 101553.93691682613 101717.7029654175 101977.58487373909 102374.34078579358 102955.4450342767 103769.07541292472 104853.06056256326 106218.68244220936 107831.70746331081 109597.00404392145 111357.19298418242 112918.09996381403 114095.37372152941 114774.63159117594 114949.84560213675 114708.6736205077 114161.96653963429 113448.88171594698 113039.58748904573 +D/prim.4.00.000000.dat 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +D/prim.4.00.000001.dat 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +D/prim.5.00.000000.dat 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +D/prim.5.00.000001.dat 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +D/prim.6.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.6.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.7.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.7.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.8.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.8.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.9.00.000000.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +D/prim.9.00.000001.dat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \ No newline at end of file diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 476009fbd..4161fc480 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -2189,6 +2189,21 @@ def check_chemistry(self): "chem_params%reaction_substeps_max must be >= reaction_substeps when adap_substeps = T", ) + # transport_dt replaces the viscous dt limit, so it needs a CFL-driven dt and some transport to limit by. + transport_dt = self.get("chem_params%transport_dt", "F") == "T" + if transport_dt: + self.prohibit(not chemistry, "chem_params%transport_dt requires chemistry = T") + self.prohibit( + not (self.get("cfl_adap_dt", "F") == "T" or self.get("cfl_const_dt", "F") == "T"), + "chem_params%transport_dt requires cfl_adap_dt or cfl_const_dt", + ) + self.prohibit( + not (self.get("viscous", "F") == "T" or self.get("chem_params%diffusion", "F") == "T"), + "chem_params%transport_dt requires viscous = T or chem_params%diffusion = T", + ) + # IGR does not allocate the primitive species or temperature the limit reads + self.prohibit(igr, "chem_params%transport_dt is not supported with igr") + # Isothermal walls need a heat-conduction path to evaluate the wall flux: either the reacting # mixture-averaged one, or Fourier conduction via fluid_pp(i)%k_therm. num_fluids_iso = self.get("num_fluids") or 1 diff --git a/toolchain/mfc/params/definitions.py b/toolchain/mfc/params/definitions.py index ba5613db2..94a9f1538 100644 --- a/toolchain/mfc/params/definitions.py +++ b/toolchain/mfc/params/definitions.py @@ -1164,7 +1164,7 @@ def _load(): _r("lag_params%input_path", STR, {"bubbles"}) # chem_params - for a in ["diffusion", "reactions", "adap_substeps"]: + for a in ["diffusion", "reactions", "adap_substeps", "transport_dt"]: _r(f"chem_params%{a}", LOG, {"chemistry"}) for a in ["gamma_method", "transport_model", "reaction_substeps", "reaction_substeps_max"]: _r(f"chem_params%{a}", INT, {"chemistry"}) diff --git a/toolchain/mfc/params/descriptions.py b/toolchain/mfc/params/descriptions.py index 7dfb46f3e..b73ee14b1 100644 --- a/toolchain/mfc/params/descriptions.py +++ b/toolchain/mfc/params/descriptions.py @@ -542,6 +542,7 @@ (r"chem_params%reactions", "Enable chemical reactions"), (r"chem_params%gamma_method", "Gamma calculation method (1=formulation, 2=cp/cv ratio)"), (r"chem_params%transport_model", "Transport model selection for chemistry"), + (r"chem_params%transport_dt", "Limit the adaptive dt by the local chemistry transport (viscous, thermal, species diffusivities)"), (r"chem_params%(\w+)", "Chemistry parameter: {0}"), # rburn (reactive-burn) patterns - specific fields first (r"rburn%k", "Reactive-burn rate coefficient [1/s]"), diff --git a/toolchain/mfc/test/cases.py b/toolchain/mfc/test/cases.py index d169be52b..a5eba891a 100644 --- a/toolchain/mfc/test/cases.py +++ b/toolchain/mfc/test/cases.py @@ -3587,6 +3587,26 @@ def chemistry_cases(): cases.append(define_case_d(stack, "", {}, override_tol=10 ** (-10))) + # A 10 um domain, where the H2 diffusion limit is ~3x tighter than the acoustic one + cases.append( + define_case_d( + stack, + "Transport-Limited dt", + { + "x_domain%end": 1.0e-5, + "patch_icpp(1)%x_centroid": 5.0e-6, + "patch_icpp(1)%length_x": 1.0e-5, + "cfl_adap_dt": "T", + "cfl_target": 0.5, + "n_start": 0, + "t_save": 7.0e-10, + "t_stop": 7.0e-10, + "chem_params%transport_dt": "T", + }, + override_tol=10 ** (-10), + ) + ) + stack.pop() stack.push( diff --git a/toolchain/mfc/test_case_validator.py b/toolchain/mfc/test_case_validator.py index c0170452d..81c464acc 100644 --- a/toolchain/mfc/test_case_validator.py +++ b/toolchain/mfc/test_case_validator.py @@ -201,6 +201,25 @@ def test_accepts_igr_without_substepping(self): self.assertAccepts({**CHEMISTRY, "igr": "T", "chem_params%reaction_substeps": 0}) +class TestChemistryTransportDt(ConstraintTestCase): + VALID = {**CHEMISTRY, "chem_params%transport_dt": "T", "cfl_adap_dt": "T", "chem_params%diffusion": "T"} + + def test_accepts_valid(self): + self.assertAccepts(self.VALID) + + def test_rejects_without_cfl_dt(self): + self.assertRejects({**self.VALID, "cfl_adap_dt": "F"}, "transport_dt requires cfl_adap_dt or cfl_const_dt") + + def test_rejects_without_transport(self): + self.assertRejects({**self.VALID, "chem_params%diffusion": "F"}, "transport_dt requires viscous = T or chem_params%diffusion = T") + + def test_rejects_igr(self): + self.assertRejects({**self.VALID, "igr": "T"}, "transport_dt is not supported with igr") + + def test_accepts_bulk_viscosity(self): + self.assertAccepts({**self.VALID, "viscous": "T", "fluid_pp(1)%Re(1)": 1.0e3, "fluid_pp(1)%Re(2)": 1.0e3}) + + class TestReactiveBurnFluidPairing(ConstraintTestCase): def test_rejects_wrong_num_fluids(self): self.assertRejects({**REACTIVE_BURN, "num_fluids": 3}, "reactive_burn requires num_fluids = 2")