diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..9b5ec5c --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,126 @@ +name: Rust + +on: + workflow_dispatch: + + pull_request: + branches: + - main + - local-develop + push: + branches: + - main + - local-develop + +jobs: + crate: + name: Crate + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - uses: Swatinem/rust-cache@v2 + + - name: Format + run: cargo fmt --all --check + + - name: Clippy + run: cargo clippy --all-targets -- -D warnings + + # Debug and release both, because the parity tests compare floating + # point and the two profiles have caught different things. + - name: Test + run: | + cargo test + cargo test --release + + # The crate declares rust-version = "1.74" and consumers will believe it. + # Nothing else here checks it: the other jobs run stable, which happily + # accepts APIs stabilised years later. The library only — dev-dependencies + # are free to need a newer compiler, since they reach nobody downstream. + msrv: + name: MSRV + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: dtolnay/rust-toolchain@1.74 + + - uses: Swatinem/rust-cache@v2 + + - name: Build on the declared minimum + run: cargo build -p endf + + goldens: + name: Goldens reproduce + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install + run: python -m pip install .[test] + + # The golden files are what holds the Rust reader to the Python one, so + # a change that quietly rewrites them would defeat the whole harness. + # + # `--check` compares the dump text rather than the compressed bytes and + # prints the offending lines. Comparing bytes would fail on any machine + # whose liblzma is not the one that wrote the file, which says nothing + # about the reader. + - name: Check for drift + run: | + python tools/dump_golden.py --check + python tools/dump_chain_golden.py --check + + bindings: + name: Python bindings + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.13"] + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + + - uses: dtolnay/rust-toolchain@stable + + - uses: Swatinem/rust-cache@v2 + + - name: Install + run: | + python -m pip install -U pip + python -m pip install .[test] maturin + + # An abi3 wheel, so one build serves every supported Python. + - name: Build the extension module + run: maturin build --release -m crates/endf-py/Cargo.toml -o dist + + - name: Install the extension module + run: python -m pip install --no-index --find-links dist endf-py + + # The bindings' tests compare the extension against the pure-Python + # reader on the same fixtures, so they only mean anything once it is + # installed. Fail rather than skip if the import did not take. + - name: Test + run: | + python -c "import _endf" + python -m pytest -ra tests/test_rust_bindings.py tests/test_rust_stub.py + + # The stub is only worth shipping if a type checker can use it. This + # fails on a stub that is present but wrong, which the name comparison + # in test_rust_stub.py cannot see. + - name: Type-check against the stub + run: | + python -m pip install mypy + python -m mypy --strict crates/endf-py/typecheck.py diff --git a/.gitignore b/.gitignore index d024ab7..56c6fcc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ doc/build/ *.so generated/ wheelhouse/ + +# Rust +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c05faa1 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,220 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "endf" +version = "0.1.0" +dependencies = [ + "lzma-rs", +] + +[[package]] +name = "endf-py" +version = "0.1.0" +dependencies = [ + "endf", + "lzma-rs", + "pyo3", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4ca8bc5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +resolver = "2" +members = ["crates/endf", "crates/endf-py"] + +[workspace.package] +version = "0.1.0" +edition = "2021" +license = "MIT" +repository = "https://github.com/paulromano/endf-python" +rust-version = "1.74" + +[profile.release] +lto = true +codegen-units = 1 diff --git a/ace b/ace new file mode 100644 index 0000000..e69de29 diff --git a/crates/README.md b/crates/README.md new file mode 100644 index 0000000..264a048 --- /dev/null +++ b/crates/README.md @@ -0,0 +1,126 @@ +# Rust layer + +An in-progress port of the reader to Rust, so that the same parser serves +consumers that never load Python — in particular a converter emitting Arrow +tables directly. + +``` +crates/ +├── endf/ the parser. No Arrow, no Python, no dependencies at all. +└── endf-py/ PyO3 bindings. Thin: every type forwards to the Rust one. +``` + +The `endf` crate has no dependencies. Its tests have one: the fixtures and the +golden dumps are stored xz-compressed, and `lzma-rs` (pure Rust) reads them. +That is a `[dev-dependencies]` entry, so it is not built for anything that uses +the crate. + +## Why two crates + +`endf` describes the ENDF-6 format and nothing else. A simulation-ready +projection of the data — reconstructed resonances, summed reactions, unionised +grids, an Arrow schema — is a consumer's concern and belongs in the consumer, +which is free to depend on `arrow-rs` without that cost reaching everyone who +just wants to read a file. + +`endf-py` exists so the Python package keeps its API while the parser moves +underneath it. + +## The Python surface + +The concrete types come across as classes — `Material`, `Tabulated1D`, +`Tabulated2D`, `CrossSection`, `Product`, `Reaction`, `IncidentNeutron`, +`IncidentPhoton`, `Decay`, `Chain`, `AceTable`, `FissionProductYields`, +`RadionuclideProduction` — with the free functions beside them: +`float_endf`, `int_endf`, `get_materials`, +`get_tables`, `ace_tables_from_string`, `reaction_name`, `reaction_mt`, +`photon_reaction_name`, `photon_reaction_mt`, `gnds_name`, `zam`, +`temperature_str`, `decay_modes`, `normalise_branch_ratios`, +`radionuclide_production`, `isomer_table` and `level_to_isomeric_state`, and the +constant tables `ATOMIC_SYMBOL`, `SUM_RULES`, `INTERPOLATION_SCHEME`, +`FISSION_MTS`, `EV_PER_MEV` and `K_BOLTZMANN`. + +`Material.interpret()` picks the class the material's sublibrary calls for, as +it does upstream: an `IncidentNeutron` for NSUB=10, an `IncidentPhoton` for +NSUB=3, and an error for anything else. + +The sum types do not. An angle-energy distribution, an outgoing energy law and +a univariate density come across as dicts tagged with a `kind` key: + +```python +>>> rx = neutron[51] +>>> rx.products[0].distribution[0] +{'kind': 'uncorrelated', + 'angle': {'energy': [...], 'mu': [{'kind': 'legendre', 'coefficients': [...]}, ...]}, + 'energy': {'kind': 'level-inelastic', 'threshold': 1.4e6, 'mass_ratio': 0.98}} +``` + +That is the shape a consumer wants anyway — `kind` is exactly the discriminant +an Arrow union column needs — and it saves a wrapper class per variant for no +gain in what can be expressed. + +`Material.section_data` and `material[3, 1]` are there too, giving back the +same dictionaries the Python reader does, keyed by the same ENDF field names. +Every one of the 403 sections across the fixtures has one — MF 1, 2, 3, 4, 5, 6, +7, 8, 9, 10, 12, 13, 14, 15, 23, 26, 27, 28, 33, 34 and 40 — so code written +against `Material.section_data` runs unchanged against either reader. That is +held by `tests/test_rust_bindings.py`, which compares the two dictionaries key +by key and pins the set of sections without one, currently empty, so a +projection that stops being built fails rather than silently disappearing. + +The upstream quirks come with them, because matching means matching: MT=458 +reports `ZA` as a float since it is read from a CONT record, MF=7 MT=4 stores +the outer `LT` on each additional temperature rather than the `LI` it read, an +unresolved range with LRF=1 is dispatched past unread, and a decay record too +short for its internal conversion coefficients yields an empty tuple rather +than a zero. Each is commented at its site with the issue that tracks it. + +A section with no dictionary form is left out of `section_data` rather than +half-built, and asking for it by key says so. + +Paths ending in `.xz` are decompressed, matching `endf.fileutils.open_text`, so +a path that works in one reader works in the other. + +Build it with: + +```sh +maturin develop -m crates/endf-py/Cargo.toml +``` + +`tests/test_rust_bindings.py` then runs; it compares the extension against the +pure-Python reader on the same fixtures rather than against values written down +by hand, and skips itself when the module is not built. + +## State + +| | | +|---|---| +| Records | TEXT, CONT, HEAD, LIST, TAB1, TAB2, INTG | +| Functions | `Tabulated1D` (all five interpolation laws, and integrals), `Tabulated2D`, `Polynomial` | +| Materials | Section splitting for every MF/MT, multi-material files | +| Files | MF3 | + +Every other MF splits correctly and keeps its text as +`Section::Unparsed`, so the Python reader can still handle it. That is what +makes the port incremental: the two readers run side by side, file by file, +rather than the Rust one having to be finished before it is useful. + +## Porting a file + +1. Add `crates/endf/src/mf/mfN.rs` with a struct and + `parse_mfN(&mut Reader) -> Result`. +2. Add a variant to `Section` and an arm to `parse_section` in `material.rs`. +3. Add a dumper to `DUMPERS` in `tools/dump_golden.py`. +4. `python tools/dump_golden.py && cargo test`. + +Step 3 is the point. The Rust reader is not being written against the format +manual alone — it is held to what the Python reader already produces, value for +value. See `crates/endf/tests/golden/README.md`. + +## Building + +```sh +cargo test # parser and parity tests +cargo clippy --all-targets +maturin develop -m crates/endf-py/Cargo.toml # the extension module +``` diff --git a/crates/endf-py/Cargo.toml b/crates/endf-py/Cargo.toml new file mode 100644 index 0000000..97adb25 --- /dev/null +++ b/crates/endf-py/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "endf-py" +description = "Python bindings for the endf crate" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true + +[lib] +# Must match the module name `#[pymodule]` declares and what Python imports. +name = "_endf" +crate-type = ["cdylib", "rlib"] + +[dependencies] +endf = { path = "../endf" } +# The Python package reads xz-compressed evaluations through +# `endf.fileutils.open_text`, so the binding does too — otherwise a path that +# works in one reader fails in the other. Pure Rust, and it stays out of the +# `endf` crate, which has no dependencies. +lzma-rs = "0.3" +pyo3 = { version = "0.23", features = ["extension-module", "abi3-py310"] } diff --git a/crates/endf-py/_endf.pyi b/crates/endf-py/_endf.pyi new file mode 100644 index 0000000..9ec2975 --- /dev/null +++ b/crates/endf-py/_endf.pyi @@ -0,0 +1,386 @@ +# SPDX-License-Identifier: MIT +"""Type stubs for the `_endf` extension module. + +The module is compiled, so without this file an editor and a type checker see +nothing at all in it. That matters more here than for most extensions, because +`_endf` is meant to be substitutable for the pure-Python `endf` package — and +swapping one for the other should not cost you every type you had. + +The sum types deliberately come across as `kind`-tagged dictionaries rather +than as a class per variant, so they are typed as `dict[str, Any]`. The `kind` +key says which shape it is; `crates/README.md` lists them. + +Kept in step with the module by `tests/test_rust_stub.py`, which compares this +file against what the built module actually exports. +""" + +from typing import Any, Final + +# --------------------------------------------------------------------------- +# Records and functions +# --------------------------------------------------------------------------- + +def float_endf(s: str) -> float: + """Read an ENDF float, including the `e`-less form `-1.23481+10`.""" + +def int_endf(s: str) -> int: + """Read an ENDF integer, treating an all-blank field as zero.""" + +class Tabulated1D: + """A tabulated function of one variable, with interpolation regions.""" + + def __init__( + self, + x: list[float], + y: list[float], + breakpoints: list[int] | None = ..., + interpolation: list[int] | None = ..., + ) -> None: ... + @property + def x(self) -> list[float]: ... + @property + def y(self) -> list[float]: ... + @property + def breakpoints(self) -> list[int]: ... + @property + def interpolation(self) -> list[int]: ... + @property + def n_pairs(self) -> int: ... + @property + def n_regions(self) -> int: ... + def integral(self) -> list[float]: + """The running integral at each tabulated point.""" + + def __call__(self, x: float | list[float]) -> Any: + """Evaluate at a point, or at every point of a sequence.""" + + def __len__(self) -> int: ... + +class Tabulated2D: + """The interpolation across the outer variable of a two-dimensional table.""" + + @property + def breakpoints(self) -> list[int]: ... + @property + def interpolation(self) -> list[int]: ... + +# --------------------------------------------------------------------------- +# Materials +# --------------------------------------------------------------------------- + +class Material: + """One material of an ENDF-6 file, split into its (MF, MT) sections.""" + + def __init__(self, filename: str) -> None: + """Read the first material of a file. A `.xz` path is decompressed.""" + + @staticmethod + def from_string(text: str) -> Material: ... + @property + def MAT(self) -> int: ... + @property + def sections(self) -> list[tuple[int, int]]: ... + @property + def section_text(self) -> dict[tuple[int, int], str]: ... + @property + def section_data(self) -> dict[tuple[int, int], dict[str, Any]]: + """Every section as the dictionary the Python reader builds.""" + + def interpret(self) -> IncidentNeutron | IncidentPhoton: + """The high-level class this material's sublibrary calls for.""" + + def mf3(self, mt: int) -> CrossSection | None: ... + def __getitem__(self, key: tuple[int, int]) -> dict[str, Any]: ... + def __contains__(self, key: tuple[int, int]) -> bool: ... + +def get_materials(filename: str) -> list[Material]: + """Every material in an ENDF-6 file.""" + +class CrossSection: + """An MF=3 reaction cross section.""" + + @property + def ZA(self) -> int: ... + @property + def AWR(self) -> float: ... + @property + def QM(self) -> float: ... + @property + def QI(self) -> float: ... + @property + def LR(self) -> int: ... + @property + def sigma(self) -> Tabulated1D: ... + +# --------------------------------------------------------------------------- +# Reactions and nuclides +# --------------------------------------------------------------------------- + +class Product: + """One product of a reaction, with its yield and distribution.""" + + @property + def name(self) -> str: ... + @property + def emission_mode(self) -> str: ... + @property + def decay_rate(self) -> float: ... + @property + def yield_(self) -> dict[str, Any]: ... + @property + def applicability(self) -> list[Tabulated1D]: ... + @property + def distribution(self) -> list[dict[str, Any]]: + """The angle-energy distributions, each tagged with a `kind` key.""" + + def yield_at(self, energy: float) -> float: ... + +class Reaction: + """One reaction, gathered from every file that describes it.""" + + @property + def MT(self) -> int: ... + @property + def name(self) -> str: ... + @property + def q_reaction(self) -> float: ... + @property + def q_massdiff(self) -> float: ... + @property + def center_of_mass(self) -> bool: ... + @property + def redundant(self) -> bool: ... + @property + def xs(self) -> dict[str, Tabulated1D]: + """Cross sections by temperature, e.g. `"294K"`.""" + + @property + def products(self) -> list[Product]: ... + @property + def derived_products(self) -> list[Product]: ... + +class IncidentNeutron: + """Incident-neutron data for one nuclide.""" + + @staticmethod + def from_endf(material: Material) -> IncidentNeutron: ... + @staticmethod + def from_ace( + table: AceTable, metastable_scheme: str = "mcnp" + ) -> IncidentNeutron: ... + def add_temperature_from_ace( + self, table: AceTable, metastable_scheme: str = "mcnp" + ) -> None: ... + @property + def name(self) -> str: ... + @property + def atomic_number(self) -> int: ... + @property + def atomic_symbol(self) -> str: ... + @property + def mass_number(self) -> int: ... + @property + def metastable(self) -> int: ... + @property + def atomic_weight_ratio(self) -> float | None: ... + @property + def reactions(self) -> dict[int, Reaction]: ... + @property + def energy(self) -> dict[str, list[float]]: + """Unionised energy grids by temperature. Empty for ENDF data, which + gives each cross section its own grid.""" + + @property + def temperatures(self) -> list[str]: ... + @property + def kTs(self) -> list[float]: ... + @property + def urr(self) -> dict[str, dict[str, Any]]: + """Unresolved resonance probability tables by temperature.""" + + def reaction_components(self, mt: int) -> list[int]: ... + def removal_xs( + self, temperature: str = "0K", mu_cutoff: float = 0.0 + ) -> Tabulated1D: ... + def __getitem__(self, mt: int) -> Reaction: ... + def __contains__(self, mt: int) -> bool: ... + +class IncidentPhoton: + """Photoatomic data for one element.""" + + @staticmethod + def from_endf( + photoatomic: Material, relaxation: Material | None = ... + ) -> IncidentPhoton: ... + @staticmethod + def from_ace(table: AceTable) -> IncidentPhoton: ... + @property + def name(self) -> str: ... + @property + def atomic_number(self) -> int: ... + @property + def reactions(self) -> dict[int, dict[str, Any]]: ... + @property + def atomic_relaxation(self) -> dict[str, Any] | None: ... + def reaction_components(self, mt: int) -> list[int]: ... + +def reaction_name(mt: int) -> str | None: + """The name of a reaction, e.g. `"(n,2n)"` for MT=16.""" + +def reaction_mt(name: str) -> int | None: + """The MT of a named reaction, by its own name or an alias.""" + +def photon_reaction_name(mt: int) -> str | None: ... +def photon_reaction_mt(name: str) -> int | None: ... + +# --------------------------------------------------------------------------- +# Decay, yields and production +# --------------------------------------------------------------------------- + +class Decay: + """Radioactive decay data for one nuclide.""" + + @staticmethod + def from_endf(material: Material) -> Decay: ... + @property + def nuclide(self) -> dict[str, Any]: ... + @property + def half_life(self) -> tuple[float, float] | None: ... + @property + def decay_constant(self) -> tuple[float, float] | None: ... + @property + def decay_energy(self) -> tuple[float, float]: ... + @property + def average_energies(self) -> dict[str, tuple[float, float]]: ... + @property + def modes(self) -> list[dict[str, Any]]: ... + @property + def sources(self) -> dict[str, dict[str, Any]]: + """Emission spectra by radiation type, each a `kind`-tagged dict.""" + +class FissionProductYields: + """Independent and cumulative fission product yields.""" + + def __init__(self, filename: str) -> None: ... + @staticmethod + def from_material(material: Material) -> FissionProductYields: ... + @property + def nuclide(self) -> dict[str, Any]: ... + @property + def energies(self) -> list[float] | None: ... + @property + def independent(self) -> list[dict[str, tuple[float, float]]]: ... + @property + def cumulative(self) -> list[dict[str, tuple[float, float]]]: ... + +class RadionuclideProduction: + """Production data for a single final state of one reaction.""" + + @property + def ZAP(self) -> int: ... + @property + def LFS(self) -> int: ... + @property + def QM(self) -> float: ... + @property + def QI(self) -> float: ... + @property + def ELFS(self) -> float | None: ... + @property + def yields(self) -> Tabulated1D | None: ... + @property + def cross_section(self) -> Tabulated1D | None: ... + @property + def excitation_energy(self) -> float: ... + +def radionuclide_production( + material: Material, +) -> dict[int, list[RadionuclideProduction]]: + """A material's MF=8/9/10 production data, keyed by MT.""" + +def isomer_table(decay_files: list[str]) -> dict[tuple[int, int], dict[int, dict[str, Any]]]: + """Isomeric states by (Z, A), then by isomeric-state ordinal.""" + +def level_to_isomeric_state( + Z: int, + A: int, + lfs: int, + excitation_energy: float | None, + table: dict[tuple[int, int], dict[int, dict[str, Any]]], + *, + tol_eV: float = 3000.0, +) -> int: + """Map an MF=8 production level to an isomeric-state ordinal (LISO).""" + +class Chain: + """A depletion chain: decay, fission yields and transmutation joined.""" + + @staticmethod + def from_endf( + decay: list[Material], + fpy: list[Material], + neutron: list[Material], + reactions: list[str] | None = ..., + ) -> Chain: ... + @property + def nuclides(self) -> list[dict[str, Any]]: ... + def reduce(self, initial: list[str], level: int | None = ...) -> Chain: ... + def validate(self, tolerance: float = 1e-4) -> bool: ... + +def decay_modes(rtyp: float) -> list[str]: + """The decay modes an ENDF RTYP names, in order.""" + +def normalise_branch_ratios(ratios: list[float]) -> list[float]: ... + +# --------------------------------------------------------------------------- +# ACE +# --------------------------------------------------------------------------- + +class AceTable: + """One ACE Type 1 table.""" + + @property + def name(self) -> str: ... + @property + def zaid(self) -> int: ... + @property + def data_type(self) -> str: ... + @property + def atomic_weight_ratio(self) -> float: ... + @property + def temperature(self) -> float: ... + @property + def kT(self) -> float: ... + @property + def nxs(self) -> list[int]: ... + @property + def jxs(self) -> list[int]: ... + @property + def xss(self) -> list[float]: + """The data array, padded at index 0 so the format's 1-based + offsets in `nxs` and `jxs` index it directly.""" + +def get_tables(filename: str) -> list[AceTable]: + """Every table in an ACE file. A `.xz` path is decompressed.""" + +def ace_tables_from_string(text: str) -> list[AceTable]: ... + +# --------------------------------------------------------------------------- +# Names, constants and conversions +# --------------------------------------------------------------------------- + +def gnds_name(z: int, a: int, m: int = 0) -> str: + """A nuclide's GNDS name, e.g. `gnds_name(95, 242, 1)` is `"Am242_m1"`.""" + +def zam(name: str) -> tuple[int, int, int]: + """The (Z, A, metastable state) a GNDS name denotes.""" + +def temperature_str(t: float) -> str: + """A temperature in kelvin as the string ACE and HDF5 libraries key on.""" + +ATOMIC_SYMBOL: Final[dict[int, str]] +SUM_RULES: Final[dict[int, list[int]]] +INTERPOLATION_SCHEME: Final[dict[int, str]] +FISSION_MTS: Final[list[int]] +EV_PER_MEV: Final[float] +K_BOLTZMANN: Final[float] diff --git a/crates/endf-py/pyproject.toml b/crates/endf-py/pyproject.toml new file mode 100644 index 0000000..3d7ca88 --- /dev/null +++ b/crates/endf-py/pyproject.toml @@ -0,0 +1,23 @@ +# Present so that `maturin build -m crates/endf-py/Cargo.toml` names the wheel +# after this crate. Without it maturin falls back to the pyproject.toml in the +# working directory, which for a build run from the repository root is the pure +# Python package's — and the wheel comes out called `endf`, shadowing it. +[build-system] +requires = ["maturin>=1.5,<2.0"] +build-backend = "maturin" + +[project] +name = "endf-py" +description = "Python bindings for the endf crate" +requires-python = ">=3.10" +license = { text = "MIT" } +classifiers = [ + "Programming Language :: Rust", + "Programming Language :: Python :: Implementation :: CPython", +] +dynamic = ["version"] + +[tool.maturin] +# The extension module is imported as `_endf`, alongside the `endf` package +# rather than inside it, so either reader can be used without the other. +module-name = "_endf" diff --git a/crates/endf-py/src/lib.rs b/crates/endf-py/src/lib.rs new file mode 100644 index 0000000..a7081ee --- /dev/null +++ b/crates/endf-py/src/lib.rs @@ -0,0 +1,3061 @@ +//! Python bindings for the `endf` crate. +//! +//! Deliberately thin: every type here forwards to the Rust one and converts at +//! the boundary. Interpretation belongs in the Rust crate so that consumers +//! which never load Python get the same behaviour. +//! +//! The concrete types — a tabulated function, a reaction, a nuclide — are +//! wrapped as classes. The sum types — an angle-energy distribution, an +//! outgoing energy law, a univariate density — come across as dicts tagged +//! with a `kind` key. That is the shape a consumer wants anyway: `kind` is +//! exactly the discriminant an Arrow union column needs, and it saves a +//! wrapper class per variant for no gain in what can be expressed. +//! +//! This is not a drop-in for `endf.Material.section_data`, which returns the +//! Python reader's own dictionaries keyed by ENDF field name. What is exposed +//! here is the typed layer above that. + +use std::collections::BTreeMap; + +use endf::angle_energy::AngleEnergy; +use endf::mf::mf4::{AngleAtEnergy, AngleDistribution}; +use endf::mf::mf5::EnergyDistribution; +use endf::univariate::Univariate; +use endf::Section; +use pyo3::exceptions::PyValueError; +use pyo3::prelude::*; +use pyo3::types::{PyDict, PyTuple}; + +fn to_py_err(e: endf::Error) -> PyErr { + PyValueError::new_err(e.to_string()) +} + +/// Read a file, decompressing it when the name says it is compressed. +/// +/// The Python package reads `.xz` through `endf.fileutils.open_text`; a path +/// that works there has to work here. +fn read_text(filename: &str) -> PyResult { + let raw = std::fs::read(filename) + .map_err(|e| PyValueError::new_err(format!("reading {filename}: {e}")))?; + if !filename.ends_with(".xz") { + return String::from_utf8(raw) + .map_err(|e| PyValueError::new_err(format!("{filename} is not UTF-8: {e}"))); + } + let mut out = Vec::new(); + lzma_rs::xz_decompress(&mut raw.as_slice(), &mut out) + .map_err(|e| PyValueError::new_err(format!("decompressing {filename}: {e}")))?; + String::from_utf8(out) + .map_err(|e| PyValueError::new_err(format!("{filename} is not UTF-8: {e}"))) +} + +/// Convert a string from an ENDF floating point field to a float. +#[pyfunction] +#[pyo3(name = "float_endf")] +fn py_float_endf(s: &str) -> f64 { + endf::float_endf(s) +} + +/// Convert a string from an ENDF integer field to an int. +#[pyfunction] +#[pyo3(name = "int_endf")] +fn py_int_endf(s: &str) -> i64 { + endf::int_endf(s) +} + +/// A one-dimensional tabulated function (the format's TAB1 type). +#[pyclass(name = "Tabulated1D", module = "endf._endf")] +#[derive(Clone)] +struct PyTabulated1D { + inner: endf::Tabulated1D, +} + +#[pymethods] +impl PyTabulated1D { + #[new] + #[pyo3(signature = (x, y, breakpoints=None, interpolation=None))] + fn new( + x: Vec, + y: Vec, + breakpoints: Option>, + interpolation: Option>, + ) -> Self { + let inner = match (breakpoints, interpolation) { + (Some(b), Some(i)) => endf::Tabulated1D::with_regions(x, y, b, i), + _ => endf::Tabulated1D::new(x, y), + }; + PyTabulated1D { inner } + } + + #[getter] + fn x(&self) -> Vec { + self.inner.x.clone() + } + + #[getter] + fn y(&self) -> Vec { + self.inner.y.clone() + } + + #[getter] + fn breakpoints(&self) -> Vec { + self.inner.breakpoints.clone() + } + + #[getter] + fn interpolation(&self) -> Vec { + self.inner.interpolation.clone() + } + + #[getter] + fn n_pairs(&self) -> usize { + self.inner.n_pairs() + } + + #[getter] + fn n_regions(&self) -> usize { + self.inner.n_regions() + } + + /// Evaluate at a point, or elementwise over a sequence. + fn __call__<'py>(&self, py: Python<'py>, x: &Bound<'py, PyAny>) -> PyResult> { + // A sequence first: a float extracts from a 1-element sequence in some + // cases, but a sequence never extracts as a float. + if let Ok(xs) = x.extract::>() { + let ys: Vec = xs.iter().map(|&v| self.inner.eval(v)).collect(); + return Ok(ys.into_pyobject(py)?.into_any()); + } + let v: f64 = x.extract()?; + Ok(self.inner.eval(v).into_pyobject(py)?.into_any()) + } + + /// Partial integrals from the start of the range to each tabulated point. + fn integral(&self) -> Vec { + self.inner.integral() + } + + fn __len__(&self) -> usize { + self.inner.n_pairs() + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.n_pairs(), + self.inner.n_regions() + ) + } +} + +/// Interpolation metadata for a two-dimensional function (the format's TAB2). +#[pyclass(name = "Tabulated2D", module = "endf._endf")] +#[derive(Clone)] +struct PyTabulated2D { + inner: endf::Tabulated2D, +} + +#[pymethods] +impl PyTabulated2D { + #[getter] + fn breakpoints(&self) -> Vec { + self.inner.breakpoints.clone() + } + + #[getter] + fn interpolation(&self) -> Vec { + self.inner.interpolation.clone() + } + + fn __repr__(&self) -> String { + format!("", self.inner.breakpoints.len()) + } +} + +/// An MF=3 reaction cross section. +#[pyclass(name = "CrossSection", module = "endf._endf")] +#[derive(Clone)] +struct PyCrossSection { + inner: endf::mf::mf3::Mf3, +} + +#[pymethods] +impl PyCrossSection { + #[getter] + #[allow(non_snake_case)] + fn ZA(&self) -> i64 { + self.inner.za + } + + #[getter] + #[allow(non_snake_case)] + fn AWR(&self) -> f64 { + self.inner.awr + } + + #[getter] + #[allow(non_snake_case)] + fn QM(&self) -> f64 { + self.inner.qm + } + + #[getter] + #[allow(non_snake_case)] + fn QI(&self) -> f64 { + self.inner.qi + } + + #[getter] + #[allow(non_snake_case)] + fn LR(&self) -> i64 { + self.inner.lr + } + + #[getter] + fn sigma(&self) -> PyTabulated1D { + PyTabulated1D { + inner: self.inner.sigma.clone(), + } + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.za, + self.inner.sigma.n_pairs() + ) + } +} + +/// An ENDF material with multiple files/sections. +#[pyclass(name = "Material", module = "endf._endf")] +#[derive(Clone)] +struct PyMaterial { + inner: endf::Material, +} + +#[pymethods] +impl PyMaterial { + #[new] + fn new(filename: &str) -> PyResult { + let inner = endf::Material::from_str(&read_text(filename)?).map_err(to_py_err)?; + Ok(PyMaterial { inner }) + } + + /// Parse a material from the text of an ENDF file. + #[staticmethod] + fn from_string(text: &str) -> PyResult { + let inner = endf::Material::from_str(text).map_err(to_py_err)?; + Ok(PyMaterial { inner }) + } + + #[getter] + #[allow(non_snake_case)] + fn MAT(&self) -> i32 { + self.inner.mat + } + + /// The (MF, MT) sections present. + #[getter] + fn sections(&self) -> Vec<(i32, i32)> { + self.inner.sections() + } + + /// Raw text of each section, keyed by (MF, MT). + #[getter] + fn section_text(&self) -> BTreeMap<(i32, i32), String> { + self.inner.section_text.clone() + } + + /// Every section as the Python reader's dictionaries, keyed by (MF, MT). + /// + /// Sections with no dictionary form here are left out rather than + /// half-built; they are reached through the object layer, which covers + /// every file. + #[getter] + fn section_data<'py>(&self, py: Python<'py>) -> PyResult> { + let out = PyDict::new(py); + for (&key, section) in &self.inner.section_data { + if let Some(d) = section_dict(py, section)? { + out.set_item(key, d)?; + } + } + Ok(out) + } + + /// One section's dictionary, as `material[3, 1]` gives it. + fn __getitem__<'py>(&self, py: Python<'py>, key: (i32, i32)) -> PyResult> { + let (mf, mt) = key; + let section = self + .inner + .section_data + .get(&key) + .ok_or_else(|| PyValueError::new_err(format!("no section MF={mf} MT={mt}")))?; + section_dict(py, section)?.ok_or_else(|| { + PyValueError::new_err(format!( + "MF={mf} MT={mt} has no dictionary form here; the typed \ + accessors and the object layer reach it instead" + )) + }) + } + + /// The high-level interface for this material's sublibrary. + /// + /// An `IncidentNeutron` for NSUB=10 or an `IncidentPhoton` for NSUB=3. + /// Anything else raises, as it does upstream. + fn interpret(&self, py: Python<'_>) -> PyResult { + match self.inner.interpret().map_err(to_py_err)? { + endf::Interpretation::IncidentNeutron(n) => Ok(PyIncidentNeutron { inner: *n } + .into_pyobject(py)? + .into_any() + .unbind()), + endf::Interpretation::IncidentPhoton(p) => Ok(PyIncidentPhoton { inner: *p } + .into_pyobject(py)? + .into_any() + .unbind()), + } + } + + /// The MF=3 cross section for a reaction, or None. + fn mf3(&self, mt: i32) -> Option { + self.inner + .mf3(mt) + .map(|s| PyCrossSection { inner: s.clone() }) + } + + fn __contains__(&self, key: (i32, i32)) -> bool { + self.inner.contains(key.0, key.1) + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.mat, + self.inner.section_text.len() + ) + } +} + +// --------------------------------------------------------------------------- +// section_data +// +// The Python reader hands back a dictionary per section, keyed by the field +// names the format uses. This rebuilds those dictionaries from the typed +// sections, so code written against `Material.section_data` keeps working. +// +// Not every file has a projection yet — `section_dict` says which by name +// rather than returning something incomplete. The typed accessors and the +// object layer above them cover every file regardless. +// --------------------------------------------------------------------------- + +fn tab1_class(t: &endf::Tabulated1D) -> PyTabulated1D { + PyTabulated1D { inner: t.clone() } +} + +fn tab2_class(t: &endf::Tabulated2D) -> PyTabulated2D { + PyTabulated2D { inner: t.clone() } +} + +fn nu_into(d: &Bound<'_, PyDict>, nu: &endf::mf::mf1::Nu) -> PyResult<()> { + match nu { + endf::mf::mf1::Nu::Polynomial(c) => d.set_item("C", c.clone())?, + endf::mf::mf1::Nu::Tabulated(t) => d.set_item("nu", tab1_class(t))?, + endf::mf::mf1::Nu::Absent => {} + } + Ok(()) +} + +fn mf1_mt451_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf1::Mf1Mt451, +) -> PyResult> { + let d = PyDict::new(py); + for (key, value) in [ + ("ZA", s.za), + ("LRP", s.lrp), + ("LFI", s.lfi), + ("NLIB", s.nlib), + ("NMOD", s.nmod), + ("LIS", s.lis), + ("LISO", s.liso), + ("NFOR", s.nfor), + ("LREL", s.lrel), + ("NSUB", s.nsub), + ("NVER", s.nver), + ("LDRV", s.ldrv), + ("NWD", s.nwd), + ("NXC", s.nxc), + ] { + d.set_item(key, value)?; + } + for (key, value) in [ + ("AWR", s.awr), + ("ELIS", s.elis), + ("STA", s.sta), + ("AWI", s.awi), + ("EMAX", s.emax), + ("TEMP", s.temp), + ] { + d.set_item(key, value)?; + } + // The descriptive text is present only when the evaluation wrote it. + if let Some(zsymam) = &s.zsymam { + d.set_item("ZSYMAM", zsymam)?; + d.set_item("ALAB", &s.alab)?; + d.set_item("EDATE", &s.edate)?; + d.set_item("AUTH", &s.auth)?; + d.set_item("REF", &s.reference)?; + d.set_item("DDATE", &s.ddate)?; + d.set_item("RDATE", &s.rdate)?; + d.set_item("ENDATE", &s.endate)?; + d.set_item("HSUB", s.hsub.clone())?; + d.set_item("description", s.description.clone())?; + } + d.set_item("section_list", s.section_list.clone())?; + Ok(d) +} + +fn mf3_dict<'py>(py: Python<'py>, s: &endf::mf::mf3::Mf3) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("QM", s.qm)?; + d.set_item("QI", s.qi)?; + d.set_item("LR", s.lr)?; + d.set_item("sigma", tab1_class(&s.sigma))?; + Ok(d) +} + +fn mf4_dict<'py>(py: Python<'py>, s: &endf::mf::mf4::Mf4) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LTT", s.ltt)?; + d.set_item("LI", s.li)?; + d.set_item("LCT", s.lct)?; + if let Some(l) = &s.legendre { + let sub = PyDict::new(py); + sub.set_item("E_int", tab2_class(&l.e_int))?; + sub.set_item("T", l.t)?; + sub.set_item("LT", l.lt)?; + sub.set_item("E", l.energy.clone())?; + sub.set_item("a_l", l.a_l.clone())?; + d.set_item("legendre", sub)?; + } + if let Some(t) = &s.tabulated { + let sub = PyDict::new(py); + sub.set_item("E_int", tab2_class(&t.e_int))?; + sub.set_item("T", t.t)?; + sub.set_item("LT", t.lt)?; + sub.set_item("E", t.energy.clone())?; + sub.set_item("mu", t.mu.iter().map(tab1_class).collect::>())?; + d.set_item("tabulated", sub)?; + } + Ok(d) +} + +fn mf5_dict<'py>(py: Python<'py>, s: &endf::mf::mf5::Mf5) -> PyResult> { + use endf::mf::mf5::EnergyDistribution as E; + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NK", s.nk)?; + let mut subsections = Vec::with_capacity(s.subsections.len()); + for sub in &s.subsections { + let entry = PyDict::new(py); + entry.set_item("LF", sub.lf)?; + entry.set_item("p", tab1_class(&sub.p))?; + let dist = PyDict::new(py); + match &sub.distribution { + E::ArbitraryTabulated { e_int, energy, g } => { + dist.set_item("E_int", tab2_class(e_int))?; + dist.set_item("E", energy.clone())?; + dist.set_item("g", g.iter().map(tab1_class).collect::>())?; + } + E::GeneralEvaporation { u, theta, g } => { + dist.set_item("U", *u)?; + dist.set_item("theta", tab1_class(theta))?; + dist.set_item("g", tab1_class(g))?; + } + E::MaxwellEnergy { u, theta } | E::Evaporation { u, theta } => { + dist.set_item("U", *u)?; + dist.set_item("theta", tab1_class(theta))?; + } + E::WattEnergy { u, a, b } => { + dist.set_item("U", *u)?; + dist.set_item("a", tab1_class(a))?; + dist.set_item("b", tab1_class(b))?; + } + E::MadlandNix { efl, efh, t_m } => { + dist.set_item("EFL", *efl)?; + dist.set_item("EFH", *efh)?; + dist.set_item("T_M", tab1_class(t_m))?; + } + // The three ACE-only laws have no ENDF section and so never reach + // here; `dist` stays empty rather than inventing keys. + _ => {} + } + entry.set_item("distribution", dist)?; + subsections.push(entry); + } + d.set_item("subsections", subsections)?; + Ok(d) +} + +/// LAW=1, which MF=6 and MF=26 share. +fn continuum_energy_angle_dict<'py>( + py: Python<'py>, + c: &endf::mf::mf6::ContinuumEnergyAngle, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("LANG", c.lang)?; + d.set_item("LEP", c.lep)?; + d.set_item("NR", c.nr)?; + d.set_item("NE", c.ne)?; + d.set_item("E_int", tab2_class(&c.e_int))?; + d.set_item("E", c.energy.clone())?; + let mut subs = Vec::with_capacity(c.distribution.len()); + for sub in &c.distribution { + let e = PyDict::new(py); + e.set_item("ND", sub.nd)?; + e.set_item("NA", sub.na)?; + e.set_item("NW", sub.nw)?; + e.set_item("NEP", sub.nep)?; + e.set_item("E'", sub.e_out.clone())?; + // Python reshapes the list to (NEP, NA + 2) and slices the first + // column off; `b` is what is left, so it stays a list of rows here. + e.set_item("b", sub.b.clone())?; + subs.push(e); + } + d.set_item("distribution", subs)?; + Ok(d) +} + +/// LAW=2, which MF=6 and MF=26 share. +fn discrete_two_body_dict<'py>( + py: Python<'py>, + t: &endf::mf::mf6::DiscreteTwoBody, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("NR", t.nr)?; + d.set_item("NE", t.ne)?; + d.set_item("E_int", tab2_class(&t.e_int))?; + d.set_item("E", t.energy.clone())?; + let mut subs = Vec::with_capacity(t.distribution.len()); + for sub in &t.distribution { + let e = PyDict::new(py); + e.set_item("LANG", sub.lang)?; + e.set_item("NW", sub.nw)?; + e.set_item("NL", sub.nl)?; + e.set_item("A_l", sub.a_l.clone())?; + subs.push(e); + } + d.set_item("distribution", subs)?; + Ok(d) +} + +fn mf6_dict<'py>(py: Python<'py>, s: &endf::mf::mf6::Mf6) -> PyResult> { + use endf::mf::mf6::Distribution as D; + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("JP", s.jp)?; + d.set_item("LCT", s.lct)?; + d.set_item("NK", s.nk)?; + let mut products = Vec::with_capacity(s.products.len()); + for p in &s.products { + let e = PyDict::new(py); + e.set_item("ZAP", p.zap)?; + e.set_item("AWP", p.awp)?; + e.set_item("LIP", p.lip)?; + e.set_item("LAW", p.law)?; + e.set_item("y_i", tab1_class(&p.yield_))?; + // LAW<0, 0, 3 and 4 carry no data, and Python leaves the key out + // entirely rather than storing an empty distribution. + match &p.distribution { + D::None => {} + D::ContinuumEnergyAngle(c) => { + e.set_item("distribution", continuum_energy_angle_dict(py, c)?)? + } + D::DiscreteTwoBody(t) => e.set_item("distribution", discrete_two_body_dict(py, t)?)?, + D::ChargedParticleElastic(c) => { + let sub = PyDict::new(py); + sub.set_item("SPI", c.spi)?; + sub.set_item("LIDP", c.lidp)?; + sub.set_item("NE", c.ne)?; + sub.set_item("E_int", tab2_class(&c.e_int))?; + let mut entries = Vec::with_capacity(c.distribution.len()); + for x in &c.distribution { + let q = PyDict::new(py); + q.set_item("E", x.energy)?; + q.set_item("LTP", x.ltp)?; + q.set_item("NW", x.nw)?; + q.set_item("NL", x.nl)?; + q.set_item("A", x.a.clone())?; + entries.push(q); + } + sub.set_item("distribution", entries)?; + e.set_item("distribution", sub)? + } + D::NBodyPhaseSpace { apsx, npsx } => { + let sub = PyDict::new(py); + sub.set_item("APSX", *apsx)?; + sub.set_item("NPSX", *npsx)?; + e.set_item("distribution", sub)? + } + D::LaboratoryAngleEnergy(l) => { + let sub = PyDict::new(py); + sub.set_item("NE", l.ne)?; + sub.set_item("E_int", tab2_class(&l.e_int))?; + let mut entries = Vec::with_capacity(l.distribution.len()); + for x in &l.distribution { + let q = PyDict::new(py); + q.set_item("E", x.energy)?; + q.set_item("NRM", x.nrm)?; + q.set_item("NMU", x.nmu)?; + q.set_item("mu_int", tab2_class(&x.mu_int))?; + let mut mus = Vec::with_capacity(x.mu.len()); + for m in &x.mu { + let r = PyDict::new(py); + r.set_item("mu", m.mu)?; + r.set_item("f", tab1_class(&m.f))?; + mus.push(r); + } + q.set_item("mu", mus)?; + entries.push(q); + } + sub.set_item("distribution", entries)?; + e.set_item("distribution", sub)? + } + } + products.push(e); + } + d.set_item("products", products)?; + Ok(d) +} + +fn mf9_mf10_dict<'py>(py: Python<'py>, s: &endf::mf::mf8::Mf9Mf10) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LIS", s.lis)?; + d.set_item("NS", s.ns)?; + let key = if s.mf == 9 { "Y" } else { "sigma" }; + let levels: PyResult> = s + .levels + .iter() + .map(|level| { + let e = PyDict::new(py); + e.set_item("QM", level.qm)?; + e.set_item("QI", level.qi)?; + e.set_item("IZAP", level.izap)?; + e.set_item("LFS", level.lfs)?; + e.set_item(key, tab1_class(&level.func))?; + Ok(e) + }) + .collect(); + d.set_item("levels", levels?)?; + Ok(d) +} + +fn mf1_mt452_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf1::Mf1Mt452, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LNU", s.lnu)?; + nu_into(&d, &s.nu)?; + Ok(d) +} + +fn mf1_mt455_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf1::Mf1Mt455, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LDG", s.ldg)?; + d.set_item("LNU", s.lnu)?; + if !s.lambda.is_empty() { + d.set_item("lambda", s.lambda.clone())?; + } + if let Some(e_int) = &s.e_int { + d.set_item("E_int", tab2_class(e_int))?; + } + if !s.constants.is_empty() { + let constants: PyResult> = s + .constants + .iter() + .map(|c| { + let e = PyDict::new(py); + e.set_item("E", c.energy)?; + e.set_item("lambda", c.lambda.clone())?; + e.set_item("alpha", c.alpha.clone())?; + Ok(e) + }) + .collect(); + d.set_item("constants", constants?)?; + } + nu_into(&d, &s.nu)?; + Ok(d) +} + +fn mf12_dict<'py>(py: Python<'py>, s: &endf::mf::photon::Mf12) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LO", s.lo)?; + d.set_item("NK", s.nk)?; + if let Some(y) = &s.total_yield { + d.set_item("Y", tab1_class(y))?; + } + if !s.multiplicities.is_empty() { + let ks: PyResult> = s + .multiplicities + .iter() + .map(|k| { + let e = PyDict::new(py); + e.set_item("Eg", k.eg)?; + e.set_item("ES", k.es)?; + e.set_item("LP", k.lp)?; + e.set_item("LF", k.lf)?; + e.set_item("y", tab1_class(&k.y))?; + Ok(e) + }) + .collect(); + d.set_item("multiplicities", ks?)?; + } + if let Some(lg) = s.lg { + d.set_item("LG", lg)?; + d.set_item("ES_NS", s.es_ns)?; + d.set_item("LP", s.lp)?; + d.set_item("NT", s.nt)?; + let ts: PyResult> = s + .transitions + .iter() + .map(|t| { + let e = PyDict::new(py); + e.set_item("ES", t.es)?; + e.set_item("TP", t.tp)?; + if let Some(gp) = t.gp { + e.set_item("GP", gp)?; + } + Ok(e) + }) + .collect(); + d.set_item("transitions", ts?)?; + } + Ok(d) +} + +fn mf13_dict<'py>(py: Python<'py>, s: &endf::mf::photon::Mf13) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NK", s.nk)?; + if let Some(t) = &s.sigma_total { + d.set_item("sigma_total", tab1_class(t))?; + } + let photons: PyResult> = s + .photons + .iter() + .map(|p| { + let e = PyDict::new(py); + e.set_item("EG", p.eg)?; + e.set_item("ES", p.es)?; + e.set_item("LP", p.lp)?; + e.set_item("LF", p.lf)?; + e.set_item("sigma", tab1_class(&p.sigma))?; + Ok(e) + }) + .collect(); + d.set_item("photons", photons?)?; + Ok(d) +} + +fn mf14_dict<'py>(py: Python<'py>, s: &endf::mf::photon::Mf14) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LI", s.li)?; + d.set_item("NK", s.nk)?; + if let (Some(ltt), Some(ni)) = (s.ltt, s.ni) { + d.set_item("LTT", ltt)?; + d.set_item("NI", ni)?; + } + if !s.subsections.is_empty() { + let subs: PyResult> = s + .subsections + .iter() + .map(|sub| { + let e = PyDict::new(py); + e.set_item("EG", sub.eg)?; + e.set_item("ES", sub.es)?; + if let Some(e_int) = &sub.e_int { + e.set_item("E_int", tab2_class(e_int))?; + e.set_item("NE", sub.ne)?; + e.set_item("E", sub.energy.clone())?; + } + if !sub.nl.is_empty() { + e.set_item("NL", sub.nl.clone())?; + } + if !sub.a_lk.is_empty() { + e.set_item("a_lk", sub.a_lk.clone())?; + } + if !sub.p_k.is_empty() { + e.set_item("p_k", sub.p_k.iter().map(tab1_class).collect::>())?; + } + Ok(e) + }) + .collect(); + d.set_item("subsections", subs?)?; + } + Ok(d) +} + +fn mf15_dict<'py>(py: Python<'py>, s: &endf::mf::photon::Mf15) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NC", s.nc)?; + let subs: PyResult> = s + .subsections + .iter() + .map(|sub| { + let e = PyDict::new(py); + e.set_item("LF", sub.lf)?; + e.set_item("p", tab1_class(&sub.p))?; + e.set_item("E_int", tab2_class(&sub.e_int))?; + e.set_item("NE", sub.ne)?; + e.set_item("E", sub.energy.clone())?; + e.set_item("g", sub.g.iter().map(tab1_class).collect::>())?; + Ok(e) + }) + .collect(); + d.set_item("subsections", subs?)?; + Ok(d) +} + +fn mf23_dict<'py>(py: Python<'py>, s: &endf::mf::atomic::Mf23) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("EPE", s.epe)?; + d.set_item("EFL", s.efl)?; + d.set_item("sigma", tab1_class(&s.sigma))?; + Ok(d) +} + +/// LRU=2, whose three cases store different keys. +/// +/// Which case applies is decided by LFW and LRF rather than by what is in the +/// struct, so an empty list keeps the shape its case calls for. +fn unresolved_dict<'py>( + py: Python<'py>, + u: &endf::mf::mf2::Unresolved, + lfw: i64, + lrf: i64, +) -> PyResult> { + use endf::mf::mf2::UnresolvedParameters as P; + let d = PyDict::new(py); + if let Some(ape) = &u.ape { + d.set_item("APE", tab1_class(ape))?; + } + d.set_item("SPI", u.spi)?; + d.set_item("AP", u.ap)?; + d.set_item("LSSF", u.lssf)?; + // Case B reads NE and the energy grid the fission widths sit on; the other + // two cases have neither key. + if let Some(ne) = u.ne { + d.set_item("NE", ne)?; + } + d.set_item("NLS", u.nls)?; + if u.ne.is_some() { + d.set_item("ES", u.es.clone())?; + } + let case_a = lfw == 0 && lrf == 1; + let mut ranges = Vec::with_capacity(u.ranges.len()); + for r in &u.ranges { + let e = PyDict::new(py); + e.set_item("AWRI", r.awri)?; + e.set_item("L", r.l)?; + e.set_item("NJS", r.njs)?; + if case_a { + e.set_item("D", r.d.clone())?; + e.set_item("AJ", r.aj.clone())?; + e.set_item("AMUN", r.amun.clone())?; + e.set_item("GNO", r.gno.clone())?; + e.set_item("GG", r.gg.clone())?; + } else { + let mut params = Vec::with_capacity(r.parameters.len()); + for p in &r.parameters { + let q = PyDict::new(py); + match p { + P::CaseB { + muf, + d, + aj, + amun, + gn0, + gg, + gf, + } => { + q.set_item("MUF", *muf)?; + q.set_item("D", *d)?; + q.set_item("AJ", *aj)?; + q.set_item("AMUN", *amun)?; + q.set_item("GN0", *gn0)?; + q.set_item("GG", *gg)?; + q.set_item("GF", gf.clone())?; + } + P::CaseC { + aj, + interpolation, + ne, + amux, + amun, + amuf, + e: energy, + d: spacing, + gx, + gn0, + gg, + gf, + } => { + q.set_item("AJ", *aj)?; + q.set_item("INT", *interpolation)?; + q.set_item("NE", *ne)?; + q.set_item("AMUX", *amux)?; + q.set_item("AMUN", *amun)?; + q.set_item("AMUF", *amuf)?; + q.set_item("E", energy.clone())?; + q.set_item("D", spacing.clone())?; + q.set_item("GX", gx.clone())?; + q.set_item("GN0", gn0.clone())?; + q.set_item("GG", gg.clone())?; + q.set_item("GF", gf.clone())?; + } + } + params.push(q); + } + e.set_item("parameters", params)?; + } + ranges.push(e); + } + d.set_item("ranges", ranges)?; + Ok(d) +} + +/// LRF=7: the spin groups, with their optional background and phase-shift +/// extensions. +fn r_matrix_limited_dict<'py>( + py: Python<'py>, + r: &endf::mf::mf2::RMatrixLimited, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("IFG", r.ifg)?; + d.set_item("KRM", r.krm)?; + d.set_item("NJS", r.njs)?; + d.set_item("KRL", r.krl)?; + d.set_item("NPP", r.npp)?; + let pp = PyDict::new(py); + let pairs = &r.particle_pairs; + pp.set_item("MA", pairs.ma.clone())?; + pp.set_item("MB", pairs.mb.clone())?; + pp.set_item("ZA", pairs.za.clone())?; + pp.set_item("ZB", pairs.zb.clone())?; + pp.set_item("IA", pairs.ia.clone())?; + pp.set_item("IB", pairs.ib.clone())?; + pp.set_item("Q", pairs.q.clone())?; + pp.set_item("PNT", pairs.pnt.clone())?; + pp.set_item("SHF", pairs.shf.clone())?; + pp.set_item("MT", pairs.mt.clone())?; + pp.set_item("PA", pairs.pa.clone())?; + pp.set_item("PB", pairs.pb.clone())?; + d.set_item("particle_pairs", pp)?; + + let mut groups = Vec::with_capacity(r.spin_groups.len()); + for g in &r.spin_groups { + let e = PyDict::new(py); + e.set_item("AJ", g.aj)?; + e.set_item("PJ", g.pj)?; + e.set_item("KBK", g.kbk)?; + e.set_item("KPS", g.kps)?; + e.set_item("NCH", g.nch)?; + let ch = PyDict::new(py); + ch.set_item("PPI", g.channels.ppi.clone())?; + ch.set_item("L", g.channels.l.clone())?; + ch.set_item("SCH", g.channels.sch.clone())?; + ch.set_item("BND", g.channels.bnd.clone())?; + ch.set_item("APE", g.channels.ape.clone())?; + ch.set_item("APT", g.channels.apt.clone())?; + e.set_item("channels", ch)?; + e.set_item("NRS", g.nrs)?; + e.set_item("NX", g.nx)?; + e.set_item("ER", g.er.clone())?; + // Channel-major already, which is the transpose Python returns. + e.set_item("GAM", g.gam.clone())?; + // Each extension writes its keys only when the flag that guards it is + // set, so they are absent rather than None when it is not. + for (key, value) in [("LCH", g.lch), ("LBK", g.lbk), ("LPS", g.lps)] { + if let Some(v) = value { + e.set_item(key, v)?; + } + } + for (key, value) in [ + ("RBR", &g.rbr), + ("RBI", &g.rbi), + ("PSR", &g.psr), + ("PSI", &g.psi), + ] { + if let Some(t) = value { + e.set_item(key, tab1_class(t))?; + } + } + for (key, value) in [("ED", g.ed), ("EU", g.eu)] { + if let Some(v) = value { + e.set_item(key, v)?; + } + } + groups.push(e); + } + d.set_item("spin_groups", groups)?; + Ok(d) +} + +fn mf2_dict<'py>(py: Python<'py>, s: &endf::mf::mf2::Mf2) -> PyResult> { + use endf::mf::mf2::ResonanceParameters as R; + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NIS", s.nis)?; + let mut isotopes = Vec::with_capacity(s.isotopes.len()); + for iso in &s.isotopes { + let i = PyDict::new(py); + i.set_item("ZAI", iso.zai)?; + i.set_item("ABN", iso.abn)?; + i.set_item("LFW", iso.lfw)?; + i.set_item("NER", iso.ner)?; + let mut ranges = Vec::with_capacity(iso.ranges.len()); + for r in &iso.ranges { + // The formalism's keys go into the range dictionary itself, as + // `rrange.update(...)` puts them there upstream. + let e = PyDict::new(py); + e.set_item("EL", r.el)?; + e.set_item("EH", r.eh)?; + e.set_item("LRU", r.lru)?; + e.set_item("LRF", r.lrf)?; + e.set_item("NRO", r.nro)?; + e.set_item("NAPS", r.naps)?; + match &r.parameters { + R::ScatteringRadius { spi, ap, nls } => { + e.set_item("SPI", *spi)?; + e.set_item("AP", *ap)?; + e.set_item("NLS", *nls)?; + } + R::BreitWigner(b) => { + if let Some(ape) = &b.ape { + e.set_item("APE", tab1_class(ape))?; + } + e.set_item("SPI", b.spi)?; + e.set_item("AP", b.ap)?; + e.set_item("NLS", b.nls)?; + let mut sections = Vec::with_capacity(b.sections.len()); + for sec in &b.sections { + let q = PyDict::new(py); + q.set_item("AWRI", sec.awri)?; + q.set_item("QX", sec.qx)?; + q.set_item("L", sec.l)?; + q.set_item("LRX", sec.lrx)?; + q.set_item("NRS", sec.nrs)?; + q.set_item("ER", sec.er.clone())?; + q.set_item("AJ", sec.aj.clone())?; + q.set_item("GT", sec.gt.clone())?; + q.set_item("GN", sec.gn.clone())?; + q.set_item("GG", sec.gg.clone())?; + q.set_item("GF", sec.gf.clone())?; + sections.push(q); + } + e.set_item("sections", sections)?; + } + R::ReichMoore(m) => { + if let Some(ape) = &m.ape { + e.set_item("APE", tab1_class(ape))?; + } + e.set_item("SPI", m.spi)?; + e.set_item("AP", m.ap)?; + e.set_item("LAD", m.lad)?; + e.set_item("NLS", m.nls)?; + e.set_item("NLSC", m.nlsc)?; + let mut sections = Vec::with_capacity(m.sections.len()); + for sec in &m.sections { + let q = PyDict::new(py); + q.set_item("AWRI", sec.awri)?; + q.set_item("APL", sec.apl)?; + q.set_item("L", sec.l)?; + q.set_item("NRS", sec.nrs)?; + q.set_item("ER", sec.er.clone())?; + q.set_item("AJ", sec.aj.clone())?; + q.set_item("GN", sec.gn.clone())?; + q.set_item("GG", sec.gg.clone())?; + q.set_item("GFA", sec.gfa.clone())?; + q.set_item("GFB", sec.gfb.clone())?; + sections.push(q); + } + e.set_item("sections", sections)?; + } + R::RMatrixLimited(m) => { + e.update(r_matrix_limited_dict(py, m)?.as_mapping())?; + } + R::Unresolved(u) => { + e.update(unresolved_dict(py, u, iso.lfw, r.lrf)?.as_mapping())?; + } + // An unresolved range with LRF=1 is dispatched past without + // being read upstream, so the range keeps only its own keys. + // See issue #15. + R::Absent => {} + } + ranges.push(e); + } + i.set_item("ranges", ranges)?; + isotopes.push(i); + } + d.set_item("isotopes", isotopes)?; + Ok(d) +} + +fn mf8_mt454_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf8::Mf8Mt454, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LE", s.le)?; + let mut sets = Vec::with_capacity(s.yields.len()); + for (i, set) in s.yields.iter().enumerate() { + let e = PyDict::new(py); + e.set_item("E", set.energy)?; + e.set_item("NN", set.nn)?; + e.set_item("NFP", set.nfp)?; + // The format overloads one field: LE+1 at the first energy, the + // interpolation scheme after it, and the two get different keys. + e.set_item(if i == 0 { "LE" } else { "I" }, set.le_or_interpolation)?; + let mut products = Vec::with_capacity(set.products.len()); + for p in &set.products { + let q = PyDict::new(py); + q.set_item("ZAFP", p.zafp)?; + q.set_item("FPS", p.fps)?; + q.set_item("Y", p.y)?; + products.push(q); + } + e.set_item("products", products)?; + sets.push(e); + } + d.set_item("yields", sets)?; + Ok(d) +} + +fn mf8_mt457_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf8::Mf8Mt457, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LIS", s.lis)?; + d.set_item("LISO", s.liso)?; + d.set_item("NST", s.nst)?; + d.set_item("NSP", s.nsp)?; + d.set_item("SPI", s.spi)?; + d.set_item("PAR", s.par)?; + + // A stable nuclide stops after the spin and parity — no half-life, no + // decay modes, no spectra. + let half_life = match s.half_life { + Some(t) => t, + None => return Ok(d), + }; + d.set_item("T1/2", half_life)?; + d.set_item("NC", s.nc)?; + d.set_item("Ex", s.ex.clone())?; + d.set_item("NDK", s.ndk)?; + let mut modes = Vec::with_capacity(s.modes.len()); + for m in &s.modes { + let e = PyDict::new(py); + e.set_item("RTYP", m.rtyp)?; + e.set_item("RFS", m.rfs)?; + e.set_item("Q", m.q)?; + e.set_item("BR", m.br)?; + modes.push(e); + } + d.set_item("modes", modes)?; + + let mut spectra = Vec::with_capacity(s.spectra.len()); + for sp in &s.spectra { + let e = PyDict::new(py); + e.set_item("STYP", sp.styp)?; + e.set_item("LCON", sp.lcon)?; + e.set_item("LCOV", sp.lcov)?; + e.set_item("NER", sp.ner)?; + e.set_item("FD", sp.fd)?; + e.set_item("ER_AV", sp.er_av)?; + e.set_item("FC", sp.fc)?; + if sp.lcon != 1 { + let mut discrete = Vec::with_capacity(sp.discrete.len()); + for r in &sp.discrete { + let q = PyDict::new(py); + q.set_item("ER", r.er)?; + q.set_item("RTYP", r.rtyp)?; + q.set_item("TYPE", r.type_)?; + q.set_item("RI", r.ri)?; + // STYP decides which keys exist; a record too short to hold + // the pair still gets its key, with an empty tuple, because + // Python slices rather than indexes. See issue #19. + if sp.styp == 0.0 || sp.styp == 2.0 { + q.set_item("RIS", opt_pair_py(py, r.ris))?; + } + if sp.styp == 0.0 { + q.set_item("RICC", opt_pair_py(py, r.ricc))?; + q.set_item("RICK", opt_pair_py(py, r.rick))?; + q.set_item("RICL", opt_pair_py(py, r.ricl))?; + } + discrete.push(q); + } + e.set_item("discrete", discrete)?; + } + if let Some(c) = &sp.continuous { + let q = PyDict::new(py); + q.set_item("RTYP", c.rtyp)?; + q.set_item("RP", tab1_class(&c.rp))?; + e.set_item("continuous", q)?; + } + if let Some(c) = &sp.continuous_covariance { + let q = PyDict::new(py); + q.set_item("LB", c.lb)?; + q.set_item("Ek", c.ek.clone())?; + q.set_item("Fk", c.fk.clone())?; + e.set_item("continuous_covariance", q)?; + } + if let Some(c) = &sp.discrete_covariance { + let q = PyDict::new(py); + q.set_item("LS", c.ls)?; + q.set_item("LB", c.lb)?; + q.set_item("NE", c.ne)?; + q.set_item("NERP", c.nerp)?; + q.set_item("Ek", c.ek.clone())?; + q.set_item("Fkk", c.fkk.clone())?; + e.set_item("discrete_covariance", q)?; + } + spectra.push(e); + } + d.set_item("spectra", spectra)?; + Ok(d) +} + +/// A `(value, uncertainty)` pair, or the empty tuple when the record was too +/// short to hold one. +fn opt_pair_py(py: Python<'_>, pair: Option<(f64, f64)>) -> Bound<'_, PyTuple> { + match pair { + Some((v, u)) => PyTuple::new(py, [v, u]).expect("a two-element tuple"), + None => PyTuple::empty(py), + } +} + +fn mf1_mt458_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf1::Mf1Mt458, +) -> PyResult> { + use endf::mf::mf1::FissionEnergyRelease as F; + let d = PyDict::new(py); + // ZA is a float here, not an int: MT=458 is read with a CONT record + // upstream rather than a HEAD one. See issue #14. + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LFC", s.lfc)?; + d.set_item("NPLY", s.nply)?; + for (name, component) in endf::mf::mf1::FISSION_ENERGY_COMPONENTS + .iter() + .zip(&s.components) + { + match component { + F::Polynomial(pairs) => d.set_item(*name, pairs.clone())?, + F::Tabulated { ldrv, eifc } => { + let sub = PyDict::new(py); + sub.set_item("LDRV", *ldrv)?; + sub.set_item("EIFC", tab1_class(eifc))?; + d.set_item(*name, sub)? + } + } + } + // NFC only appears when the section carries tabulated components. + if s.lfc == 1 { + d.set_item("NFC", s.nfc)?; + } + Ok(d) +} + +fn mf7_mt2_dict<'py>(py: Python<'py>, s: &endf::mf::mf7::Mf7Mt2) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LTHR", s.lthr)?; + // LTHR picks which of the two are present; either may be absent, and both + // are for an LTHR the reader does not know. + if let Some(c) = &s.coherent { + let first = PyDict::new(py); + first.set_item("T", c.t)?; + first.set_item("LT", c.lt)?; + first.set_item("S", tab1_class(&c.s))?; + let mut temps = vec![first]; + for other in &c.others { + let e = PyDict::new(py); + e.set_item("T", other.t)?; + e.set_item("LI", other.li)?; + e.set_item("S", other.s.clone())?; + temps.push(e); + } + d.set_item("coherent", temps)?; + } + if let Some(i) = &s.incoherent { + let sub = PyDict::new(py); + sub.set_item("SB", i.sb)?; + sub.set_item("W", tab1_class(&i.w))?; + d.set_item("incoherent", sub)?; + } + Ok(d) +} + +fn mf7_mt4_dict<'py>(py: Python<'py>, s: &endf::mf::mf7::Mf7Mt4) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LAT", s.lat)?; + d.set_item("LASYM", s.lasym)?; + d.set_item("LLN", s.lln)?; + d.set_item("NI", s.ni)?; + d.set_item("NS", s.ns)?; + d.set_item("B", s.b.clone())?; + // S(alpha, beta) is only written when B(1) is positive, and the three keys + // it brings are absent otherwise. + if let Some(beta_int) = &s.beta_int { + d.set_item("beta_int", tab2_class(beta_int))?; + d.set_item("NB", s.nb)?; + let mut laws = Vec::with_capacity(s.beta_data.len()); + for law in &s.beta_data { + let first = PyDict::new(py); + first.set_item("T", law.t)?; + first.set_item("beta", law.beta)?; + first.set_item("LT", law.lt)?; + first.set_item("S", tab1_class(&law.s))?; + let mut temps = vec![first]; + for other in &law.others { + let e = PyDict::new(py); + e.set_item("T", other.t)?; + e.set_item("beta", other.beta)?; + e.set_item("LT", other.lt)?; + e.set_item("S", other.s.clone())?; + temps.push(e); + } + laws.push(temps); + } + d.set_item("beta_data", laws)?; + } + d.set_item("Teff", s.teff.iter().map(tab1_class).collect::>())?; + Ok(d) +} + +fn mf7_mt451_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf7::Mf7Mt451, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NA", s.na)?; + let mut elements = Vec::with_capacity(s.elements.len()); + for el in &s.elements { + let e = PyDict::new(py); + e.set_item("NAS", el.nas)?; + e.set_item("NI", el.ni)?; + e.set_item("ZAI", el.zai.clone())?; + e.set_item("LISI", el.lisi.clone())?; + e.set_item("AFI", el.afi.clone())?; + e.set_item("AWRI", el.awri.clone())?; + e.set_item("SFI", el.sfi.clone())?; + elements.push(e); + } + d.set_item("elements", elements)?; + Ok(d) +} + +fn mf26_dict<'py>(py: Python<'py>, s: &endf::mf::atomic::Mf26) -> PyResult> { + use endf::mf::atomic::ElectroAtomicDistribution as E; + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NK", s.nk)?; + let mut products = Vec::with_capacity(s.products.len()); + for p in &s.products { + let e = PyDict::new(py); + e.set_item("ZAP", p.zap)?; + e.set_item("AWI", p.awi)?; + e.set_item("LAW", p.law)?; + e.set_item("y", tab1_class(&p.yield_))?; + // An unrecognised law only warns on the Python side, leaving the + // product without a distribution; the key is left out to match. + match &p.distribution { + E::None => {} + E::ContinuumEnergyAngle(c) => { + e.set_item("distribution", continuum_energy_angle_dict(py, c)?)? + } + E::DiscreteTwoBody(t) => e.set_item("distribution", discrete_two_body_dict(py, t)?)?, + E::EnergyTransfer(t) => { + let sub = PyDict::new(py); + sub.set_item("ET", tab1_class(t))?; + e.set_item("distribution", sub)? + } + } + products.push(e); + } + d.set_item("products", products)?; + Ok(d) +} + +fn mf27_dict<'py>(py: Python<'py>, s: &endf::mf::atomic::Mf27) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("Z", s.z)?; + d.set_item("H", tab1_class(&s.h))?; + Ok(d) +} + +fn mf28_dict<'py>(py: Python<'py>, s: &endf::mf::atomic::Mf28) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("NSS", s.nss)?; + let shells: PyResult> = s + .shells + .iter() + .map(|shell| { + let e = PyDict::new(py); + e.set_item("SUBI", shell.subi)?; + e.set_item("NTR", shell.ntr)?; + e.set_item("EBI", shell.ebi)?; + e.set_item("ELN", shell.eln)?; + e.set_item("SUBJ", shell.subj.clone())?; + e.set_item("SUBK", shell.subk.clone())?; + e.set_item("ETR", shell.etr.clone())?; + e.set_item("FTR", shell.ftr.clone())?; + Ok(e) + }) + .collect(); + d.set_item("shells", shells?)?; + Ok(d) +} + +fn mf8_dict<'py>(py: Python<'py>, s: &endf::mf::mf8::Mf8) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LIS", s.lis)?; + d.set_item("LISO", s.liso)?; + d.set_item("NS", s.ns)?; + d.set_item("NO", s.no)?; + let subs: PyResult> = s + .subsections + .iter() + .map(|sub| { + let e = PyDict::new(py); + e.set_item("ZAP", sub.zap)?; + e.set_item("ELFS", sub.elfs)?; + e.set_item("LMF", sub.lmf)?; + e.set_item("LFS", sub.lfs)?; + // The decay chain of the product is present only when the + // evaluation wrote one. + if let Some(nd) = sub.nd { + e.set_item("ND", nd)?; + e.set_item("HL", sub.hl.clone())?; + e.set_item("RTYP", sub.rtyp.clone())?; + e.set_item("ZAN", sub.zan.clone())?; + e.set_item("BR", sub.br.clone())?; + e.set_item("END", sub.end.clone())?; + e.set_item("CT", sub.ct.clone())?; + } + Ok(e) + }) + .collect(); + d.set_item("subsections", subs?)?; + Ok(d) +} + +fn mf1_mt460_dict<'py>( + py: Python<'py>, + s: &endf::mf::mf1::Mf1Mt460, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LO", s.lo)?; + if s.lo == 1 { + d.set_item("NG", s.ng)?; + d.set_item("E", s.energy.clone())?; + d.set_item("T", s.time.iter().map(tab1_class).collect::>())?; + } + if s.lo == 2 { + d.set_item("lambda", s.lambda.clone())?; + } + Ok(d) +} + +fn mf33_subsection_dict<'py>( + py: Python<'py>, + sub: &endf::mf::covariance::Mf33Subsection, +) -> PyResult> { + let d = PyDict::new(py); + d.set_item("XMF1", sub.xmf1)?; + d.set_item("XLFS1", sub.xlfs1)?; + d.set_item("MAT1", sub.mat1)?; + d.set_item("MT1", sub.mt1)?; + d.set_item("NC", sub.nc)?; + d.set_item("NI", sub.ni)?; + + let nc: PyResult> = sub + .nc_subsections + .iter() + .map(|nc| { + let e = PyDict::new(py); + e.set_item("LTY", nc.lty)?; + e.set_item("E1", nc.e1)?; + e.set_item("E2", nc.e2)?; + // LTY says which half of the record was written. + if nc.lty == 0 { + e.set_item("NCI", nc.nci)?; + e.set_item("CI", nc.ci.clone())?; + e.set_item("XMTI", nc.xmti.clone())?; + } else { + e.set_item("MATS", nc.mats)?; + e.set_item("MTS", nc.mts)?; + e.set_item("NEI", nc.nei)?; + e.set_item("XMFS", nc.xmfs)?; + e.set_item("XLFSS", nc.xlfss)?; + e.set_item("EI", nc.ei.clone())?; + e.set_item("WEI", nc.wei.clone())?; + } + Ok(e) + }) + .collect(); + d.set_item("nc_subsections", nc?)?; + + let ni: PyResult> = sub + .ni_subsections + .iter() + .map(|ni| { + let e = PyDict::new(py); + e.set_item("LB", ni.lb)?; + e.set_item("NT", ni.nt)?; + // Each LB is its own record layout. + match ni.lb { + 0..=4 => { + e.set_item("LT", ni.lt)?; + e.set_item("NP", ni.np)?; + e.set_item("Ek", ni.ek.clone())?; + e.set_item("Fk", ni.fk.clone())?; + e.set_item("El", ni.el.clone())?; + e.set_item("Fl", ni.fl.clone())?; + } + 5 => { + e.set_item("LS", ni.ls)?; + e.set_item("NE", ni.ne)?; + e.set_item("Ek", ni.ek.clone())?; + e.set_item("Fkk", ni.fkk.clone())?; + } + 6 => { + e.set_item("NER", ni.ner)?; + e.set_item("NEC", ni.nec)?; + e.set_item("ER", ni.er.clone())?; + e.set_item("EC", ni.ec.clone())?; + e.set_item("Fkl", ni.fkl.clone())?; + } + _ => { + e.set_item("LT", ni.lt)?; + e.set_item("NP", ni.np)?; + e.set_item("Ek", ni.ek.clone())?; + e.set_item("Fk", ni.fk.clone())?; + } + } + Ok(e) + }) + .collect(); + d.set_item("ni_subsections", ni?)?; + Ok(d) +} + +fn mf33_dict<'py>(py: Python<'py>, s: &endf::mf::covariance::Mf33) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("MTL", s.mtl)?; + d.set_item("NL", s.nl)?; + let subs: PyResult> = s + .subsections + .iter() + .map(|sub| mf33_subsection_dict(py, sub)) + .collect(); + d.set_item("subsections", subs?)?; + Ok(d) +} + +fn mf34_dict<'py>(py: Python<'py>, s: &endf::mf::covariance::Mf34) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LTT", s.ltt)?; + d.set_item("NMT1", s.nmt1)?; + // Empty until issue #18 was fixed, when both readers started keeping the + // subsections they had already parsed. + let subs: PyResult> = s + .subsections + .iter() + .map(|sub| { + let e = PyDict::new(py); + e.set_item("MAT1", sub.mat1)?; + e.set_item("MT1", sub.mt1)?; + e.set_item("NL", sub.nl)?; + e.set_item("NSS", sub.nss)?; + e.set_item("LCT", sub.lct)?; + e.set_item("L", sub.l.clone())?; + e.set_item("L1", sub.l1.clone())?; + e.set_item("NI", sub.ni.clone())?; + let sss: PyResult> = sub + .subsubsections + .iter() + .map(|ss| { + let f = PyDict::new(py); + f.set_item("LS", ss.ls.clone())?; + f.set_item("LB", ss.lb.clone())?; + f.set_item("NT", ss.nt.clone())?; + f.set_item("NE", ss.ne.clone())?; + f.set_item("Data", ss.data.clone())?; + Ok(f) + }) + .collect(); + e.set_item("subsubsections", sss?)?; + Ok(e) + }) + .collect(); + d.set_item("subsections", subs?)?; + Ok(d) +} + +fn mf40_dict<'py>(py: Python<'py>, s: &endf::mf::covariance::Mf40) -> PyResult> { + let d = PyDict::new(py); + d.set_item("ZA", s.za)?; + d.set_item("AWR", s.awr)?; + d.set_item("LIS", s.lis)?; + d.set_item("NS", s.ns)?; + let subs: PyResult> = s + .subsections + .iter() + .map(|sub| { + let e = PyDict::new(py); + e.set_item("QM", sub.qm)?; + e.set_item("QI", sub.qi)?; + e.set_item("IZAP", sub.izap)?; + e.set_item("LFS", sub.lfs)?; + e.set_item("NL", sub.nl)?; + let sss: PyResult> = sub + .subsubsections + .iter() + .map(|ss| mf33_subsection_dict(py, ss)) + .collect(); + e.set_item("subsubsections", sss?)?; + Ok(e) + }) + .collect(); + d.set_item("subsections", subs?)?; + Ok(d) +} + +/// One section as the Python reader's dictionary, where there is one. +/// +/// `None` for a section whose dictionary shape has not been written. Those +/// are reachable through the typed accessors and the object layer; what is +/// missing is only the dictionary form the Python reader happens to use. +fn section_dict<'py>(py: Python<'py>, section: &Section) -> PyResult>> { + Ok(Some(match section { + Section::Mf1Mt451(s) => mf1_mt451_dict(py, s)?, + Section::Mf1Mt452(s) => mf1_mt452_dict(py, s)?, + Section::Mf1Mt455(s) => mf1_mt455_dict(py, s)?, + Section::Mf1Mt458(s) => mf1_mt458_dict(py, s)?, + Section::Mf1Mt460(s) => mf1_mt460_dict(py, s)?, + Section::Mf2(s) => mf2_dict(py, s)?, + Section::Mf8(s) => mf8_dict(py, s)?, + Section::Mf8Mt454(s) => mf8_mt454_dict(py, s)?, + Section::Mf8Mt457(s) => mf8_mt457_dict(py, s)?, + Section::Mf3(s) => mf3_dict(py, s)?, + Section::Mf4(s) => mf4_dict(py, s)?, + Section::Mf5(s) => mf5_dict(py, s)?, + Section::Mf6(s) => mf6_dict(py, s)?, + Section::Mf7Mt2(s) => mf7_mt2_dict(py, s)?, + Section::Mf7Mt4(s) => mf7_mt4_dict(py, s)?, + Section::Mf7Mt451(s) => mf7_mt451_dict(py, s)?, + Section::Mf9Mf10(s) => mf9_mf10_dict(py, s)?, + Section::Mf12(s) => mf12_dict(py, s)?, + Section::Mf13(s) => mf13_dict(py, s)?, + Section::Mf14(s) => mf14_dict(py, s)?, + Section::Mf15(s) => mf15_dict(py, s)?, + Section::Mf23(s) => mf23_dict(py, s)?, + Section::Mf26(s) => mf26_dict(py, s)?, + Section::Mf27(s) => mf27_dict(py, s)?, + Section::Mf28(s) => mf28_dict(py, s)?, + Section::Mf33(s) => mf33_dict(py, s)?, + Section::Mf34(s) => mf34_dict(py, s)?, + Section::Mf40(s) => mf40_dict(py, s)?, + _ => return Ok(None), + })) +} + +/// Read every material in an ENDF-6 file. +#[pyfunction] +fn get_materials(filename: &str) -> PyResult> { + let materials = endf::materials_from_str(&read_text(filename)?).map_err(to_py_err)?; + Ok(materials + .into_iter() + .map(|inner| PyMaterial { inner }) + .collect()) +} + +// --------------------------------------------------------------------------- +// Distributions +// +// The sum types — an angle-energy distribution, an outgoing energy law, a +// univariate density — come across as dicts tagged with a `kind` key rather +// than as a hierarchy of wrapper classes. That is the shape a consumer wants +// anyway: `kind` is exactly the discriminant column an Arrow union needs, and +// it keeps this file from growing a class per variant. +// --------------------------------------------------------------------------- + +fn tab1_dict<'py>(py: Python<'py>, t: &endf::Tabulated1D) -> PyResult> { + let d = PyDict::new(py); + d.set_item("x", t.x.clone())?; + d.set_item("y", t.y.clone())?; + d.set_item("breakpoints", t.breakpoints.clone())?; + d.set_item("interpolation", t.interpolation.clone())?; + Ok(d) +} + +fn univariate_dict<'py>(py: Python<'py>, u: &Univariate) -> PyResult> { + let d = PyDict::new(py); + match u { + Univariate::Discrete(t) => { + d.set_item("kind", "discrete")?; + d.set_item("x", t.x.clone())?; + d.set_item("p", t.p.clone())?; + d.set_item("cdf", t.cdf())?; + if let Some(c) = &t.c { + d.set_item("c", c.clone())?; + } + } + Univariate::Tabular(t) => { + d.set_item("kind", "tabular")?; + d.set_item("interpolation", t.interpolation.name())?; + d.set_item("x", t.x.clone())?; + d.set_item("p", t.p.clone())?; + d.set_item("cdf", t.cdf())?; + if let Some(c) = &t.c { + d.set_item("c", c.clone())?; + } + } + Univariate::Uniform(t) => { + d.set_item("kind", "uniform")?; + d.set_item("a", t.a)?; + d.set_item("b", t.b)?; + } + Univariate::Mixture(m) => { + d.set_item("kind", "mixture")?; + d.set_item("probability", m.probability.clone())?; + let parts: PyResult> = m + .distribution + .iter() + .map(|sub| univariate_dict(py, sub)) + .collect(); + d.set_item("distribution", parts?)?; + } + } + Ok(d) +} + +fn angle_dict<'py>(py: Python<'py>, a: &AngleDistribution) -> PyResult> { + let d = PyDict::new(py); + d.set_item("energy", a.energy.clone())?; + let mut mu = Vec::with_capacity(a.mu.len()); + for entry in &a.mu { + let m = PyDict::new(py); + match entry { + AngleAtEnergy::Legendre(l) => { + m.set_item("kind", "legendre")?; + m.set_item("coefficients", l.coefficients.clone())?; + } + AngleAtEnergy::Tabulated(t) => { + m.set_item("kind", "tabulated")?; + m.set_item("f", tab1_dict(py, t)?)?; + } + AngleAtEnergy::Tabular(t) => { + let inner = univariate_dict(py, &Univariate::Tabular(t.clone()))?; + m.update(inner.as_mapping())?; + } + AngleAtEnergy::Isotropic(u) => { + let inner = univariate_dict(py, &Univariate::Uniform(u.clone()))?; + m.update(inner.as_mapping())?; + } + } + mu.push(m); + } + d.set_item("mu", mu)?; + Ok(d) +} + +fn energy_dict<'py>(py: Python<'py>, e: &EnergyDistribution) -> PyResult> { + let d = PyDict::new(py); + match e { + EnergyDistribution::ArbitraryTabulated { energy, g, .. } => { + d.set_item("kind", "arbitrary-tabulated")?; + d.set_item("energy", energy.clone())?; + let g: PyResult> = g.iter().map(|t| tab1_dict(py, t)).collect(); + d.set_item("g", g?)?; + } + EnergyDistribution::GeneralEvaporation { u, theta, g } => { + d.set_item("kind", "general-evaporation")?; + d.set_item("U", *u)?; + d.set_item("theta", tab1_dict(py, theta)?)?; + d.set_item("g", tab1_dict(py, g)?)?; + } + EnergyDistribution::MaxwellEnergy { u, theta } => { + d.set_item("kind", "maxwell")?; + d.set_item("U", *u)?; + d.set_item("theta", tab1_dict(py, theta)?)?; + } + EnergyDistribution::Evaporation { u, theta } => { + d.set_item("kind", "evaporation")?; + d.set_item("U", *u)?; + d.set_item("theta", tab1_dict(py, theta)?)?; + } + EnergyDistribution::WattEnergy { u, a, b } => { + d.set_item("kind", "watt")?; + d.set_item("U", *u)?; + d.set_item("a", tab1_dict(py, a)?)?; + d.set_item("b", tab1_dict(py, b)?)?; + } + EnergyDistribution::MadlandNix { efl, efh, t_m } => { + d.set_item("kind", "madland-nix")?; + d.set_item("EFL", *efl)?; + d.set_item("EFH", *efh)?; + d.set_item("T_M", tab1_dict(py, t_m)?)?; + } + EnergyDistribution::LevelInelastic { + threshold, + mass_ratio, + } => { + d.set_item("kind", "level-inelastic")?; + d.set_item("threshold", *threshold)?; + d.set_item("mass_ratio", *mass_ratio)?; + } + EnergyDistribution::DiscretePhoton { + primary_flag, + energy, + atomic_weight_ratio, + } => { + d.set_item("kind", "discrete-photon")?; + d.set_item("primary_flag", *primary_flag)?; + d.set_item("energy", *energy)?; + d.set_item("atomic_weight_ratio", *atomic_weight_ratio)?; + } + EnergyDistribution::ContinuousTabular { + breakpoints, + interpolation, + energy, + energy_out, + } => { + d.set_item("kind", "continuous-tabular")?; + d.set_item("breakpoints", breakpoints.clone())?; + d.set_item("interpolation", interpolation.clone())?; + d.set_item("energy", energy.clone())?; + let out: PyResult> = energy_out.iter().map(|u| univariate_dict(py, u)).collect(); + d.set_item("energy_out", out?)?; + } + } + Ok(d) +} + +fn angle_energy_dict<'py>(py: Python<'py>, ae: &AngleEnergy) -> PyResult> { + let d = PyDict::new(py); + match ae { + AngleEnergy::Uncorrelated(u) => { + d.set_item("kind", "uncorrelated")?; + if let Some(angle) = &u.angle { + d.set_item("angle", angle_dict(py, angle)?)?; + } + if let Some(energy) = &u.energy { + d.set_item("energy", energy_dict(py, energy)?)?; + } + } + AngleEnergy::KalbachMann(k) => { + d.set_item("kind", "kalbach-mann")?; + d.set_item("breakpoints", k.breakpoints.clone())?; + d.set_item("interpolation", k.interpolation.clone())?; + d.set_item("energy", k.energy.clone())?; + let out: PyResult> = k + .energy_out + .iter() + .map(|u| univariate_dict(py, u)) + .collect(); + d.set_item("energy_out", out?)?; + let r: PyResult> = k.precompound.iter().map(|t| tab1_dict(py, t)).collect(); + d.set_item("precompound", r?)?; + let a: PyResult> = k.slope.iter().map(|t| tab1_dict(py, t)).collect(); + d.set_item("slope", a?)?; + } + AngleEnergy::Correlated(c) => { + d.set_item("kind", "correlated")?; + d.set_item("breakpoints", c.breakpoints.clone())?; + d.set_item("interpolation", c.interpolation.clone())?; + d.set_item("energy", c.energy.clone())?; + let out: PyResult> = c + .energy_out + .iter() + .map(|u| univariate_dict(py, u)) + .collect(); + d.set_item("energy_out", out?)?; + let mut mu = Vec::with_capacity(c.mu.len()); + for row in &c.mu { + let row: PyResult> = row.iter().map(|u| univariate_dict(py, u)).collect(); + mu.push(row?); + } + d.set_item("mu", mu)?; + } + AngleEnergy::NBodyPhaseSpace(n) => { + d.set_item("kind", "nbody")?; + d.set_item("total_mass", n.total_mass)?; + d.set_item("n_particles", n.n_particles)?; + d.set_item("atomic_weight_ratio", n.atomic_weight_ratio)?; + d.set_item("q_value", n.q_value)?; + } + } + Ok(d) +} + +// --------------------------------------------------------------------------- +// Reactions and nuclides +// --------------------------------------------------------------------------- + +/// A secondary particle a reaction emits. +#[pyclass(name = "Product", module = "endf._endf")] +#[derive(Clone)] +struct PyProduct { + inner: endf::Product, +} + +#[pymethods] +impl PyProduct { + #[getter] + fn name(&self) -> &str { + &self.inner.name + } + + #[getter] + fn emission_mode(&self) -> &'static str { + self.inner.emission_mode.name() + } + + #[getter] + fn decay_rate(&self) -> f64 { + self.inner.decay_rate + } + + /// The yield, as `{"kind": "polynomial"|"tabulated", ...}`. + #[getter] + fn yield_<'py>(&self, py: Python<'py>) -> PyResult> { + let d = PyDict::new(py); + match &self.inner.yield_ { + endf::Yield::Polynomial(p) => { + d.set_item("kind", "polynomial")?; + d.set_item("coefficients", p.coefficients.clone())?; + } + endf::Yield::Tabulated(t) => { + d.set_item("kind", "tabulated")?; + d.set_item("f", tab1_dict(py, t)?)?; + } + } + Ok(d) + } + + /// The yield at an incident energy in eV. + fn yield_at(&self, energy: f64) -> f64 { + self.inner.yield_.eval(energy) + } + + #[getter] + fn applicability(&self) -> Vec { + self.inner + .applicability + .iter() + .map(|t| PyTabulated1D { inner: t.clone() }) + .collect() + } + + #[getter] + fn distribution<'py>(&self, py: Python<'py>) -> PyResult>> { + self.inner + .distribution + .iter() + .map(|d| angle_energy_dict(py, d)) + .collect() + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.name, + self.inner.emission_mode.name() + ) + } +} + +/// One reaction channel. +#[pyclass(name = "Reaction", module = "endf._endf")] +#[derive(Clone)] +struct PyReaction { + inner: endf::Reaction, +} + +#[pymethods] +impl PyReaction { + #[getter] + #[allow(non_snake_case)] + fn MT(&self) -> i32 { + self.inner.mt + } + + #[getter] + fn name(&self) -> Option { + self.inner.name() + } + + #[getter] + fn q_reaction(&self) -> f64 { + self.inner.q_reaction + } + + #[getter] + fn q_massdiff(&self) -> f64 { + self.inner.q_massdiff + } + + #[getter] + fn redundant(&self) -> bool { + self.inner.redundant + } + + #[getter] + fn center_of_mass(&self) -> bool { + self.inner.center_of_mass + } + + /// Cross sections by temperature, e.g. `rx.xs["294K"]`. + #[getter] + fn xs(&self) -> BTreeMap { + self.inner + .xs + .iter() + .map(|(t, xs)| (t.clone(), PyTabulated1D { inner: xs.clone() })) + .collect() + } + + #[getter] + fn products(&self) -> Vec { + self.inner + .products + .iter() + .map(|p| PyProduct { inner: p.clone() }) + .collect() + } + + #[getter] + fn derived_products(&self) -> Vec { + self.inner + .derived_products + .iter() + .map(|p| PyProduct { inner: p.clone() }) + .collect() + } + + fn __repr__(&self) -> String { + match self.inner.name() { + Some(name) => format!("", self.inner.mt), + None => format!("", self.inner.mt), + } + } +} + +/// Continuous-energy neutron interaction data for one nuclide. +#[pyclass(name = "IncidentNeutron", module = "endf._endf")] +struct PyIncidentNeutron { + inner: endf::IncidentNeutron, +} + +#[pymethods] +impl PyIncidentNeutron { + /// Read a nuclide from an ENDF evaluation. + #[staticmethod] + fn from_endf(material: &PyMaterial) -> PyResult { + let inner = endf::IncidentNeutron::from_endf(&material.inner).map_err(to_py_err)?; + Ok(PyIncidentNeutron { inner }) + } + + /// Read a nuclide from an ACE table. + #[staticmethod] + #[pyo3(signature = (table, metastable_scheme="mcnp"))] + fn from_ace(table: &PyAceTable, metastable_scheme: &str) -> PyResult { + let scheme = parse_scheme(metastable_scheme)?; + let inner = endf::IncidentNeutron::from_ace(&table.inner, scheme).map_err(to_py_err)?; + Ok(PyIncidentNeutron { inner }) + } + + /// Add the same nuclide at another temperature. + #[pyo3(signature = (table, metastable_scheme="mcnp"))] + fn add_temperature_from_ace( + &mut self, + table: &PyAceTable, + metastable_scheme: &str, + ) -> PyResult<()> { + let scheme = parse_scheme(metastable_scheme)?; + self.inner + .add_temperature_from_ace(&table.inner, scheme) + .map_err(to_py_err) + } + + #[getter] + fn name(&self) -> String { + self.inner.name() + } + + #[getter] + fn atomic_number(&self) -> u32 { + self.inner.atomic_number + } + + #[getter] + fn mass_number(&self) -> u32 { + self.inner.mass_number + } + + #[getter] + fn metastable(&self) -> u32 { + self.inner.metastable + } + + #[getter] + fn atomic_symbol(&self) -> &'static str { + self.inner.atomic_symbol() + } + + #[getter] + fn atomic_weight_ratio(&self) -> Option { + self.inner.atomic_weight_ratio + } + + #[getter] + #[allow(non_snake_case)] + fn kTs(&self) -> Vec { + self.inner.k_ts.clone() + } + + #[getter] + fn temperatures(&self) -> Vec { + self.inner.temperatures() + } + + #[getter] + fn energy(&self) -> BTreeMap> { + self.inner.energy.clone() + } + + #[getter] + fn reactions(&self) -> BTreeMap { + self.inner + .reactions + .iter() + .map(|(mt, rx)| (*mt, PyReaction { inner: rx.clone() })) + .collect() + } + + /// What a redundant reaction is the sum of. + fn reaction_components(&self, mt: i32) -> Vec { + self.inner.reaction_components(mt) + } + + /// The removal cross section at a temperature. + #[pyo3(signature = (temperature="0K", mu_cutoff=0.0))] + fn removal_xs(&self, temperature: &str, mu_cutoff: f64) -> PyResult { + let inner = self + .inner + .removal_xs(temperature, mu_cutoff) + .map_err(to_py_err)?; + Ok(PyTabulated1D { inner }) + } + + /// The unresolved resonance probability tables, by temperature. + #[getter] + fn urr<'py>(&self, py: Python<'py>) -> PyResult> { + let out = PyDict::new(py); + for (t, urr) in &self.inner.urr { + let d = PyDict::new(py); + d.set_item("energy", urr.energy.clone())?; + d.set_item("table", urr.table.clone())?; + d.set_item("shape", urr.shape.to_vec())?; + d.set_item("interpolation", urr.interpolation)?; + d.set_item("inelastic_flag", urr.inelastic_flag)?; + d.set_item("absorption_flag", urr.absorption_flag)?; + d.set_item("multiply_smooth", urr.multiply_smooth)?; + out.set_item(t, d)?; + } + Ok(out) + } + + fn __contains__(&self, mt: i32) -> bool { + self.inner.contains(mt) + } + + /// A reaction by MT, or by name — `n[2]`, `n["elastic"]`. + fn __getitem__(&self, key: &Bound<'_, PyAny>) -> PyResult { + let found = if let Ok(mt) = key.extract::() { + self.inner.get(mt) + } else { + let name: String = key.extract()?; + self.inner.get_by_name(&name) + }; + found + .map(|rx| PyReaction { inner: rx.clone() }) + .ok_or_else(|| PyValueError::new_err(format!("no reaction {key}"))) + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.name(), + self.inner.reactions.len() + ) + } +} + +// --------------------------------------------------------------------------- +// Photons, decay and chains +// --------------------------------------------------------------------------- + +/// Photon interaction data for one element. +#[pyclass(name = "IncidentPhoton", module = "endf._endf")] +struct PyIncidentPhoton { + inner: endf::IncidentPhoton, +} + +#[pymethods] +impl PyIncidentPhoton { + #[staticmethod] + #[pyo3(signature = (photoatomic, relaxation=None))] + fn from_endf(photoatomic: &PyMaterial, relaxation: Option<&PyMaterial>) -> PyResult { + let inner = + endf::IncidentPhoton::from_endf(&photoatomic.inner, relaxation.map(|m| &m.inner)) + .map_err(to_py_err)?; + Ok(PyIncidentPhoton { inner }) + } + + #[staticmethod] + fn from_ace(table: &PyAceTable) -> PyResult { + let inner = endf::IncidentPhoton::from_ace(&table.inner).map_err(to_py_err)?; + Ok(PyIncidentPhoton { inner }) + } + + #[getter] + fn atomic_number(&self) -> i64 { + self.inner.atomic_number + } + + #[getter] + fn name(&self) -> &'static str { + self.inner.name() + } + + /// Every reaction, as `{MT: {...}}`. + #[getter] + fn reactions<'py>(&self, py: Python<'py>) -> PyResult> { + let out = PyDict::new(py); + for (mt, rx) in &self.inner.reactions { + let d = PyDict::new(py); + d.set_item("MT", rx.mt)?; + if let Some(name) = rx.name() { + d.set_item("name", name)?; + } + for (key, value) in [ + ("xs", &rx.xs), + ("scattering_factor", &rx.scattering_factor), + ("anomalous_real", &rx.anomalous_real), + ("anomalous_imag", &rx.anomalous_imag), + ] { + if let Some(value) = value { + d.set_item(key, tab1_dict(py, value)?)?; + } + } + if let Some(value) = rx.subshell_binding_energy { + d.set_item("subshell_binding_energy", value)?; + } + if let Some(value) = rx.fluorescence_yield { + d.set_item("fluorescence_yield", value)?; + } + out.set_item(mt, d)?; + } + Ok(out) + } + + /// Atomic relaxation data, or None. + #[getter] + fn atomic_relaxation<'py>(&self, py: Python<'py>) -> PyResult>> { + let Some(r) = &self.inner.atomic_relaxation else { + return Ok(None); + }; + let d = PyDict::new(py); + d.set_item("subshells", r.subshells())?; + d.set_item("binding_energy", r.binding_energy.clone())?; + d.set_item("num_electrons", r.num_electrons.clone())?; + let transitions = PyDict::new(py); + for (shell, t) in &r.transitions { + let e = PyDict::new(py); + e.set_item("secondary_subshell", t.secondary_subshell.clone())?; + e.set_item("tertiary_subshell", t.tertiary_subshell.clone())?; + e.set_item("energy", t.energy.clone())?; + e.set_item("probability", t.probability.clone())?; + transitions.set_item(shell, e)?; + } + d.set_item("transitions", transitions)?; + Ok(Some(d)) + } + + fn reaction_components(&self, mt: i32) -> Vec { + self.inner.reaction_components(mt) + } + + fn __contains__(&self, mt: i32) -> bool { + self.inner.contains(mt) + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.name(), + self.inner.reactions.len() + ) + } +} + +/// Radioactive decay data for one nuclide. +#[pyclass(name = "Decay", module = "endf._endf")] +struct PyDecay { + inner: endf::Decay, +} + +#[pymethods] +impl PyDecay { + #[staticmethod] + fn from_endf(material: &PyMaterial) -> PyResult { + let inner = endf::Decay::from_material(&material.inner).map_err(to_py_err)?; + Ok(PyDecay { inner }) + } + + /// The nuclide, as a dict of its identity. + #[getter] + fn nuclide<'py>(&self, py: Python<'py>) -> PyResult> { + let n = &self.inner.nuclide; + let d = PyDict::new(py); + d.set_item("name", &n.name)?; + d.set_item("atomic_number", n.atomic_number)?; + d.set_item("mass_number", n.mass_number)?; + d.set_item("isomeric_state", n.isomeric_state)?; + d.set_item("excited_state", n.excited_state)?; + d.set_item("mass", n.mass)?; + d.set_item("stable", n.stable)?; + d.set_item("spin", n.spin)?; + d.set_item("parity", n.parity)?; + Ok(d) + } + + /// Half-life in seconds as `(value, uncertainty)`, or None if stable. + #[getter] + fn half_life(&self) -> Option<(f64, f64)> { + self.inner.half_life + } + + /// Decay constant in inverse seconds, or None where the half-life is + /// unevaluated. + #[getter] + fn decay_constant(&self) -> Option<(f64, f64)> { + self.inner.decay_constant() + } + + #[getter] + fn decay_energy(&self) -> (f64, f64) { + self.inner.decay_energy() + } + + #[getter] + fn average_energies(&self) -> BTreeMap<&'static str, (f64, f64)> { + self.inner.average_energies.clone() + } + + /// The decay modes, each with the daughter it leaves behind. + #[getter] + fn modes<'py>(&self, py: Python<'py>) -> PyResult>> { + self.inner + .modes + .iter() + .map(|m| { + let d = PyDict::new(py); + d.set_item("parent", &m.parent)?; + d.set_item("modes", m.modes.clone())?; + d.set_item("daughter", m.daughter())?; + d.set_item("daughter_state", m.daughter_state)?; + d.set_item("energy", m.energy)?; + d.set_item("branching_ratio", m.branching_ratio)?; + Ok(d) + }) + .collect() + } + + /// What the nuclide emits, in particles per second, by particle type. + #[getter] + fn sources<'py>(&self, py: Python<'py>) -> PyResult> { + let out = PyDict::new(py); + for (particle, dist) in self.inner.sources().map_err(to_py_err)? { + out.set_item(particle, univariate_dict(py, &dist)?)?; + } + Ok(out) + } + + fn __repr__(&self) -> String { + format!("", self.inner.nuclide.name) + } +} + +/// A depletion chain. +#[pyclass(name = "Chain", module = "endf._endf")] +struct PyChain { + inner: endf::Chain, +} + +#[pymethods] +impl PyChain { + /// Build a chain from decay, fission product yield and neutron + /// evaluations. + #[staticmethod] + #[pyo3(signature = (decay, fpy, neutron, reactions=None))] + fn from_endf( + decay: Vec>, + fpy: Vec>, + neutron: Vec>, + reactions: Option>, + ) -> PyResult { + let unwrap = |v: &[PyRef<'_, PyMaterial>]| -> Vec { + v.iter().map(|m| m.inner.clone()).collect() + }; + let names: Vec = reactions.unwrap_or_else(|| { + endf::chain::DEFAULT_REACTIONS + .iter() + .map(|s| s.to_string()) + .collect() + }); + let names: Vec<&str> = names.iter().map(String::as_str).collect(); + let inner = + endf::Chain::from_endf(&unwrap(&decay), &unwrap(&fpy), &unwrap(&neutron), &names) + .map_err(to_py_err)?; + Ok(PyChain { inner }) + } + + #[getter] + fn nuclides<'py>(&self, py: Python<'py>) -> PyResult>> { + self.inner + .nuclides + .iter() + .map(|n| nuclide_dict(py, n)) + .collect() + } + + /// One nuclide by name. + fn __getitem__<'py>(&self, py: Python<'py>, name: &str) -> PyResult> { + let n = self + .inner + .get(name) + .ok_or_else(|| PyValueError::new_err(format!("no nuclide {name}")))?; + nuclide_dict(py, n) + } + + fn __contains__(&self, name: &str) -> bool { + self.inner.contains(name) + } + + fn __len__(&self) -> usize { + self.inner.len() + } + + /// The chain reachable from a set of starting nuclides. + #[pyo3(signature = (initial, level=None))] + fn reduce(&self, initial: Vec, level: Option) -> PyChain { + let initial: Vec<&str> = initial.iter().map(String::as_str).collect(); + PyChain { + inner: self.inner.reduce(&initial, level), + } + } + + /// Everything that does not add up, nuclide by nuclide. + #[pyo3(signature = (tolerance=1e-4))] + fn validate(&self, tolerance: f64) -> Vec { + self.inner.validate(tolerance) + } + + fn __repr__(&self) -> String { + format!("", self.inner.len()) + } +} + +fn nuclide_dict<'py>(py: Python<'py>, n: &endf::Nuclide) -> PyResult> { + let d = PyDict::new(py); + d.set_item("name", &n.name)?; + d.set_item("half_life", n.half_life)?; + d.set_item("decay_energy", n.decay_energy)?; + let modes: PyResult> = n + .decay_modes + .iter() + .map(|m| { + let e = PyDict::new(py); + e.set_item("type", &m.kind)?; + e.set_item("target", m.target.clone())?; + e.set_item("branching_ratio", m.branching_ratio)?; + Ok(e) + }) + .collect(); + d.set_item("decay_modes", modes?)?; + let reactions: PyResult> = n + .reactions + .iter() + .map(|r| { + let e = PyDict::new(py); + e.set_item("type", &r.kind)?; + e.set_item("target", r.target.clone())?; + e.set_item("Q", r.q_value)?; + e.set_item("branching_ratio", r.branching_ratio)?; + Ok(e) + }) + .collect(); + d.set_item("reactions", reactions?)?; + d.set_item("yield_data", n.yield_data.clone())?; + Ok(d) +} + +// --------------------------------------------------------------------------- +// ACE +// --------------------------------------------------------------------------- + +fn parse_scheme(name: &str) -> PyResult { + match name { + "mcnp" => Ok(endf::ace::MetastableScheme::Mcnp), + "nndc" => Ok(endf::ace::MetastableScheme::Nndc), + other => Err(PyValueError::new_err(format!( + "metastable_scheme must be 'mcnp' or 'nndc', got {other:?}" + ))), + } +} + +/// One ACE cross section table. +#[pyclass(name = "AceTable", module = "endf._endf")] +#[derive(Clone)] +struct PyAceTable { + inner: endf::ace::Table, +} + +#[pymethods] +impl PyAceTable { + #[getter] + fn name(&self) -> &str { + &self.inner.name + } + + #[getter] + fn atomic_weight_ratio(&self) -> f64 { + self.inner.atomic_weight_ratio + } + + /// Temperature in MeV, as the file stores it. + #[getter] + #[allow(non_snake_case)] + fn kT(&self) -> f64 { + self.inner.kt + } + + /// The same, in kelvin. + #[getter] + fn temperature(&self) -> f64 { + self.inner.temperature() + } + + #[getter] + fn zaid(&self) -> PyResult { + self.inner.zaid().map_err(to_py_err) + } + + /// The suffix letter, e.g. `"c"` for a continuous-energy neutron table. + #[getter] + fn data_type(&self) -> PyResult { + Ok(self + .inner + .data_type() + .map_err(to_py_err)? + .suffix() + .to_string()) + } + + #[getter] + fn nxs(&self) -> Vec { + self.inner.nxs.clone() + } + + #[getter] + fn jxs(&self) -> Vec { + self.inner.jxs.clone() + } + + #[getter] + fn xss(&self) -> Vec { + self.inner.xss.clone() + } + + fn __repr__(&self) -> String { + format!("", self.inner.name) + } +} + +/// Read every table in an ACE file. +#[pyfunction] +fn get_tables(filename: &str) -> PyResult> { + let tables = endf::ace::tables_from_str(&read_text(filename)?, None).map_err(to_py_err)?; + Ok(tables + .into_iter() + .map(|inner| PyAceTable { inner }) + .collect()) +} + +/// Read every table from the text of an ACE file. +#[pyfunction] +fn ace_tables_from_string(text: &str) -> PyResult> { + let tables = endf::ace::tables_from_str(text, None).map_err(to_py_err)?; + Ok(tables + .into_iter() + .map(|inner| PyAceTable { inner }) + .collect()) +} + +/// The name of a reaction, e.g. `"(n,2n)"` for MT=16. +#[pyfunction] +#[pyo3(name = "reaction_name")] +fn py_reaction_name(mt: i32) -> Option { + endf::reaction_name(mt) +} + +/// The MT of a named reaction, by its own name or by an alias. +#[pyfunction] +#[pyo3(name = "reaction_mt")] +fn py_reaction_mt(name: &str) -> Option { + endf::reaction_mt(name) +} + +/// A nuclide's name in GNDS convention, e.g. `gnds_name(95, 242, 1)`. +#[pyfunction] +#[pyo3(name = "gnds_name")] +#[pyo3(signature = (z, a, m=0))] +fn py_gnds_name(z: u32, a: u32, m: u32) -> String { + endf::gnds_name(z, a, m) +} + +// --------------------------------------------------------------------------- +// Fission product yields +// --------------------------------------------------------------------------- + +/// Independent and cumulative fission product yields, from MF=8 MT=454/459. +#[pyclass(name = "FissionProductYields", module = "endf._endf")] +struct PyFissionProductYields { + inner: endf::FissionProductYields, +} + +/// One energy's yields as `{name: (value, uncertainty)}`, the shape the Python +/// reader gives once its `ufloat` is taken apart. +fn yields_at_energy<'py>( + py: Python<'py>, + yields: &[endf::ProductYield], +) -> PyResult> { + let d = PyDict::new(py); + for y in yields { + d.set_item(&y.name, y.yield_)?; + } + Ok(d) +} + +#[pymethods] +impl PyFissionProductYields { + #[new] + fn new(filename: &str) -> PyResult { + let material = endf::Material::from_str(&read_text(filename)?).map_err(to_py_err)?; + Self::from_material(&PyMaterial { inner: material }) + } + + /// Read the yields of an already-parsed material. + #[staticmethod] + fn from_material(material: &PyMaterial) -> PyResult { + let inner = + endf::FissionProductYields::from_material(&material.inner).map_err(to_py_err)?; + Ok(PyFissionProductYields { inner }) + } + + /// The fissioning nuclide, from MF=1 MT=451. + #[getter] + fn nuclide<'py>(&self, py: Python<'py>) -> PyResult> { + let n = &self.inner.nuclide; + let d = PyDict::new(py); + d.set_item("name", &n.name)?; + d.set_item("atomic_number", n.atomic_number)?; + d.set_item("mass_number", n.mass_number)?; + d.set_item("isomeric_state", n.isomeric_state)?; + d.set_item("excited_state", n.excited_state)?; + Ok(d) + } + + /// The incident energies the yields are tabulated at, or None when the + /// evaluation has neither yield section. + #[getter] + fn energies(&self) -> Option> { + if self.inner.energies.is_empty() { + None + } else { + Some(self.inner.energies.clone()) + } + } + + /// Yields before delayed decay, one dict per incident energy. + #[getter] + fn independent<'py>(&self, py: Python<'py>) -> PyResult>> { + self.inner + .independent + .iter() + .map(|y| yields_at_energy(py, y)) + .collect() + } + + /// Yields after it. + #[getter] + fn cumulative<'py>(&self, py: Python<'py>) -> PyResult>> { + self.inner + .cumulative + .iter() + .map(|y| yields_at_energy(py, y)) + .collect() + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.nuclide.name, + self.inner.energies.len() + ) + } +} + +// --------------------------------------------------------------------------- +// Radionuclide production +// --------------------------------------------------------------------------- + +/// Production data for a single final state of one reaction. +#[pyclass(name = "RadionuclideProduction", module = "endf._endf")] +#[derive(Clone)] +struct PyRadionuclideProduction { + inner: endf::RadionuclideProduction, +} + +#[pymethods] +#[allow(non_snake_case)] +impl PyRadionuclideProduction { + #[getter] + fn ZAP(&self) -> i64 { + self.inner.zap + } + + #[getter] + fn LFS(&self) -> i64 { + self.inner.lfs + } + + #[getter] + fn QM(&self) -> f64 { + self.inner.qm + } + + #[getter] + fn QI(&self) -> f64 { + self.inner.qi + } + + #[getter] + fn ELFS(&self) -> Option { + self.inner.elfs + } + + /// MF=9 yield, a multiplier on the reaction cross section. + #[getter] + fn yields(&self) -> Option { + self.inner.yields.as_ref().map(tab1_class) + } + + /// MF=10 production cross section, in barns. + #[getter] + fn cross_section(&self) -> Option { + self.inner.cross_section.as_ref().map(tab1_class) + } + + /// The MF=8 excitation energy when the evaluation gave one, else QM - QI. + #[getter] + fn excitation_energy(&self) -> f64 { + self.inner.excitation_energy() + } + + fn __repr__(&self) -> String { + format!( + "", + self.inner.zap, self.inner.lfs + ) + } +} + +/// Collect a material's radionuclide production data from MF=8, 9 and 10, +/// keyed by MT. +#[pyfunction] +#[pyo3(name = "radionuclide_production")] +fn py_radionuclide_production( + material: &PyMaterial, +) -> BTreeMap> { + endf::radionuclide_production(&material.inner) + .into_iter() + .map(|(mt, states)| { + let states = states + .into_iter() + .map(|inner| PyRadionuclideProduction { inner }) + .collect(); + (mt, states) + }) + .collect() +} + +/// One isomeric state, as `isomer_table` reports it. +#[derive(FromPyObject)] +struct IsomerEntry { + #[pyo3(item("LIS"))] + lis: i64, + #[pyo3(item("half_life"))] + half_life: Option, + #[pyo3(item("E_iso"))] + e_iso: Option, +} + +/// Build a table of isomeric states from decay data evaluations. +/// +/// Only the metastable files are needed; ground states are implicit. Keyed by +/// `(Z, A)` and then by isomeric-state ordinal, matching the Python function. +#[pyfunction] +#[pyo3(name = "isomer_table")] +fn py_isomer_table<'py>(py: Python<'py>, decay_files: Vec) -> PyResult> { + // Read through `read_text` rather than `endf::isomer_table`, so a + // compressed evaluation works here as it does everywhere else. + let mut materials = Vec::with_capacity(decay_files.len()); + for filename in &decay_files { + materials.push(endf::Material::from_str(&read_text(filename)?).map_err(to_py_err)?); + } + let table = endf::radionuclide_production::isomer_table_from_materials(&materials); + + let out = PyDict::new(py); + for ((z, a), isomers) in table { + let by_state = PyDict::new(py); + for (liso, isomer) in isomers { + let entry = PyDict::new(py); + entry.set_item("LIS", isomer.lis)?; + entry.set_item("half_life", isomer.half_life)?; + entry.set_item("E_iso", isomer.e_iso)?; + by_state.set_item(liso, entry)?; + } + out.set_item((z, a), by_state)?; + } + Ok(out) +} + +/// Map a production level to an isomeric-state ordinal (LISO). +#[pyfunction] +#[pyo3(name = "level_to_isomeric_state")] +#[pyo3(signature = (Z, A, lfs, excitation_energy, table, *, tol_eV=3000.0))] +#[allow(non_snake_case)] +fn py_level_to_isomeric_state( + Z: i64, + A: i64, + lfs: i64, + excitation_energy: Option, + table: BTreeMap<(i64, i64), BTreeMap>, + tol_eV: f64, +) -> i64 { + let table: endf::radionuclide_production::IsomerTable = table + .into_iter() + .map(|(key, isomers)| { + let isomers = isomers + .into_iter() + .map(|(liso, e)| { + ( + liso, + endf::radionuclide_production::Isomer { + lis: e.lis, + half_life: e.half_life, + e_iso: e.e_iso, + }, + ) + }) + .collect(); + (key, isomers) + }) + .collect(); + endf::radionuclide_production::level_to_isomeric_state( + Z, + A, + lfs, + excitation_energy, + &table, + tol_eV, + ) +} + +/// The (Z, A, metastable state) a GNDS name denotes, e.g. `zam("Am242_m1")`. +#[pyfunction] +#[pyo3(name = "zam")] +fn py_zam(name: &str) -> PyResult<(u32, u32, u32)> { + endf::zam(name).map_err(to_py_err) +} + +/// A temperature in kelvin as the string ACE and HDF5 libraries key on. +#[pyfunction] +#[pyo3(name = "temperature_str")] +fn py_temperature_str(t: f64) -> String { + endf::data::temperature_str(t) +} + +/// The name of a photon reaction, e.g. `"coherent"` for MT=502. +#[pyfunction] +#[pyo3(name = "photon_reaction_name")] +fn py_photon_reaction_name(mt: i32) -> Option<&'static str> { + endf::incident_photon::photon_reaction_name(mt) +} + +/// The MT of a named photon reaction. +#[pyfunction] +#[pyo3(name = "photon_reaction_mt")] +fn py_photon_reaction_mt(name: &str) -> Option { + endf::incident_photon::photon_reaction_mt(name) +} + +/// The decay modes an ENDF RTYP value names, in order. +/// +/// RTYP packs a chain as the digits of a decimal, so `1.5` is a beta- decay +/// followed by a spontaneous fission. +#[pyfunction] +#[pyo3(name = "decay_modes")] +fn py_decay_modes(rtyp: f64) -> Vec<&'static str> { + endf::decay::decay_modes(rtyp) +} + +/// Scale branching ratios so they sum to one, in place, as a chain needs. +#[pyfunction] +#[pyo3(name = "normalise_branch_ratios")] +fn py_normalise_branch_ratios(mut ratios: Vec) -> Vec { + endf::chain::normalise_branch_ratios(&mut ratios); + ratios +} + +/// Register the constant tables the Python package exposes at module level. +/// +/// Each is built here rather than stored, because the crate holds them as +/// arrays and the Python package as dictionaries; the mapping is the point. +fn add_tables(m: &Bound<'_, PyModule>) -> PyResult<()> { + let py = m.py(); + + let symbols = PyDict::new(py); + for (z, symbol) in endf::data::ATOMIC_SYMBOL.iter().enumerate() { + symbols.set_item(z, symbol)?; + } + m.add("ATOMIC_SYMBOL", symbols)?; + + let sum_rules = PyDict::new(py); + for (mt, parts) in endf::data::SUM_RULES { + sum_rules.set_item(mt, parts.to_vec())?; + } + m.add("SUM_RULES", sum_rules)?; + + // 1 to 5, the ENDF codes; `from_endf_code` rejects anything else. + let schemes = PyDict::new(py); + for code in 1..=5 { + let scheme = endf::univariate::Interpolation::from_endf_code(code).map_err(to_py_err)?; + schemes.set_item(code, scheme.name())?; + } + m.add("INTERPOLATION_SCHEME", schemes)?; + + m.add("FISSION_MTS", endf::FISSION_MTS.to_vec())?; + m.add("EV_PER_MEV", endf::EV_PER_MEV)?; + m.add("K_BOLTZMANN", endf::K_BOLTZMANN)?; + Ok(()) +} + +#[pymodule] +fn _endf(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_function(wrap_pyfunction!(py_float_endf, m)?)?; + m.add_function(wrap_pyfunction!(py_int_endf, m)?)?; + m.add_function(wrap_pyfunction!(get_materials, m)?)?; + m.add_class::()?; + m.add_class::()?; + m.add_function(wrap_pyfunction!(get_tables, m)?)?; + m.add_function(wrap_pyfunction!(ace_tables_from_string, m)?)?; + m.add_function(wrap_pyfunction!(py_reaction_name, m)?)?; + m.add_function(wrap_pyfunction!(py_reaction_mt, m)?)?; + m.add_function(wrap_pyfunction!(py_gnds_name, m)?)?; + m.add_function(wrap_pyfunction!(py_zam, m)?)?; + m.add_function(wrap_pyfunction!(py_temperature_str, m)?)?; + m.add_function(wrap_pyfunction!(py_photon_reaction_name, m)?)?; + m.add_function(wrap_pyfunction!(py_photon_reaction_mt, m)?)?; + m.add_function(wrap_pyfunction!(py_decay_modes, m)?)?; + m.add_function(wrap_pyfunction!(py_normalise_branch_ratios, m)?)?; + m.add_function(wrap_pyfunction!(py_radionuclide_production, m)?)?; + m.add_function(wrap_pyfunction!(py_isomer_table, m)?)?; + m.add_function(wrap_pyfunction!(py_level_to_isomeric_state, m)?)?; + m.add_class::()?; + m.add_class::()?; + add_tables(m)?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + Ok(()) +} diff --git a/crates/endf-py/typecheck.py b/crates/endf-py/typecheck.py new file mode 100644 index 0000000..359380e --- /dev/null +++ b/crates/endf-py/typecheck.py @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MIT +"""A type checker's view of `_endf`, exercised under `mypy --strict`. + +`tests/test_rust_stub.py` compares the names the stub declares against the +names the module exports, which catches a method that was added and never +written down. It cannot catch a name that is present with the wrong type — +that needs a type checker, and a type checker needs something to check. + +So this is that something: ordinary use of the module with every result bound +to an explicit annotation. Under `--strict` a wrong return type in the stub +makes the assignment fail. Nothing here runs; the paths are not opened. + + mypy --strict crates/endf-py/typecheck.py +""" + +from __future__ import annotations + +from typing import Any + +import _endf + + +def records() -> None: + value: float = _endf.float_endf(" 1.234567+8") + count: int = _endf.int_endf(" 9552") + assert value or count + + table = _endf.Tabulated1D([1.0, 2.0], [3.0, 4.0]) + x: list[float] = table.x + y: list[float] = table.y + breakpoints: list[int] = table.breakpoints + regions: int = table.n_regions + running: list[float] = table.integral() + assert x and y and breakpoints and regions and running + + +def materials() -> None: + material = _endf.Material("n-095_Am_244.endf.xz") + mat: int = material.MAT + sections: list[tuple[int, int]] = material.sections + text: dict[tuple[int, int], str] = material.section_text + data: dict[tuple[int, int], dict[str, Any]] = material.section_data + one: dict[str, Any] = material[3, 1] + present: bool = (3, 1) in material + assert mat and sections and text and data and one and present + + # `mf3` is optional, and a checker should make the caller say so. + cross_section = material.mf3(102) + if cross_section is not None: + qm: float = cross_section.QM + sigma: _endf.Tabulated1D = cross_section.sigma + assert qm and sigma + + everything: list[_endf.Material] = _endf.get_materials("file.endf") + assert everything + + +def nuclides() -> None: + material = _endf.Material("n-095_Am_244.endf.xz") + neutron = _endf.IncidentNeutron.from_endf(material) + + name: str = neutron.name + z: int = neutron.atomic_number + a: int = neutron.mass_number + symbol: str = neutron.atomic_symbol + reactions: dict[int, _endf.Reaction] = neutron.reactions + temperatures: list[str] = neutron.temperatures + grids: dict[str, list[float]] = neutron.energy + assert name and z and a and symbol and reactions and temperatures and grids + + # Optional, because an ACE table has it and an ENDF evaluation may not. + ratio = neutron.atomic_weight_ratio + if ratio is not None: + scaled: float = ratio * 2.0 + assert scaled + + reaction: _endf.Reaction = neutron[102] + mt: int = reaction.MT + q: float = reaction.q_reaction + cm: bool = reaction.center_of_mass + by_temperature: dict[str, _endf.Tabulated1D] = reaction.xs + products: list[_endf.Product] = reaction.products + assert mt and q and cm is not None and by_temperature and products + + for product in products: + product_name: str = product.name + mode: str = product.emission_mode + at: float = product.yield_at(1.0e6) + # The sum types are `kind`-tagged dictionaries, not classes. + distributions: list[dict[str, Any]] = product.distribution + assert product_name and mode and at and distributions + + +def ace() -> None: + tables: list[_endf.AceTable] = _endf.get_tables("Li6.ace.xz") + table = tables[0] + zaid: int = table.zaid + kt: float = table.kT + nxs: list[int] = table.nxs + xss: list[float] = table.xss + assert zaid and kt and nxs and xss + + neutron = _endf.IncidentNeutron.from_ace(table) + neutron.add_temperature_from_ace(table, "nndc") + removal: _endf.Tabulated1D = neutron.removal_xs("294K", 0.0) + components: list[int] = neutron.reaction_components(1) + assert removal and components + + +def depletion() -> None: + material = _endf.Material("dec-049_In_116m1.endf.xz") + decay = _endf.Decay.from_endf(material) + nuclide: dict[str, Any] = decay.nuclide + modes: list[dict[str, Any]] = decay.modes + assert nuclide and modes + + half_life = decay.half_life + if half_life is not None: + value, uncertainty = half_life + total: float = value + uncertainty + assert total + + yields = _endf.FissionProductYields("synthetic-nfy.endf.xz") + independent: list[dict[str, tuple[float, float]]] = yields.independent + assert independent + energies = yields.energies + if energies is not None: + first: float = energies[0] + assert first + + production: dict[int, list[_endf.RadionuclideProduction]] = ( + _endf.radionuclide_production(material) + ) + for states in production.values(): + for state in states: + zap: int = state.ZAP + excitation: float = state.excitation_energy + assert zap and excitation + + +def names_and_tables() -> None: + gnds: str = _endf.gnds_name(95, 242, 1) + z, a, m = _endf.zam("Am242_m1") + temperature: str = _endf.temperature_str(293.6) + assert gnds and z and a and m is not None and temperature + + # Optional: an unknown MT has no name. + reaction = _endf.reaction_name(16) + if reaction is not None: + upper: str = reaction.upper() + assert upper + + symbols: dict[int, str] = _endf.ATOMIC_SYMBOL + rules: dict[int, list[int]] = _endf.SUM_RULES + schemes: dict[int, str] = _endf.INTERPOLATION_SCHEME + fission: list[int] = _endf.FISSION_MTS + ev: float = _endf.EV_PER_MEV + k: float = _endf.K_BOLTZMANN + assert symbols and rules and schemes and fission and ev and k diff --git a/crates/endf/Cargo.toml b/crates/endf/Cargo.toml new file mode 100644 index 0000000..06cf60f --- /dev/null +++ b/crates/endf/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "endf" +description = "Parser for ENDF-6 formatted evaluated nuclear data files" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "README.md" +keywords = ["endf", "nuclear", "ace", "physics", "parser"] +categories = ["science", "parser-implementations"] +# The parity harness stays in the repository. Its golden dumps are 900 KB and +# the evaluations they name live in `tests/` at the repository root, outside +# this crate, so a published package would carry the dumps without the files +# they refer to and the tests could not run from it anyway. +exclude = ["tests/"] + +# Deliberately dependency-free. This crate is the format layer: consumers that +# need Arrow, Python bindings or a simulation-ready projection build those on +# top rather than paying for them here. +[dependencies] + +# Tests only, and so not a dependency of anything that uses this crate. The +# fixtures and the golden dumps are stored xz-compressed — an evaluation is +# highly repetitive and compresses about six to one — and this reads them. +# Pure Rust, so there is no C toolchain to have. +[dev-dependencies] +lzma-rs = "0.3" diff --git a/crates/endf/README.md b/crates/endf/README.md new file mode 100644 index 0000000..ac2bc9f --- /dev/null +++ b/crates/endf/README.md @@ -0,0 +1,61 @@ +# endf + +A reader for ENDF-6 evaluated nuclear data files and ACE Type 1 tables. + +No dependencies, no `unsafe`, no Python. It describes the formats and nothing +more: a simulation-ready projection of the data — reconstructed resonances, +summed reactions, unionised grids, an Arrow schema — belongs in a consumer +built on top, which is then free to depend on whatever it needs without that +cost reaching everyone who just wants to read a file. + +```rust +use endf::{IncidentNeutron, Interpretation, Material}; + +let material = Material::from_file("n-095_Am_244.endf")?; + +// The whole file, section by section, keyed by (MF, MT). +let capture = material.mf3(102).expect("a capture cross section"); +println!("{} barns at 0.0253 eV", capture.sigma.eval(0.0253)); + +// Or the high-level view the sublibrary calls for. +if let Interpretation::IncidentNeutron(nuclide) = material.interpret()? { + println!("{} has {} reactions", nuclide.name(), nuclide.reactions.len()); +} +# Ok::<(), endf::Error>(()) +``` + +ACE tables are read the same way, and produce the same types: + +```rust +use endf::{get_tables, IncidentNeutron, MetastableScheme}; + +let tables = get_tables("Li6.ace")?; +let nuclide = IncidentNeutron::from_ace(&tables[0], MetastableScheme::default())?; +# Ok::<(), endf::Error>(()) +``` + +## What it reads + +| | | +|---|---| +| ENDF files | MF 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 23, 26, 27, 28, 33, 34, 40 | +| ACE | Type 1 tables: the ESZ, AND, DLW, MTR, LSIG/SIG, TYR and URR blocks | +| Derived | reactions, products and their distributions, incident neutron and photon data, decay data, fission product yields, radionuclide production, depletion chains | + +Each file is read in every representation it defines, not only the ones common +evaluations happen to use. + +## Correctness + +This is a port of [`endf-python`](https://github.com/paulromano/endf-python), +and it is held to it rather than to the ENDF-102 manual alone. The Python +reader dumps every value it produces for each fixture; the Rust reader parses +the same file, builds the same `path -> value` map, and the two are compared +whole — 38,000 values across 28 evaluations and ACE tables, bit for bit, with a +tolerance only where the value is computed rather than parsed. + +See `tests/golden/README.md` for what is covered and what is not. + +## Minimum supported Rust version + +1.74, checked in CI. Raising it is a breaking change. diff --git a/crates/endf/src/ace.rs b/crates/endf/src/ace.rs new file mode 100644 index 0000000..79aacad --- /dev/null +++ b/crates/endf/src/ace.rs @@ -0,0 +1,434 @@ +//! Reading ACE cross section tables. +//! +//! ACE is not ENDF: it is the processed, ready-to-sample form that NJOY writes +//! and transport codes read. The two meet here because several of the package's +//! higher-level types can be built from either. +//! +//! Only Type 1 (ASCII) tables are read. Type 2 (binary) tables are a different +//! on-disk layout and are reported as unsupported rather than misparsed. + +use std::path::Path; + +use crate::data::{gnds_name, ATOMIC_SYMBOL, EV_PER_MEV, K_BOLTZMANN}; +use crate::error::{Error, Result}; + +/// Lines of header before the XSS array begins. +const ACE_HEADER_SIZE: usize = 12; + +/// How a library encodes the metastable state in a ZAID. +/// +/// The plain ZAID, 1000*Z + A, has nowhere to put it, so libraries disagree. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum MetastableScheme { + /// ZAID is 1000*Z + A + 100*m. + #[default] + Nndc, + /// 400 is added for a metastable nuclide, except that 95242 is Am242m and + /// 95642 is the ground state. Newer libraries use an SZA form above + /// 1000000. + Mcnp, +} + +/// What a ZAID identifies. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Metadata { + /// GNDS name, e.g. `"Am242_m1"`. + pub name: String, + /// Atomic symbol, e.g. `"Am"`. + pub element: String, + pub z: u32, + pub mass_number: u32, + pub metastable: u32, +} + +/// Identify the nuclide a ZAID refers to. +pub fn get_metadata(zaid: i64, scheme: MetastableScheme) -> Result { + let mut z = zaid / 1000; + let mut mass_number = zaid % 1000; + + let metastable = match scheme { + MetastableScheme::Mcnp => { + if zaid > 1_000_000 { + // Newer SZA form: the leading digits carry the state. + z %= 1000; + if zaid == 1_095_242 { + 0 + } else { + zaid / 1_000_000 + } + } else if zaid == 95242 { + 1 + } else if zaid == 95642 { + 0 + } else { + i64::from(mass_number > 300) + } + } + MetastableScheme::Nndc => i64::from(mass_number > 300), + }; + + // Undo the offset the state was encoded with, until the mass number is + // physically possible. + while mass_number > 3 * z { + mass_number -= 100; + } + + let element = ATOMIC_SYMBOL + .get(z as usize) + .copied() + .ok_or_else(|| Error::UnknownElement { + symbol: format!("Z={z}"), + })?; + + Ok(Metadata { + name: gnds_name(z as u32, mass_number as u32, metastable as u32), + element: element.to_string(), + z: z as u32, + mass_number: mass_number as u32, + metastable: metastable as u32, + }) +} + +/// The kind of data an ACE table holds, from the letter its suffix ends with. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum TableType { + NeutronContinuous, + NeutronDiscrete, + ThermalScattering, + Dosimetry, + Photoatomic, + Photonuclear, + Proton, + Deuteron, + Triton, + Helium3, + Alpha, +} + +impl TableType { + /// The letter the format uses for this type. + pub fn suffix(self) -> char { + match self { + TableType::NeutronContinuous => 'c', + TableType::NeutronDiscrete => 'd', + TableType::ThermalScattering => 't', + TableType::Dosimetry => 'y', + TableType::Photoatomic => 'p', + TableType::Photonuclear => 'u', + TableType::Proton => 'h', + TableType::Deuteron => 'o', + TableType::Triton => 'r', + TableType::Helium3 => 's', + TableType::Alpha => 'a', + } + } + + /// The type a suffix denotes, e.g. `"70c"` is a continuous neutron table. + pub fn from_suffix(suffix: &str) -> Result { + const ALL: [TableType; 11] = [ + TableType::NeutronContinuous, + TableType::NeutronDiscrete, + TableType::ThermalScattering, + TableType::Dosimetry, + TableType::Photoatomic, + TableType::Photonuclear, + TableType::Proton, + TableType::Deuteron, + TableType::Triton, + TableType::Helium3, + TableType::Alpha, + ]; + ALL.into_iter() + .find(|t| suffix.ends_with(t.suffix())) + .ok_or_else(|| Error::BadAceTable { + what: format!("suffix {suffix:?} has no corresponding ACE table type"), + }) + } +} + +/// One ACE cross section table. +/// +/// `nxs`, `jxs` and `xss` each carry an unused element at index 0, so that the +/// one-based indices the ACE specification uses can be written directly. +#[derive(Debug, Clone, PartialEq)] +pub struct Table { + /// Full identifier, e.g. `"92235.70c"`. + pub name: String, + pub atomic_weight_ratio: f64, + /// Temperature in MeV, as the file stores it. + pub kt: f64, + /// The (IZ, AW) pairs of the header. + pub pairs: Vec<(i64, f64)>, + pub nxs: Vec, + pub jxs: Vec, + pub xss: Vec, +} + +impl Table { + /// The ZAID, the part of the name before the dot. + pub fn zaid(&self) -> Result { + self.name + .split('.') + .next() + .and_then(|s| s.parse().ok()) + .ok_or_else(|| Error::BadAceTable { + what: format!("table name {:?} has no ZAID", self.name), + }) + } + + /// What kind of data this table holds. + pub fn data_type(&self) -> Result { + let suffix = self + .name + .split('.') + .nth(1) + .ok_or_else(|| Error::BadAceTable { + what: format!("table name {:?} has no suffix", self.name), + })?; + TableType::from_suffix(suffix) + } + + /// Temperature in kelvin. + /// + /// [`Table::kt`] is the raw value in MeV; the two differ by more than ten + /// orders of magnitude. + pub fn temperature(&self) -> f64 { + self.kt * EV_PER_MEV / K_BOLTZMANN + } +} + +/// Parse a float as an ACE file writes it. +/// +/// Mostly ordinary, but NJOY drops the `e` from values below 1e-100, writing +/// `1.234567-120`. Unlike an ENDF field this is not fixed-width, so the +/// eleven-character rule of [`crate::records::float_endf`] does not apply. +fn parse_float(s: &str) -> Result { + if let Ok(v) = s.parse::() { + return Ok(v); + } + // Put the exponent marker back: the sign that follows a digit or a point, + // with no marker already present. + let bytes = s.as_bytes(); + for i in 1..bytes.len() { + if (bytes[i] == b'+' || bytes[i] == b'-') + && (bytes[i - 1].is_ascii_digit() || bytes[i - 1] == b'.') + { + let patched = format!("{}e{}", &s[..i], &s[i..]); + if let Ok(v) = patched.parse::() { + return Ok(v); + } + } + } + Err(Error::BadAceTable { + what: format!("{s:?} is not a number"), + }) +} + +fn parse_int(s: &str) -> Result { + s.parse().map_err(|_| Error::BadAceTable { + what: format!("{s:?} is not an integer"), + }) +} + +/// Read every table in an ASCII ACE file. +pub fn get_tables(path: impl AsRef) -> Result> { + let text = std::fs::read_to_string(path)?; + tables_from_str(&text, None) +} + +/// Read one named table, e.g. `"3006.01c"`. +pub fn get_table(path: impl AsRef, name: &str) -> Result { + let text = std::fs::read_to_string(path)?; + let wanted = [name.to_string()]; + tables_from_str(&text, Some(&wanted))? + .into_iter() + .next() + .ok_or_else(|| Error::BadAceTable { + what: format!("no table named {name:?} in the file"), + }) +} + +/// Read tables from the text of an ASCII ACE file. +/// +/// `wanted` restricts which tables are read; `None` reads all of them. +pub fn tables_from_str(text: &str, wanted: Option<&[String]>) -> Result> { + let lines: Vec<&str> = text.lines().collect(); + let mut tables = Vec::new(); + let mut at = 0usize; + + while at < lines.len() && !lines[at].trim().is_empty() { + let header = lines[at]; + let first_word = header.split_whitespace().next().unwrap_or(""); + + // A 2.0-style header opens with a version like "2.0.1", so its second + // character is a dot. A 1.0-style one opens with the table name. + let two_point_zero = first_word.as_bytes().get(1) == Some(&b'.'); + + let (name, atomic_weight_ratio, kt, body) = if two_point_zero { + let words: Vec<&str> = header.split_whitespace().collect(); + let name = words.get(1).copied().unwrap_or("").to_string(); + let second: Vec<&str> = lines + .get(at + 1) + .copied() + .unwrap_or("") + .split_whitespace() + .collect(); + let awr = parse_float(second.first().copied().unwrap_or("0"))?; + let kt = parse_float(second.get(1).copied().unwrap_or("0"))?; + let comment_lines: usize = parse_int(second.get(3).copied().unwrap_or("0"))? as usize; + // The comment lines sit between the 2.0 header and the body that + // is otherwise laid out exactly as the 1.0 form. + (name, awr, kt, at + comment_lines) + } else { + let words: Vec<&str> = header.split_whitespace().collect(); + let name = words.first().copied().unwrap_or("").to_string(); + let awr = parse_float(words.get(1).copied().unwrap_or("0"))?; + let kt = parse_float(words.get(2).copied().unwrap_or("0"))?; + (name, awr, kt, at) + }; + + let line = |i: usize| lines.get(body + i).copied().unwrap_or(""); + + // The (IZ, AW) pairs occupy four lines of four pairs each. + let pair_words: Vec<&str> = (2..6).flat_map(|i| line(i).split_whitespace()).collect(); + let mut pairs = Vec::with_capacity(pair_words.len() / 2); + for chunk in pair_words.chunks(2) { + if chunk.len() == 2 { + pairs.push((parse_int(chunk[0])?, parse_float(chunk[1])?)); + } + } + + // NXS and JXS each get a leading zero so the format's one-based + // indices can be used directly. + let mut nxs = vec![0i64]; + for w in (6..8).flat_map(|i| line(i).split_whitespace()) { + nxs.push(parse_int(w)?); + } + let mut jxs = vec![0i64]; + for w in (8..ACE_HEADER_SIZE).flat_map(|i| line(i).split_whitespace()) { + jxs.push(parse_int(w)?); + } + + let length = nxs.get(1).copied().unwrap_or(0).max(0) as usize; + // Four values to a line. + let n_lines = length.div_ceil(4); + + let skip_this = wanted.is_some_and(|names| !names.iter().any(|n| n == &name)); + if skip_this { + at = body + ACE_HEADER_SIZE + n_lines; + continue; + } + + let mut xss = Vec::with_capacity(length + 1); + xss.push(0.0); + for i in 0..n_lines { + for w in line(ACE_HEADER_SIZE + i).split_whitespace() { + xss.push(parse_float(w)?); + } + } + if xss.len() != length + 1 { + return Err(Error::BadAceTable { + what: format!( + "table {name:?} declares {length} values in XSS but {} were read", + xss.len() - 1 + ), + }); + } + + tables.push(Table { + name, + atomic_weight_ratio, + kt, + pairs, + nxs, + jxs, + xss, + }); + + at = body + ACE_HEADER_SIZE + n_lines; + + // Stop once every requested table has been found. + if let Some(names) = wanted { + if tables.len() == names.len() { + break; + } + } + } + + Ok(tables) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn zaids_are_read_the_way_each_library_encodes_them() { + // Ordinary nuclide, both schemes agree. + let m = get_metadata(3006, MetastableScheme::Nndc).unwrap(); + assert_eq!( + (m.name.as_str(), m.z, m.mass_number, m.metastable), + ("Li6", 3, 6, 0) + ); + assert_eq!(m.element, "Li"); + + // NNDC puts the state in the hundreds digit of A. + let m = get_metadata(95342, MetastableScheme::Nndc).unwrap(); + assert_eq!( + (m.name.as_str(), m.mass_number, m.metastable), + ("Am242_m1", 242, 1) + ); + + // MCNP's two exceptions: 95242 is the metastable one, 95642 the ground + // state, which is the reverse of what the digits suggest. + let m = get_metadata(95242, MetastableScheme::Mcnp).unwrap(); + assert_eq!((m.name.as_str(), m.metastable), ("Am242_m1", 1)); + let m = get_metadata(95642, MetastableScheme::Mcnp).unwrap(); + assert_eq!((m.name.as_str(), m.metastable), ("Am242", 0)); + // And the newer SZA form, where the ground state is spelled out. + let m = get_metadata(1_095_242, MetastableScheme::Mcnp).unwrap(); + assert_eq!((m.name.as_str(), m.metastable), ("Am242", 0)); + } + + #[test] + fn suffixes_map_to_table_types() { + assert_eq!( + TableType::from_suffix("70c").unwrap(), + TableType::NeutronContinuous + ); + assert_eq!( + TableType::from_suffix("12p").unwrap(), + TableType::Photoatomic + ); + assert_eq!( + TableType::from_suffix("00t").unwrap(), + TableType::ThermalScattering + ); + assert!(TableType::from_suffix("70z").is_err()); + } + + #[test] + fn floats_parse_including_the_form_njoy_writes_below_1e_100() { + assert_eq!(parse_float("1.5").unwrap(), 1.5); + assert_eq!(parse_float("-2.5E-3").unwrap(), -2.5e-3); + // NJOY drops the 'e' when the exponent needs three digits. + assert_eq!(parse_float("1.234567-120").unwrap(), 1.234567e-120); + // The exact tokens that made TENDL-2025's Db262 and its neighbours + // unreadable: a three-digit exponent overflows the field NJOY has to + // write it in, so the `e` goes. See issue #20, and + // `tests/synthetic-denormal.ace.xz`, which pins both readers on a + // whole file. + assert_eq!( + parse_float("6.10562372605-318").unwrap(), + 6.10562372605e-318 + ); + assert_eq!( + parse_float("-6.10562372605-318").unwrap(), + -6.10562372605e-318 + ); + // Rounded to the nearest subnormal, as any correct parser does. + assert_eq!(parse_float("9.99999999999-323").unwrap(), 1.0e-322); + assert_eq!(parse_float("-9.8+100").unwrap(), -9.8e100); + assert!(parse_float("banana").is_err()); + } +} diff --git a/crates/endf/src/angle_energy.rs b/crates/endf/src/angle_energy.rs new file mode 100644 index 0000000..b0fd5d9 --- /dev/null +++ b/crates/endf/src/angle_energy.rs @@ -0,0 +1,322 @@ +//! Joint distributions of secondary particle angle and energy. +//! +//! A reaction product's angle and energy may be described independently +//! ([`UncorrelatedAngleEnergy`]), through the Kalbach-Mann systematics +//! ([`KalbachMann`]), as an angular distribution conditional on the outgoing +//! energy ([`CorrelatedAngleEnergy`]), or by N-body phase space kinematics +//! ([`NBodyPhaseSpace`]). +//! +//! These are the processed forms an ACE table holds. The ENDF equivalents live +//! in [`crate::mf::mf6`], which describes the file rather than interpreting it. + +use crate::ace::Table; +use crate::error::{Error, Result}; +use crate::function::Tabulated1D; +use crate::mf::mf4::AngleDistribution; +use crate::mf::mf5::{ace_incident_grid, ace_outgoing_energy, EnergyDistribution}; +use crate::univariate::{Interpolation, Tabular, Uniform, Univariate}; + +/// A distribution in secondary angle and energy. +#[derive(Debug, Clone, PartialEq)] +pub enum AngleEnergy { + Uncorrelated(UncorrelatedAngleEnergy), + KalbachMann(KalbachMann), + Correlated(CorrelatedAngleEnergy), + NBodyPhaseSpace(NBodyPhaseSpace), +} + +/// Angle and energy sampled independently of each other. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct UncorrelatedAngleEnergy { + /// The outgoing angle, when one is given here rather than in the AND block. + pub angle: Option, + /// The outgoing energy. + pub energy: Option, +} + +/// Kalbach-Mann systematics. +/// +/// The outgoing energy is tabulated, and the angular distribution at each +/// outgoing energy follows from a precompound fraction and a slope. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct KalbachMann { + pub breakpoints: Vec, + pub interpolation: Vec, + /// Incident energies in eV. + pub energy: Vec, + /// The outgoing energy distribution at each incident energy. + pub energy_out: Vec, + /// The precompound fraction `r` against outgoing energy, one per incident + /// energy. + pub precompound: Vec, + /// The Kalbach-Chadwick slope `a`, likewise. + pub slope: Vec, +} + +/// An angular distribution given for each outgoing energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct CorrelatedAngleEnergy { + pub breakpoints: Vec, + pub interpolation: Vec, + /// Incident energies in eV. + pub energy: Vec, + /// The outgoing energy distribution at each incident energy. + pub energy_out: Vec, + /// The scattering cosine for each pair of incident and outgoing energies. + pub mu: Vec>, +} + +/// N-body phase space kinematics. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct NBodyPhaseSpace { + /// Total mass of the product particles. + pub total_mass: f64, + pub n_particles: i64, + /// Of the target nuclide. + pub atomic_weight_ratio: f64, + /// The reaction Q value in eV. + pub q_value: f64, +} + +impl AngleEnergy { + /// Read an angle-energy distribution from an ACE table. + /// + /// `location_dist` is the start of the block holding it, e.g. JXS(11) for + /// DLW; `location_start` is the one-based offset of this reaction's array + /// within it. `q_reaction` is needed only by law 66. + pub fn from_ace( + table: &Table, + location_dist: i64, + location_start: i64, + q_reaction: Option, + ) -> Result { + let xss = &table.xss; + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| xss.get(i).copied()) + .unwrap_or(0.0) + }; + + let idx = location_dist + location_start - 1; + let law = at(idx + 1) as i64; + let location_data = at(idx + 2) as i64; + + // Where this law's own parameters begin. + let idx = (location_dist + location_data - 1).max(0) as usize; + + let uncorrelated = |energy: EnergyDistribution| { + AngleEnergy::Uncorrelated(UncorrelatedAngleEnergy { + angle: None, + energy: Some(energy), + }) + }; + + Ok(match law { + 2 => uncorrelated(EnergyDistribution::discrete_photon_from_ace(table, idx)), + 3 | 33 => uncorrelated(EnergyDistribution::level_inelastic_from_ace(xss, idx)), + 4 => uncorrelated(EnergyDistribution::continuous_tabular_from_ace( + xss, + idx, + location_dist, + )?), + // Law 5 is the general evaporation spectrum, which neither this + // reader nor the Python one nor OpenMC implements. Both of those + // now raise NotImplementedError; this is the same refusal. See + // issue #19. + 5 => { + return Err(Error::Unsupported { + what: "ACE law 5, the general evaporation spectrum", + }) + } + 7 => uncorrelated(EnergyDistribution::maxwell_from_ace(xss, idx)), + 9 => uncorrelated(EnergyDistribution::evaporation_from_ace(xss, idx)), + 11 => uncorrelated(EnergyDistribution::watt_from_ace(xss, idx)), + 44 => AngleEnergy::KalbachMann(KalbachMann::from_ace(xss, idx, location_dist)?), + 61 => { + AngleEnergy::Correlated(CorrelatedAngleEnergy::from_ace(xss, idx, location_dist)?) + } + 66 => { + let q_value = q_reaction.ok_or(Error::Unsupported { + what: "ACE law 66 without the reaction it belongs to", + })?; + AngleEnergy::NBodyPhaseSpace(NBodyPhaseSpace::from_ace(table, idx, q_value)) + } + _ => { + return Err(Error::Unsupported { + what: "this ACE secondary energy distribution law", + }) + } + }) + } +} + +impl KalbachMann { + /// Read a Kalbach-Mann distribution from an ACE table's XSS array. + /// + /// `idx` is where the law's data begins (`LDIS + LOCC - 1`) and `ldis` the + /// start of the energy distribution block. + pub fn from_ace(xss: &[f64], idx: usize, ldis: i64) -> Result { + let grid = ace_incident_grid(xss, idx); + + let n = grid.energy.len(); + let mut energy_out = Vec::with_capacity(n); + let mut precompound = Vec::with_capacity(n); + let mut slope = Vec::with_capacity(n); + for &loc in &grid.loc_dist { + let idx = (ldis + loc - 1).max(0) as usize; + // Five columns: the usual three, then `r` and `a`. + let out = ace_outgoing_energy(xss, idx, 5)?; + precompound.push(Tabulated1D::new(out.data[0].clone(), out.data[3].clone())); + slope.push(Tabulated1D::new(out.data[0].clone(), out.data[4].clone())); + energy_out.push(out.distribution); + } + + Ok(KalbachMann { + breakpoints: grid.breakpoints, + interpolation: grid.interpolation, + energy: grid.energy, + energy_out, + precompound, + slope, + }) + } +} + +impl CorrelatedAngleEnergy { + /// Read a correlated angle-energy distribution from an ACE table's XSS + /// array. The arguments are as for [`KalbachMann::from_ace`]. + pub fn from_ace(xss: &[f64], idx: usize, ldis: i64) -> Result { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + let grid = ace_incident_grid(xss, idx); + + let n = grid.energy.len(); + let mut energy_out = Vec::with_capacity(n); + let mut mu = Vec::with_capacity(n); + for &loc in &grid.loc_dist { + let idx = (ldis + loc - 1).max(0) as usize; + // Four columns: the usual three, then a locator per outgoing + // energy. + let out = ace_outgoing_energy(xss, idx, 4)?; + + let mut mu_i = Vec::with_capacity(out.data[3].len()); + for &lc in &out.data[3] { + let lc = lc as i64; + // Zero, and anything negative, means isotropic. + if lc <= 0 { + mu_i.push(Univariate::Uniform(Uniform::new(-1.0, 1.0))); + continue; + } + let idx = (ldis + lc.abs() - 1).max(0) as usize; + let intt = at(idx) as i32; + let n_cosine = at(idx + 1) as usize; + let col = |row: usize| -> Vec { + (0..n_cosine) + .map(|k| at(idx + 2 + row * n_cosine + k)) + .collect() + }; + mu_i.push(Univariate::Tabular(Tabular::with_cdf( + col(0), + col(1), + Interpolation::from_endf_code(intt)?, + col(2), + ))); + } + + energy_out.push(out.distribution); + mu.push(mu_i); + } + + Ok(CorrelatedAngleEnergy { + breakpoints: grid.breakpoints, + interpolation: grid.interpolation, + energy: grid.energy, + energy_out, + mu, + }) + } +} + +impl NBodyPhaseSpace { + /// Read an N-body phase space distribution from an ACE table. + pub fn from_ace(table: &Table, idx: usize, q_value: f64) -> NBodyPhaseSpace { + let at = |i: usize| table.xss.get(i).copied().unwrap_or(0.0); + NBodyPhaseSpace { + n_particles: at(idx) as i64, + total_mass: at(idx + 1), + atomic_weight_ratio: table.atomic_weight_ratio, + q_value, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ace; + + /// The smallest table that reaches the law dispatch: with + /// `LDIS + LOCC - 1 = 0`, the law sits at index 1 and its data locator at + /// index 2. + fn table_with_law(law: f64) -> ace::Table { + ace::Table { + name: "1001.00c".into(), + atomic_weight_ratio: 1.0, + kt: 0.0, + pairs: Vec::new(), + nxs: vec![0; 17], + jxs: vec![0; 33], + xss: vec![0.0, law, 1.0], + } + } + + /// Walk the DLW linked list for one reaction, as `Reaction::from_ace` + /// does: LDLW (JXS(10)) gives the first locator, and each distribution's + /// own first word points at the next one for the same reaction. + fn dlw_chain(t: &ace::Table, i_reaction: usize) -> Vec { + let (ldlw, dlw) = (t.jxs[10], t.jxs[11]); + let mut chain = Vec::new(); + let mut lnw = t.xss[ldlw as usize + i_reaction - 1] as i64; + while lnw > 0 { + chain.push(lnw); + lnw = t.xss[(dlw + lnw - 1) as usize] as i64; + } + chain + } + + #[test] + fn reads_every_distribution_li6_holds() { + let tables = crate::testdata::ace_tables(crate::testdata::LI6_ACE); + let t = &tables[0]; + + let mut seen = 0; + for i_reaction in 1..=t.nxs[5] as usize { + for loc in dlw_chain(t, i_reaction) { + let dist = AngleEnergy::from_ace(t, t.jxs[11], loc, Some(0.0)) + .expect("every law in this table is one the reader knows"); + // Whatever the shape, it has to carry something. + match dist { + AngleEnergy::Uncorrelated(u) => assert!(u.energy.is_some()), + AngleEnergy::KalbachMann(k) => assert!(!k.energy.is_empty()), + AngleEnergy::Correlated(c) => assert!(!c.energy.is_empty()), + AngleEnergy::NBodyPhaseSpace(n) => assert!(n.n_particles > 0), + } + seen += 1; + } + } + assert!(seen >= t.nxs[5] as usize); + } + + #[test] + fn an_unknown_law_is_refused() { + // A block whose law is 99: with LDIS + LOCC - 1 = 0, the law sits at + // index 1 and the data locator at index 2. + assert!(AngleEnergy::from_ace(&table_with_law(99.0), 0, 1, None).is_err()); + } + + #[test] + fn law_5_reports_the_gap_rather_than_guessing() { + // The Python reader dies with an AttributeError here; see issue #19. + assert!(AngleEnergy::from_ace(&table_with_law(5.0), 0, 1, None).is_err()); + } +} diff --git a/crates/endf/src/chain.rs b/crates/endf/src/chain.rs new file mode 100644 index 0000000..b1417d0 --- /dev/null +++ b/crates/endf/src/chain.rs @@ -0,0 +1,1378 @@ +//! Depletion chains: which nuclides turn into which, and how fast. +//! +//! Built from three sub-libraries at once — decay, fission product yields and +//! neutron reactions — because a chain is the join of all three: what a +//! nuclide decays into, what a neutron turns it into, and what its fission +//! leaves behind. +//! +//! The XML serialisation and the burnup matrix of the Python package are not +//! here. Neither reads a nuclear data format: one needs an XML writer and the +//! other sparse linear algebra, and both belong in a consumer. + +use std::collections::BTreeMap; + +use crate::data::{gnds_name, zam, ATOMIC_SYMBOL}; +use crate::decay::{Decay, FissionProductYields}; +use crate::error::{Error, Result}; +use crate::material::Material; +use crate::reaction::FISSION_MTS; + +/// One transmutation reaction: which MTs mean it, what it does to the mass and +/// atomic numbers, and what else comes out. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ReactionInfo { + /// The reaction's name, e.g. `"(n,2n)"`. + pub name: &'static str, + /// Every MT that means this reaction. More than one where the format + /// numbers the levels separately. + pub mts: &'static [i32], + /// Change in the mass number. + pub delta_a: i64, + /// Change in the atomic number. + pub delta_z: i64, + /// The light nuclides emitted alongside. + pub secondaries: &'static [&'static str], +} + +/// Every transmutation reaction a chain can follow. +pub const REACTIONS: [ReactionInfo; 84] = [ + ReactionInfo { + name: "(n,2nd)", + mts: &[11], + delta_a: -3, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,2n)", + mts: &[ + 16, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + ], + delta_a: -1, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,3n)", + mts: &[17], + delta_a: -2, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,na)", + mts: &[22], + delta_a: -4, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,n3a)", + mts: &[23], + delta_a: -12, + delta_z: -6, + secondaries: &["He4", "He4", "He4"], + }, + ReactionInfo { + name: "(n,2na)", + mts: &[24], + delta_a: -5, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,3na)", + mts: &[25], + delta_a: -6, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,np)", + mts: &[28], + delta_a: -1, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,n2a)", + mts: &[29], + delta_a: -8, + delta_z: -4, + secondaries: &["He4", "He4"], + }, + ReactionInfo { + name: "(n,2n2a)", + mts: &[30], + delta_a: -9, + delta_z: -4, + secondaries: &["He4", "He4"], + }, + ReactionInfo { + name: "(n,nd)", + mts: &[32], + delta_a: -2, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,nt)", + mts: &[33], + delta_a: -3, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,n3He)", + mts: &[34], + delta_a: -3, + delta_z: -2, + secondaries: &["He3"], + }, + ReactionInfo { + name: "(n,nd2a)", + mts: &[35], + delta_a: -10, + delta_z: -5, + secondaries: &["H2", "He4", "He4"], + }, + ReactionInfo { + name: "(n,nt2a)", + mts: &[36], + delta_a: -11, + delta_z: -5, + secondaries: &["H3", "He4", "He4"], + }, + ReactionInfo { + name: "(n,4n)", + mts: &[37], + delta_a: -3, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,2np)", + mts: &[41], + delta_a: -2, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,3np)", + mts: &[42], + delta_a: -3, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,n2p)", + mts: &[44], + delta_a: -2, + delta_z: -2, + secondaries: &["H1", "H1"], + }, + ReactionInfo { + name: "(n,npa)", + mts: &[45], + delta_a: -5, + delta_z: -3, + secondaries: &["H1", "He4"], + }, + ReactionInfo { + name: "(n,gamma)", + mts: &[102], + delta_a: 1, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,p)", + mts: &[ + 103, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + ], + delta_a: 0, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,d)", + mts: &[ + 104, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + ], + delta_a: -1, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,t)", + mts: &[ + 105, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + ], + delta_a: -2, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,3He)", + mts: &[ + 106, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, + 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, + ], + delta_a: -2, + delta_z: -2, + secondaries: &["He3"], + }, + ReactionInfo { + name: "(n,a)", + mts: &[ + 107, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, + 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + ], + delta_a: -3, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,2a)", + mts: &[108], + delta_a: -7, + delta_z: -4, + secondaries: &["He4", "He4"], + }, + ReactionInfo { + name: "(n,3a)", + mts: &[109], + delta_a: -11, + delta_z: -6, + secondaries: &["He4", "He4", "He4"], + }, + ReactionInfo { + name: "(n,2p)", + mts: &[111], + delta_a: -1, + delta_z: -2, + secondaries: &["H1", "H1"], + }, + ReactionInfo { + name: "(n,pa)", + mts: &[112], + delta_a: -4, + delta_z: -3, + secondaries: &["H1", "He4"], + }, + ReactionInfo { + name: "(n,t2a)", + mts: &[113], + delta_a: -10, + delta_z: -5, + secondaries: &["H3", "He4", "He4"], + }, + ReactionInfo { + name: "(n,d2a)", + mts: &[114], + delta_a: -9, + delta_z: -5, + secondaries: &["H2", "He4", "He4"], + }, + ReactionInfo { + name: "(n,pd)", + mts: &[115], + delta_a: -2, + delta_z: -2, + secondaries: &["H1", "H2"], + }, + ReactionInfo { + name: "(n,pt)", + mts: &[116], + delta_a: -3, + delta_z: -2, + secondaries: &["H1", "H3"], + }, + ReactionInfo { + name: "(n,da)", + mts: &[117], + delta_a: -5, + delta_z: -3, + secondaries: &["H2", "He4"], + }, + ReactionInfo { + name: "(n,5n)", + mts: &[152], + delta_a: -4, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,6n)", + mts: &[153], + delta_a: -5, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,2nt)", + mts: &[154], + delta_a: -4, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,ta)", + mts: &[155], + delta_a: -6, + delta_z: -3, + secondaries: &["H3", "He4"], + }, + ReactionInfo { + name: "(n,4np)", + mts: &[156], + delta_a: -4, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,3nd)", + mts: &[157], + delta_a: -4, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,nda)", + mts: &[158], + delta_a: -6, + delta_z: -3, + secondaries: &["H2", "He4"], + }, + ReactionInfo { + name: "(n,2npa)", + mts: &[159], + delta_a: -6, + delta_z: -3, + secondaries: &["H1", "He4"], + }, + ReactionInfo { + name: "(n,7n)", + mts: &[160], + delta_a: -6, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,8n)", + mts: &[161], + delta_a: -7, + delta_z: 0, + secondaries: &[], + }, + ReactionInfo { + name: "(n,5np)", + mts: &[162], + delta_a: -5, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,6np)", + mts: &[163], + delta_a: -6, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,7np)", + mts: &[164], + delta_a: -7, + delta_z: -1, + secondaries: &["H1"], + }, + ReactionInfo { + name: "(n,4na)", + mts: &[165], + delta_a: -7, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,5na)", + mts: &[166], + delta_a: -8, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,6na)", + mts: &[167], + delta_a: -9, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,7na)", + mts: &[168], + delta_a: -10, + delta_z: -2, + secondaries: &["He4"], + }, + ReactionInfo { + name: "(n,4nd)", + mts: &[169], + delta_a: -5, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,5nd)", + mts: &[170], + delta_a: -6, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,6nd)", + mts: &[171], + delta_a: -7, + delta_z: -1, + secondaries: &["H2"], + }, + ReactionInfo { + name: "(n,3nt)", + mts: &[172], + delta_a: -5, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,4nt)", + mts: &[173], + delta_a: -6, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,5nt)", + mts: &[174], + delta_a: -7, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,6nt)", + mts: &[175], + delta_a: -8, + delta_z: -1, + secondaries: &["H3"], + }, + ReactionInfo { + name: "(n,2n3He)", + mts: &[176], + delta_a: -4, + delta_z: -2, + secondaries: &["He3"], + }, + ReactionInfo { + name: "(n,3n3He)", + mts: &[177], + delta_a: -5, + delta_z: -2, + secondaries: &["He3"], + }, + ReactionInfo { + name: "(n,4n3He)", + mts: &[178], + delta_a: -6, + delta_z: -2, + secondaries: &["He3"], + }, + ReactionInfo { + name: "(n,3n2p)", + mts: &[179], + delta_a: -4, + delta_z: -2, + secondaries: &["H1", "H1"], + }, + ReactionInfo { + name: "(n,3n2a)", + mts: &[180], + delta_a: -10, + delta_z: -4, + secondaries: &["He4", "He4"], + }, + ReactionInfo { + name: "(n,3npa)", + mts: &[181], + delta_a: -7, + delta_z: -3, + secondaries: &["H1", "He4"], + }, + ReactionInfo { + name: "(n,dt)", + mts: &[182], + delta_a: -4, + delta_z: -2, + secondaries: &["H2", "H3"], + }, + ReactionInfo { + name: "(n,npd)", + mts: &[183], + delta_a: -3, + delta_z: -2, + secondaries: &["H1", "H2"], + }, + ReactionInfo { + name: "(n,npt)", + mts: &[184], + delta_a: -4, + delta_z: -2, + secondaries: &["H1", "H3"], + }, + ReactionInfo { + name: "(n,ndt)", + mts: &[185], + delta_a: -5, + delta_z: -2, + secondaries: &["H2", "H3"], + }, + ReactionInfo { + name: "(n,np3He)", + mts: &[186], + delta_a: -4, + delta_z: -3, + secondaries: &["H1", "He3"], + }, + ReactionInfo { + name: "(n,nd3He)", + mts: &[187], + delta_a: -5, + delta_z: -3, + secondaries: &["H2", "He3"], + }, + ReactionInfo { + name: "(n,nt3He)", + mts: &[188], + delta_a: -6, + delta_z: -3, + secondaries: &["H3", "He3"], + }, + ReactionInfo { + name: "(n,nta)", + mts: &[189], + delta_a: -7, + delta_z: -3, + secondaries: &["H3", "He4"], + }, + ReactionInfo { + name: "(n,2n2p)", + mts: &[190], + delta_a: -3, + delta_z: -2, + secondaries: &["H1", "H1"], + }, + ReactionInfo { + name: "(n,p3He)", + mts: &[191], + delta_a: -4, + delta_z: -3, + secondaries: &["H1", "He3"], + }, + ReactionInfo { + name: "(n,d3He)", + mts: &[192], + delta_a: -5, + delta_z: -3, + secondaries: &["H2", "He3"], + }, + ReactionInfo { + name: "(n,3Hea)", + mts: &[193], + delta_a: -6, + delta_z: -4, + secondaries: &["He3", "He4"], + }, + ReactionInfo { + name: "(n,4n2p)", + mts: &[194], + delta_a: -5, + delta_z: -2, + secondaries: &["H1", "H1"], + }, + ReactionInfo { + name: "(n,4n2a)", + mts: &[195], + delta_a: -11, + delta_z: -4, + secondaries: &["He4", "He4"], + }, + ReactionInfo { + name: "(n,4npa)", + mts: &[196], + delta_a: -8, + delta_z: -3, + secondaries: &["H1", "He4"], + }, + ReactionInfo { + name: "(n,3p)", + mts: &[197], + delta_a: -2, + delta_z: -3, + secondaries: &["H1", "H1", "H1"], + }, + ReactionInfo { + name: "(n,n3p)", + mts: &[198], + delta_a: -3, + delta_z: -3, + secondaries: &["H1", "H1", "H1"], + }, + ReactionInfo { + name: "(n,3n2pa)", + mts: &[199], + delta_a: -8, + delta_z: -4, + secondaries: &["H1", "H1", "He4"], + }, + ReactionInfo { + name: "(n,5n2p)", + mts: &[200], + delta_a: -6, + delta_z: -2, + secondaries: &["H1", "H1"], + }, +]; + +/// The reactions a chain includes unless told otherwise. Fission is always +/// included where the evaluation has it. +pub const DEFAULT_REACTIONS: [&str; 6] = + ["(n,2n)", "(n,3n)", "(n,4n)", "(n,gamma)", "(n,p)", "(n,a)"]; + +/// Look a reaction up by name. +pub fn reaction_info(name: &str) -> Option<&'static ReactionInfo> { + REACTIONS.iter().find(|r| r.name == name) +} + +/// Scale evaluated decay branching ratios so they sum to one. +/// +/// Evaluated ratios often miss unity by a little. The residual goes into the +/// *largest* branch, which it perturbs fractionally least; putting it in an +/// arbitrary branch instead can move a 1e-9 branch by orders of magnitude. +/// Ratios that already sum to one are left exactly as evaluated. +pub fn normalise_branch_ratios(branch_ratios: &mut [f64]) { + if branch_ratios.is_empty() { + return; + } + let total: f64 = branch_ratios.iter().sum(); + // The same closeness test Python's `math.isclose` makes by default. + let close = (total - 1.0).abs() <= 1e-9 * total.abs().max(1.0); + if close { + return; + } + let (i, &max) = + branch_ratios + .iter() + .enumerate() + .fold((0, &branch_ratios[0]), |(bi, bv), (i, v)| { + if v > bv { + (i, v) + } else { + (bi, bv) + } + }); + branch_ratios[i] = max - total + 1.0; +} + +/// One decay path out of a nuclide. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DecayPath { + /// The chain of modes, joined with commas as the chain format writes it. + pub kind: String, + /// The nuclide left behind. `None` where the product is a bare neutron. + pub target: Option, + pub branching_ratio: f64, +} + +/// One neutron-induced path out of a nuclide. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ReactionPath { + /// The reaction's name, or `"fission"`. + pub kind: String, + /// The nuclide left behind. `None` for fission, which has no single one. + pub target: Option, + /// Q value in eV. + pub q_value: f64, + pub branching_ratio: f64, +} + +/// Fission yields at one incident energy, by product name. +pub type FissionYields = BTreeMap; + +/// One nuclide's place in a chain. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Nuclide { + /// GNDS name, e.g. `"Am242_m1"`. + pub name: String, + /// Half-life in seconds. `None` for a stable nuclide. + pub half_life: Option, + /// Average energy per decay in eV. + pub decay_energy: f64, + pub decay_modes: Vec, + pub reactions: Vec, + /// Fission yields by incident energy in eV. Empty when the nuclide does + /// not fission, or when its yields are borrowed from another nuclide. + pub yield_data: BTreeMap, + /// The nuclide whose yields stand in for this one's, where the library has + /// none of its own. + pub borrowed_yields_from: Option, +} + +impl Nuclide { + pub fn new(name: &str) -> Nuclide { + Nuclide { + name: name.to_string(), + ..Default::default() + } + } + + /// Everything that does not add up, at the given tolerance. + /// + /// Decay branching ratios sum to one, the branches of each reaction sum to + /// one, and fission yields sum to two — two fragments per fission. An + /// empty result means the nuclide is consistent. + pub fn validate(&self, tolerance: f64) -> Vec { + let mut problems = Vec::new(); + let mut check = |property: &str, actual: f64, expected: f64| { + if !(expected - tolerance..=expected + tolerance).contains(&actual) { + problems.push(format!( + "Nuclide {} has {property} that sum to {actual} instead of \ + {expected} +/- {tolerance:7.4e}", + self.name + )); + } + }; + + if !self.decay_modes.is_empty() { + let total: f64 = self.decay_modes.iter().map(|m| m.branching_ratio).sum(); + check("decay mode branch ratios", total, 1.0); + } + + // Each reaction's branches are their own sum, so a nuclide with two + // reactions is not expected to sum to two. + let mut kinds: Vec<&str> = self.reactions.iter().map(|r| r.kind.as_str()).collect(); + kinds.sort_unstable(); + kinds.dedup(); + for kind in kinds { + let total: f64 = self + .reactions + .iter() + .filter(|r| r.kind == kind) + .map(|r| r.branching_ratio) + .sum(); + check(&format!("{kind} reaction branch ratios"), total, 1.0); + } + + for (energy, yields) in &self.yield_data { + let total: f64 = yields.values().sum(); + check(&format!("fission yields (E = {energy} eV)"), total, 2.0); + } + + problems + } + + /// The incident energies the fission yields are given at, in eV. + /// + /// The keys are the energies formatted as the Python package writes them, + /// so they order as text; this gives them back as numbers. + pub fn yield_energies(&self) -> Vec { + let mut out: Vec = self + .yield_data + .keys() + .filter_map(|k| k.parse().ok()) + .collect(); + out.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + out + } +} + +/// A depletion chain: every nuclide, and the paths between them. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Chain { + pub nuclides: Vec, +} + +impl Chain { + pub fn new() -> Chain { + Chain::default() + } + + pub fn contains(&self, name: &str) -> bool { + self.nuclides.iter().any(|n| n.name == name) + } + + pub fn get(&self, name: &str) -> Option<&Nuclide> { + self.nuclides.iter().find(|n| n.name == name) + } + + pub fn len(&self) -> usize { + self.nuclides.len() + } + + pub fn is_empty(&self) -> bool { + self.nuclides.is_empty() + } + + /// Build a chain from decay, fission product yield and neutron + /// evaluations. + /// + /// `reactions` names the transmutation reactions to follow; pass + /// [`DEFAULT_REACTIONS`] for the usual set. Fission is always followed + /// where an evaluation has it. + pub fn from_endf( + decay: &[Material], + fpy: &[Material], + neutron: &[Material], + reactions: &[&str], + ) -> Result { + // What each target's neutron evaluation says each channel's Q value + // is. QI is the Q of the channel actually populated; QM, the + // mass-difference Q, is not the same thing and a few evaluations give + // it with the opposite sign. + let mut q_values: BTreeMap> = BTreeMap::new(); + for material in neutron { + let Some(meta) = material.mf1_mt451() else { + continue; + }; + let (z, a) = (meta.za / 1000, meta.za % 1000); + let name = gnds_name(z as u32, a as u32, meta.liso as u32); + let entry = q_values.entry(name).or_default(); + for &(mf, mt) in material.section_data.keys() { + if mf == 3 { + if let Some(section) = material.mf3(mt) { + entry.insert(mt, section.qi); + } + } + } + } + + let mut decay_data: BTreeMap = BTreeMap::new(); + for material in decay { + let data = Decay::from_material(material)?; + // The neutron's own decay data is not a chain nuclide. + if data.nuclide.atomic_number == 0 { + continue; + } + decay_data.insert(data.nuclide.name.clone(), data); + } + + let mut fpy_data: BTreeMap = BTreeMap::new(); + for material in fpy { + let Some(meta) = material.mf1_mt451() else { + continue; + }; + let (z, a) = (meta.za / 1000, meta.za % 1000); + let name = gnds_name(z as u32, a as u32, meta.liso as u32); + fpy_data.insert(name, FissionProductYields::from_material(material)?); + } + + // Nuclides come out ordered by Z, then A, then metastable state, which + // is what `zam` gives. + let mut parents: Vec<&String> = decay_data.keys().collect(); + parents.sort_by_key(|name| zam(name).unwrap_or((0, 0, 0))); + + let mut chain = Chain::new(); + for parent in parents { + let data = &decay_data[parent]; + let mut nuclide = Nuclide::new(parent); + + let half_life = data.half_life.map(|(t, _)| t).unwrap_or(0.0); + if !data.nuclide.stable && half_life != 0.0 { + nuclide.half_life = Some(half_life); + nuclide.decay_energy = data.decay_energy().0; + + let mut ratios: Vec = Vec::new(); + let mut ids: Vec<(String, Option)> = Vec::new(); + for mode in &data.modes { + let daughter = mode.daughter(); + let target = match &daughter { + Some(d) if decay_data.contains_key(d) => Some(d.clone()), + Some(d) => replace_missing(d, &decay_data), + None => None, + }; + ratios.push(mode.branching_ratio.0); + ids.push((mode.modes.join(","), target)); + } + normalise_branch_ratios(&mut ratios); + for (ratio, (kind, target)) in ratios.into_iter().zip(ids) { + nuclide.decay_modes.push(DecayPath { + kind, + target, + branching_ratio: ratio, + }); + } + } + + let mut fissionable = false; + if let Some(available) = q_values.get(parent) { + for name in reactions { + let Some(info) = reaction_info(name) else { + continue; + }; + if !info.mts.iter().any(|mt| available.contains_key(mt)) { + continue; + } + let a = data.nuclide.mass_number + info.delta_a; + let z = data.nuclide.atomic_number + info.delta_z; + let symbol = ATOMIC_SYMBOL.get(z as usize).copied().unwrap_or("?"); + let mut daughter = Some(format!("{symbol}{a}")); + if let Some(d) = &daughter { + if !decay_data.contains_key(d) { + daughter = replace_missing(d, &decay_data); + } + } + + // The first MT of the reaction that the evaluation has. + let q_value = info + .mts + .iter() + .find_map(|mt| available.get(mt).copied()) + .unwrap_or(0.0); + + nuclide.reactions.push(ReactionPath { + kind: name.to_string(), + target: daughter, + q_value, + branching_ratio: 1.0, + }); + } + + if FISSION_MTS.iter().any(|mt| available.contains_key(mt)) { + nuclide.reactions.push(ReactionPath { + kind: "fission".to_string(), + target: None, + q_value: available.get(&18).copied().unwrap_or(0.0), + branching_ratio: 1.0, + }); + fissionable = true; + } + } + + if fissionable { + match fpy_data.get(parent) { + Some(fpy) => { + let energies: Vec = if fpy.energies.is_empty() { + vec![0.0] + } else { + fpy.energies.clone() + }; + for (energy, table) in energies.iter().zip(&fpy.independent) { + let mut yields: FissionYields = BTreeMap::new(); + for product in table { + let name = if decay_data.contains_key(&product.name) { + Some(product.name.clone()) + } else { + replace_missing(&product.name, &decay_data) + }; + // A product with no stand-in — a bare neutron + // — is dropped rather than named. + if let Some(name) = name { + *yields.entry(name).or_insert(0.0) += product.yield_.0; + } + } + nuclide.yield_data.insert(energy_key(*energy), yields); + } + } + None => { + nuclide.borrowed_yields_from = + Some(replace_missing_fpy(parent, &fpy_data, &decay_data)); + } + } + } + + chain.nuclides.push(nuclide); + } + + // Fill in the borrowed yields, now that every nuclide exists. + let borrowed: Vec<(usize, String)> = chain + .nuclides + .iter() + .enumerate() + .filter_map(|(i, n)| n.borrowed_yields_from.clone().map(|from| (i, from))) + .collect(); + for (i, from) in borrowed { + if let Some(source) = chain.get(&from) { + let yields = source.yield_data.clone(); + chain.nuclides[i].yield_data = yields; + } + } + + Ok(chain) + } + + /// The branching ratios of one reaction, by parent and target. + pub fn branch_ratios(&self, reaction: &str) -> BTreeMap> { + let mut out = BTreeMap::new(); + for nuclide in &self.nuclides { + let branches: BTreeMap = nuclide + .reactions + .iter() + .filter(|r| r.kind == reaction) + .filter_map(|r| r.target.clone().map(|t| (t, r.branching_ratio))) + .collect(); + if !branches.is_empty() { + out.insert(nuclide.name.clone(), branches); + } + } + out + } + + /// Set the branching ratios of one reaction. + /// + /// Every branch of that reaction on the named parents is replaced. A + /// parent not in the chain is an error rather than silently ignored: the + /// caller has the wrong chain or the wrong name. + pub fn set_branch_ratios( + &mut self, + branch_ratios: &BTreeMap>, + reaction: &str, + ) -> Result<()> { + for (parent, branches) in branch_ratios { + let Some(nuclide) = self.nuclides.iter_mut().find(|n| &n.name == parent) else { + return Err(Error::BadNuclideName { + name: parent.clone(), + }); + }; + let q_value = nuclide + .reactions + .iter() + .find(|r| r.kind == reaction) + .map(|r| r.q_value) + .unwrap_or(0.0); + nuclide.reactions.retain(|r| r.kind != reaction); + for (target, &ratio) in branches { + nuclide.reactions.push(ReactionPath { + kind: reaction.to_string(), + target: Some(target.clone()), + q_value, + branching_ratio: ratio, + }); + } + } + Ok(()) + } + + /// Everything in the chain that does not add up, nuclide by nuclide. + /// + /// An empty result means every branching ratio and yield is consistent. + pub fn validate(&self, tolerance: f64) -> Vec { + self.nuclides + .iter() + .flat_map(|n| n.validate(tolerance)) + .collect() + } + + /// The chain reachable from a set of starting nuclides. + /// + /// `level` bounds how many steps to follow; `None` follows to the end. + /// Nuclides outside the reduced set keep their paths only where the target + /// is also inside it, so the result is closed. + pub fn reduce(&self, initial: &[&str], level: Option) -> Chain { + let mut reachable: Vec = Vec::new(); + let mut frontier: Vec = initial.iter().map(|s| s.to_string()).collect(); + let mut depth = 0; + while !frontier.is_empty() && level.map_or(true, |l| depth <= l) { + let mut next = Vec::new(); + for name in frontier { + if reachable.contains(&name) || !self.contains(&name) { + continue; + } + reachable.push(name.clone()); + let nuclide = self.get(&name).expect("just checked"); + for target in nuclide + .decay_modes + .iter() + .filter_map(|m| m.target.clone()) + .chain(nuclide.reactions.iter().filter_map(|r| r.target.clone())) + { + next.push(target); + } + } + frontier = next; + depth += 1; + } + + let mut out = Chain::new(); + for name in &reachable { + let mut nuclide = self.get(name).expect("reachable").clone(); + nuclide.decay_modes.retain(|m| match &m.target { + Some(t) => reachable.contains(t), + None => true, + }); + nuclide.reactions.retain(|r| match &r.target { + Some(t) => reachable.contains(t), + None => true, + }); + out.nuclides.push(nuclide); + } + out.nuclides + .sort_by_key(|n| zam(&n.name).unwrap_or((0, 0, 0))); + out + } +} + +/// The key a fission yield energy is stored under. +/// +/// The Python package keys the yields by the float itself; this keys them by +/// its shortest round-tripping decimal, so the map has a total order and the +/// value survives the trip. +fn energy_key(energy: f64) -> String { + format!("{energy}") +} + +/// A stand-in for a product with no decay data. +/// +/// Walks towards stability until it reaches a nuclide the library knows: down +/// by alpha decay above Z=98, and by beta otherwise, in whichever direction +/// the element's longest-lived isotope lies. +/// +/// `None` when there is no stand-in: a bare neutron, which is simply dropped, +/// or a walk that leaves the table of elements without finding one. The +/// second happens when the decay library is small enough that the direction +/// cannot be judged — the Python reader indexes past the end and raises +/// `KeyError: -1` there; see issue #22. +pub fn replace_missing(product: &str, decay_data: &BTreeMap) -> Option { + let (z, a, state) = zam(product).ok()?; + let mut a = a as i64; + let mut z = z as i64; + let symbol = ATOMIC_SYMBOL.get(z as usize).copied()?; + + // A neutron is not replaced by anything. + if z == 0 { + return None; + } + + // The ground state, where the product was metastable. + let mut product = if state > 0 { + format!("{symbol}{a}") + } else { + product.to_string() + }; + + // The longest-lived isotope of this element says which way stability lies. + let mut half_life = 0.0; + let mut mass_longest_lived = a; + for (nuclide, data) in decay_data { + let Some((mass, _)) = same_element(nuclide, symbol) else { + continue; + }; + if data.nuclide.stable { + mass_longest_lived = mass; + break; + } + let t = data.half_life.map_or(0.0, |(t, _)| t); + if t > half_life { + mass_longest_lived = mass; + half_life = t; + } + } + let beta_minus = mass_longest_lived < a; + + while !decay_data.contains_key(&product) { + if z > 98 { + z -= 2; + a -= 4; + } else if beta_minus { + z += 1; + } else { + z -= 1; + } + if z < 1 || a < 1 { + return None; + } + product = format!("{}{a}", ATOMIC_SYMBOL.get(z as usize).copied()?); + } + Some(product) +} + +/// Whether a GNDS name is an isotope of the given element, and its mass. +fn same_element(name: &str, symbol: &str) -> Option<(i64, bool)> { + let rest = name.strip_prefix(symbol)?; + let digits: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect(); + if digits.is_empty() { + return None; + } + let tail = &rest[digits.len()..]; + // Only a metastable suffix may follow, or nothing. + if !tail.is_empty() && !tail.starts_with("_m") { + return None; + } + Some((digits.parse().ok()?, !tail.is_empty())) +} + +/// A stand-in set of fission yields for an actinide the library has none for. +/// +/// Tries the metastable state, then isotones in either direction, and falls +/// back to U235, whose yields every library has. +pub fn replace_missing_fpy( + actinide: &str, + fpy_data: &BTreeMap, + decay_data: &BTreeMap, +) -> String { + let Ok((z, a, m)) = zam(actinide) else { + return "U235".to_string(); + }; + let (z, a) = (z as i64, a as i64); + + if m == 0 { + let metastable = gnds_name(z as u32, a as u32, 1); + if fpy_data.contains_key(&metastable) { + return metastable; + } + } + + // Isotones: the neutron number held fixed while Z moves. + for step in [1i64, -1] { + let (mut z, mut a) = (z, a); + let mut isotone = actinide.to_string(); + while decay_data.contains_key(&isotone) { + z += step; + a += step; + if z < 0 { + break; + } + isotone = gnds_name(z as u32, a as u32, 0); + if fpy_data.contains_key(&isotone) { + return isotone; + } + } + } + + "U235".to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_reaction_table_matches_the_format() { + // A few entries, spot-checked against what the reaction does. + let two_n = reaction_info("(n,2n)").unwrap(); + assert_eq!((two_n.delta_a, two_n.delta_z), (-1, 0)); + // The level reactions all mean the same transmutation. + assert!(two_n.mts.contains(&16)); + assert!(two_n.mts.contains(&891)); + + let capture = reaction_info("(n,gamma)").unwrap(); + assert_eq!((capture.delta_a, capture.delta_z), (1, 0)); + assert!(capture.secondaries.is_empty()); + + let alpha = reaction_info("(n,a)").unwrap(); + assert_eq!((alpha.delta_a, alpha.delta_z), (-3, -2)); + assert_eq!(alpha.secondaries, ["He4"]); + + assert!(reaction_info("(n,nonsense)").is_none()); + + // Every reaction conserves nucleons: the change in A plus what the + // secondaries carry away accounts for the incident neutron. + for rx in &REACTIONS { + let carried: i64 = rx + .secondaries + .iter() + .map(|s| match *s { + "H1" => 1, + "H2" => 2, + "H3" => 3, + "He3" => 3, + "He4" => 4, + other => panic!("unexpected secondary {other}"), + }) + .sum(); + assert!( + rx.delta_a + carried <= 1, + "{} gains nucleons from nowhere", + rx.name + ); + } + } + + #[test] + fn branch_ratios_are_normalised_into_the_largest_branch() { + // The residual goes into the largest branch, which it moves least. + let mut br = vec![0.7, 0.2, 0.05]; + normalise_branch_ratios(&mut br); + assert_eq!(br.iter().sum::(), 1.0); + assert_eq!(br[1..], [0.2, 0.05], "only the largest branch moves"); + + // A tiny branch beside a large one keeps its order of magnitude. + let mut br = vec![0.99, 1.0e-9]; + normalise_branch_ratios(&mut br); + assert_eq!(br[1], 1.0e-9); + assert_eq!(br.iter().sum::(), 1.0); + + // Ratios that already sum to one are left exactly as evaluated. + let mut br = vec![0.25, 0.75]; + normalise_branch_ratios(&mut br); + assert_eq!(br, [0.25, 0.75]); + + let mut br: Vec = Vec::new(); + normalise_branch_ratios(&mut br); + assert!(br.is_empty()); + } + + #[test] + fn a_missing_product_walks_to_one_the_library_has() { + // An empty library has nothing to walk to, and the walk stops rather + // than running off the table; see issue #22. + let empty = BTreeMap::new(); + assert_eq!(replace_missing("Cd116", &empty), None); + // A neutron has no stand-in at all. + assert_eq!(replace_missing("n1", &empty), None); + } + + #[test] + fn a_reduced_chain_is_closed() { + let mut chain = Chain::new(); + for (name, target) in [("A", Some("B")), ("B", Some("C")), ("C", None)] { + let mut n = Nuclide::new(name); + if let Some(target) = target { + n.decay_modes.push(DecayPath { + kind: "beta-".to_string(), + target: Some(target.to_string()), + branching_ratio: 1.0, + }); + } + chain.nuclides.push(n); + } + // Unbounded: everything reachable comes along. + let all = chain.reduce(&["A"], None); + assert_eq!( + all.nuclides + .iter() + .map(|n| n.name.as_str()) + .collect::>(), + ["A", "B", "C"] + ); + + // One step: A and B, and A's path to B survives because B is in. + let one = chain.reduce(&["A"], Some(1)); + assert_eq!( + one.nuclides + .iter() + .map(|n| n.name.as_str()) + .collect::>(), + ["A", "B"] + ); + assert_eq!(one.get("A").unwrap().decay_modes.len(), 1); + // B's path to C does not: C is outside, so the chain stays closed. + assert!(one.get("B").unwrap().decay_modes.is_empty()); + + // A starting nuclide the chain does not have contributes nothing. + assert!(chain.reduce(&["Z"], None).is_empty()); + } +} diff --git a/crates/endf/src/data.rs b/crates/endf/src/data.rs new file mode 100644 index 0000000..dc6f52e --- /dev/null +++ b/crates/endf/src/data.rs @@ -0,0 +1,425 @@ +//! Element names, physical constants and the reaction sum rules. +//! +//! The tables here are generated from the Python package's `data.py` rather +//! than retyped, so the two cannot drift apart through a transcription slip. + +use crate::error::{Error, Result}; + +/// Boltzmann constant, eV per kelvin. +pub const K_BOLTZMANN: f64 = 8.617333262e-5; + +/// eV per MeV. +pub const EV_PER_MEV: f64 = 1.0e6; + +/// Chemical symbol by atomic number. Index 0 is the neutron, `n`. +pub const ATOMIC_SYMBOL: [&str; 119] = [ + "n", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", + "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", + "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", + "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", + "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", + "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", + "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", + "Nh", "Fl", "Mc", "Lv", "Ts", "Og", +]; + +/// Element name to chemical symbol, as the Python package spells them. +pub const ELEMENT_SYMBOL: [(&str, &str); 123] = [ + ("neutron", "n"), + ("hydrogen", "H"), + ("helium", "He"), + ("lithium", "Li"), + ("beryllium", "Be"), + ("boron", "B"), + ("carbon", "C"), + ("nitrogen", "N"), + ("oxygen", "O"), + ("fluorine", "F"), + ("neon", "Ne"), + ("sodium", "Na"), + ("magnesium", "Mg"), + ("aluminium", "Al"), + ("aluminum", "Al"), + ("silicon", "Si"), + ("phosphorus", "P"), + ("sulfur", "S"), + ("sulphur", "S"), + ("chlorine", "Cl"), + ("argon", "Ar"), + ("potassium", "K"), + ("calcium", "Ca"), + ("scandium", "Sc"), + ("titanium", "Ti"), + ("vanadium", "V"), + ("chromium", "Cr"), + ("manganese", "Mn"), + ("iron", "Fe"), + ("cobalt", "Co"), + ("nickel", "Ni"), + ("copper", "Cu"), + ("zinc", "Zn"), + ("gallium", "Ga"), + ("germanium", "Ge"), + ("arsenic", "As"), + ("selenium", "Se"), + ("bromine", "Br"), + ("krypton", "Kr"), + ("rubidium", "Rb"), + ("strontium", "Sr"), + ("yttrium", "Y"), + ("zirconium", "Zr"), + ("niobium", "Nb"), + ("molybdenum", "Mo"), + ("technetium", "Tc"), + ("ruthenium", "Ru"), + ("rhodium", "Rh"), + ("palladium", "Pd"), + ("silver", "Ag"), + ("cadmium", "Cd"), + ("indium", "In"), + ("tin", "Sn"), + ("antimony", "Sb"), + ("tellurium", "Te"), + ("iodine", "I"), + ("xenon", "Xe"), + ("caesium", "Cs"), + ("cesium", "Cs"), + ("barium", "Ba"), + ("lanthanum", "La"), + ("cerium", "Ce"), + ("praseodymium", "Pr"), + ("neodymium", "Nd"), + ("promethium", "Pm"), + ("samarium", "Sm"), + ("europium", "Eu"), + ("gadolinium", "Gd"), + ("terbium", "Tb"), + ("dysprosium", "Dy"), + ("holmium", "Ho"), + ("erbium", "Er"), + ("thulium", "Tm"), + ("ytterbium", "Yb"), + ("lutetium", "Lu"), + ("hafnium", "Hf"), + ("tantalum", "Ta"), + ("tungsten", "W"), + ("wolfram", "W"), + ("rhenium", "Re"), + ("osmium", "Os"), + ("iridium", "Ir"), + ("platinum", "Pt"), + ("gold", "Au"), + ("mercury", "Hg"), + ("thallium", "Tl"), + ("lead", "Pb"), + ("bismuth", "Bi"), + ("polonium", "Po"), + ("astatine", "At"), + ("radon", "Rn"), + ("francium", "Fr"), + ("radium", "Ra"), + ("actinium", "Ac"), + ("thorium", "Th"), + ("protactinium", "Pa"), + ("uranium", "U"), + ("neptunium", "Np"), + ("plutonium", "Pu"), + ("americium", "Am"), + ("curium", "Cm"), + ("berkelium", "Bk"), + ("californium", "Cf"), + ("einsteinium", "Es"), + ("fermium", "Fm"), + ("mendelevium", "Md"), + ("nobelium", "No"), + ("lawrencium", "Lr"), + ("rutherfordium", "Rf"), + ("dubnium", "Db"), + ("seaborgium", "Sg"), + ("bohrium", "Bh"), + ("hassium", "Hs"), + ("meitnerium", "Mt"), + ("darmstadtium", "Ds"), + ("roentgenium", "Rg"), + ("copernicium", "Cn"), + ("nihonium", "Nh"), + ("flerovium", "Fl"), + ("moscovium", "Mc"), + ("livermorium", "Lv"), + ("tennessine", "Ts"), + ("oganesson", "Og"), +]; + +/// Reactions whose cross section is the sum of others, from ENDF-102. +pub const SUM_RULES: [(i32, &[i32]); 15] = [ + (1, &[2, 3]), + ( + 3, + &[ + 4, 5, 11, 16, 17, 22, 23, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 41, 42, 44, + 45, 152, 153, 154, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185, 186, + 187, 188, 189, 190, 194, 195, 196, 198, 199, 200, + ], + ), + ( + 4, + &[ + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + ], + ), + ( + 16, + &[ + 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + ], + ), + (18, &[19, 20, 21, 38]), + (27, &[18, 101]), + ( + 101, + &[ + 102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 155, 182, + 191, 192, 193, 197, + ], + ), + ( + 103, + &[ + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + ], + ), + ( + 104, + &[ + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + ], + ), + ( + 105, + &[ + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + ], + ), + ( + 106, + &[ + 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, + 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, + ], + ), + ( + 107, + &[ + 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, + 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + ], + ), + (501, &[502, 504, 516, 522]), + (516, &[515, 517]), + ( + 522, + &[ + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, + ], + ), +]; + +/// The atomic number of a chemical symbol, e.g. `"Am"` gives 95. +pub fn atomic_number(symbol: &str) -> Option { + ATOMIC_SYMBOL + .iter() + .position(|&s| s == symbol) + .map(|z| z as u32) +} + +/// The reactions MT is the sum of, if it is a summed reaction. +pub fn sum_rule(mt: i32) -> Option<&'static [i32]> { + SUM_RULES.iter().find(|&&(k, _)| k == mt).map(|&(_, v)| v) +} + +/// A nuclide's name in GNDS convention, e.g. `gnds_name(95, 242, 1)` gives +/// `"Am242_m1"`. +pub fn gnds_name(z: u32, a: u32, m: u32) -> String { + let symbol = ATOMIC_SYMBOL.get(z as usize).copied().unwrap_or("?"); + if m > 0 { + format!("{symbol}{a}_m{m}") + } else { + format!("{symbol}{a}") + } +} + +/// The atomic number, mass number and metastable state of a GNDS name. +/// +/// The inverse of [`gnds_name`]; `"Am242_m1"` gives `(95, 242, 1)`. +pub fn zam(name: &str) -> Result<(u32, u32, u32)> { + // Equivalent to the Python reader's `([A-Zn][a-z]*)(\d+)((?:_[em]\d+)?)`, + // matched by hand so the crate stays dependency-free. + let bytes = name.as_bytes(); + let bad = || Error::BadNuclideName { + name: name.to_string(), + }; + + // The symbol: an upper-case letter (or a lone `n`) then lower-case ones. + let mut i = match bytes.first() { + Some(c) if c.is_ascii_uppercase() || *c == b'n' => 1, + _ => return Err(bad()), + }; + while i < bytes.len() && bytes[i].is_ascii_lowercase() { + i += 1; + } + let symbol = &name[..i]; + + // The mass number. + let start = i; + while i < bytes.len() && bytes[i].is_ascii_digit() { + i += 1; + } + if i == start { + return Err(bad()); + } + let a: u32 = name[start..i].parse().map_err(|_| bad())?; + + // An optional `_m` or `_e` state. + let metastable = if i == bytes.len() { + 0 + } else { + let rest = &name[i..]; + let digits = rest + .strip_prefix("_m") + .or_else(|| rest.strip_prefix("_e")) + .ok_or_else(bad)?; + if digits.is_empty() || !digits.bytes().all(|c| c.is_ascii_digit()) { + return Err(bad()); + } + digits.parse().map_err(|_| bad())? + }; + + let z = atomic_number(symbol).ok_or_else(|| Error::UnknownElement { + symbol: symbol.to_string(), + })?; + Ok((z, a, metastable)) +} + +/// A temperature rendered the way the data files name it, e.g. `"294K"`. +/// +/// Ties round to even, because Python's `round` does and this string is used +/// as a dictionary key: `1200.5` has to give `"1200K"` on both sides or the +/// two readers disagree about which temperature a table belongs to. +/// `f64::round` rounds half away from zero and would give `"1201K"`. +pub fn temperature_str(t: f64) -> String { + let floor = t.floor(); + let fraction = t - floor; + // Round up when past the halfway point, and on an exact tie only when + // doing so lands on an even number. + let up = fraction > 0.5 || (fraction == 0.5 && (floor as i64) % 2 != 0); + format!("{}K", floor as i64 + i64::from(up)) +} + +/// Python's `str()` of a float. +/// +/// Two places need it, and both would be wrong without it. The decay mode +/// encoding packs a chain of modes as the digits of a decimal and decodes it +/// by stripping the zeros and the point, which only works because `str()` +/// always writes a fractional part — `10.0` keeps its trailing zero where a +/// bare shortest-round-trip format gives `10` and loses it. An NJOY input deck +/// interpolates temperatures the same way, so `900.0` has to stay `900.0`. +pub fn python_float_str(value: f64) -> String { + let s = format!("{value}"); + if s.contains('.') + || s.contains('e') + || s.contains('E') + || s.contains("inf") + || s.contains("NaN") + { + s + } else { + format!("{s}.0") + } +} + +#[cfg(test)] +mod tests { + #[test] + fn formats_floats_the_way_python_str_does() { + // Python always writes a fractional part; Rust's shortest form does + // not, and both the decay mode encoding and the NJOY deck depend on + // it being there. + assert_eq!(python_float_str(1.0), "1.0"); + assert_eq!(python_float_str(10.0), "10.0"); + assert_eq!(python_float_str(0.0), "0.0"); + assert_eq!(python_float_str(900.0), "900.0"); + assert_eq!(python_float_str(-0.0), "-0.0"); + assert_eq!(python_float_str(1234567.0), "1234567.0"); + // A value that already has one is left alone. + assert_eq!(python_float_str(293.6), "293.6"); + assert_eq!(python_float_str(1.5), "1.5"); + } + + use super::*; + + #[test] + fn symbols_and_numbers_round_trip() { + assert_eq!(ATOMIC_SYMBOL[0], "n"); + assert_eq!(ATOMIC_SYMBOL[95], "Am"); + assert_eq!(ATOMIC_SYMBOL[118], "Og"); + for (z, &symbol) in ATOMIC_SYMBOL.iter().enumerate() { + assert_eq!(atomic_number(symbol), Some(z as u32), "{symbol}"); + } + assert_eq!(atomic_number("Xx"), None); + } + + #[test] + fn gnds_names_round_trip() { + for (z, a, m, name) in [ + (95, 242, 1, "Am242_m1"), + (95, 244, 0, "Am244"), + (1, 1, 0, "H1"), + (0, 1, 0, "n1"), + ] { + assert_eq!(gnds_name(z, a, m), name); + assert_eq!(zam(name).unwrap(), (z, a, m)); + } + } + + #[test] + fn zam_rejects_what_is_not_a_nuclide() { + for bad in ["", "Am", "242", "_m1", "Am242_x1", "Am242_m", "Xx242"] { + assert!(zam(bad).is_err(), "{bad:?} should not parse"); + } + // An excited state uses _e rather than _m and is read the same way. + assert_eq!(zam("Am242_e2").unwrap(), (95, 242, 2)); + } + + #[test] + fn sum_rules_are_looked_up_by_mt() { + assert_eq!(sum_rule(1), Some(&[2, 3][..])); + assert_eq!(sum_rule(18).unwrap(), &[19, 20, 21, 38]); + // MT=4 is the sum of the discrete inelastic levels. + assert_eq!(sum_rule(4).unwrap().len(), 42); + assert_eq!(sum_rule(2), None); + } + + #[test] + fn temperatures_are_named_as_the_data_files_name_them() { + assert_eq!(temperature_str(293.6), "294K"); + assert_eq!(temperature_str(900.0), "900K"); + assert_eq!(temperature_str(294.4), "294K"); + // Ties go to even, as Python's round does. f64::round would give + // 1201K here and 1202K below, and the string is used as a key. + assert_eq!(temperature_str(1200.5), "1200K"); + assert_eq!(temperature_str(1201.5), "1202K"); + assert_eq!(temperature_str(-0.5), "0K"); + } +} diff --git a/crates/endf/src/decay.rs b/crates/endf/src/decay.rs new file mode 100644 index 0000000..24605da --- /dev/null +++ b/crates/endf/src/decay.rs @@ -0,0 +1,750 @@ +//! Radioactive decay data: MF=8 MT=457, and the fission product yields beside +//! it in MT=454 and MT=459. + +use std::collections::BTreeMap; + +use crate::data::{gnds_name, ATOMIC_SYMBOL}; +use crate::error::{Error, Result}; +use crate::material::Material; +use crate::mf::mf8::WithUncertainty; +use crate::univariate::{combine_distributions, Discrete, Interpolation, Tabular, Univariate}; + +/// Each decay mode's name, and what it does to the mass and atomic numbers. +/// +/// `None` for a mode whose products are not a single nuclide: spontaneous +/// fission, and the catch-all for an unknown mode. +pub const DECAY_MODES: [(&str, Option<(i64, i64)>); 11] = [ + ("gamma", Some((0, 0))), + ("beta-", Some((0, 1))), + ("ec/beta+", Some((0, -1))), + ("IT", Some((0, 0))), + ("alpha", Some((-4, -2))), + ("n", Some((-1, 0))), + ("sf", None), + ("p", Some((-1, -1))), + ("e-", Some((0, 0))), + ("xray", Some((0, 0))), + ("unknown", None), +]; + +/// Which particle each radiation type emits, named as a source distribution +/// keys them. +/// +/// Several radiation types share a particle — gammas and x-rays are both +/// photons, betas and Auger electrons both electrons — and their spectra are +/// combined by [`Decay::sources`]. +pub const SOURCE_PARTICLES: [(&str, &str); 11] = [ + ("gamma", "photon"), + ("xray", "photon"), + ("beta-", "electron"), + ("e-", "electron"), + ("ec/beta+", "positron"), + ("alpha", "alpha"), + ("n", "neutron"), + ("sf", "fragment"), + ("p", "proton"), + ("anti-neutrino", "anti-neutrino"), + ("neutrino", "neutrino"), +]; + +/// The radiation type each STYP value names. +pub const RADIATION_TYPES: [(i64, &str); 11] = [ + (0, "gamma"), + (1, "beta-"), + (2, "ec/beta+"), + (4, "alpha"), + (5, "n"), + (6, "sf"), + (7, "p"), + (8, "e-"), + (9, "xray"), + (10, "anti-neutrino"), + (11, "neutrino"), +]; + +/// The forbiddenness of a discrete transition, as the TYPE field records it. +const DISCRETE_TYPES: [&str; 7] = [ + "allowed", + "first-forbidden", + "second-forbidden", + "third-forbidden", + "fourth-forbidden", + "fifth-forbidden", + "", +]; + +/// The names of the average decay energies, in the order MT=457 stores them. +/// +/// The first three are always given; the rest only when the evaluation writes +/// the long form. +pub const AVERAGE_ENERGY_NAMES: [&str; 17] = [ + "light", + "electromagnetic", + "heavy", + "beta-", + "beta+", + "auger", + "conversion", + "gamma", + "xray", + "bremsstrahlung", + "annihilation", + "alpha", + "recoil", + "SF", + "neutron", + "proton", + "neutrino", +]; + +/// The chain of decay modes an RTYP value names, e.g. `1.5` is a beta- decay +/// followed by neutron emission. +pub fn decay_modes(rtyp: f64) -> Vec<&'static str> { + crate::data::python_float_str(rtyp) + .trim_matches('0') + .chars() + .filter(|c| *c != '.') + .filter_map(|c| { + c.to_digit(10) + .and_then(|d| DECAY_MODES.get(d as usize)) + .map(|&(name, _)| name) + }) + .collect() +} + +/// One decay mode of a nuclide, and how much of the decay goes through it. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DecayMode { + /// The decaying nuclide, in GNDS convention. + pub parent: String, + /// The chain of modes, e.g. `["beta-", "n"]`. + pub modes: Vec<&'static str>, + /// Metastable state of the daughter. + pub daughter_state: i64, + /// Total decay energy available, in eV. + pub energy: WithUncertainty, + /// The fraction of decays that go this way. + pub branching_ratio: WithUncertainty, +} + +impl DecayMode { + /// The nuclide this mode leaves behind. + /// + /// `None` when the parent's name cannot be read, or when a mode in the + /// chain has no single daughter — spontaneous fission does not. + pub fn daughter(&self) -> Option { + let (symbol, a) = split_nuclide_name(&self.parent)?; + let mut z = ATOMIC_SYMBOL.iter().position(|&s| s == symbol)? as i64; + let mut a = a; + + for mode in &self.modes { + let (_, changes) = DECAY_MODES.iter().find(|(name, _)| name == mode)?; + // A mode with no single daughter leaves the numbers alone, which + // is what the Python reader does. + if let Some((delta_a, delta_z)) = changes { + a += delta_a; + z += delta_z; + } + } + + let symbol = ATOMIC_SYMBOL.get(z as usize)?; + Some(if self.daughter_state > 0 { + format!("{symbol}{a}_m{}", self.daughter_state) + } else { + format!("{symbol}{a}") + }) + } +} + +/// Split a GNDS name into its symbol and mass number, e.g. `"Am242_m1"`. +fn split_nuclide_name(name: &str) -> Option<(&str, i64)> { + let split = name.find(|c: char| c.is_ascii_digit())?; + let (symbol, rest) = name.split_at(split); + let digits: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect(); + Some((symbol, digits.parse().ok()?)) +} + +/// The nuclide a decay evaluation is about. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DecayNuclide { + /// GNDS name, e.g. `"In116_m1"`. + pub name: String, + pub atomic_number: i64, + pub mass_number: i64, + /// Isomeric state ordinal. + pub isomeric_state: i64, + /// Nuclear level index, which is not the same thing. + pub excited_state: i64, + /// Atomic mass in neutron masses. + pub mass: f64, + pub stable: bool, + /// `None` when the evaluation reports the spin as unknown. + pub spin: Option, + pub parity: f64, +} + +/// One discrete line of a decay spectrum. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DiscreteLine { + /// Energy of the emitted particle, in eV. + pub energy: WithUncertainty, + /// The decay chain this line comes from. + pub from_mode: Vec<&'static str>, + /// Forbiddenness, where the evaluation states one. + pub transition_type: Option<&'static str>, + pub intensity: WithUncertainty, + /// Positron intensity, for ec/beta+ spectra. + pub positron_intensity: Option, + /// Internal pair formation coefficient, for gamma spectra. + pub internal_pair: Option, + pub total_internal_conversion: Option, + pub k_shell_conversion: Option, + pub l_shell_conversion: Option, +} + +/// Whether a spectrum is given as lines, as a continuum, or as both. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum ContinuousFlag { + #[default] + Discrete, + Continuous, + Both, +} + +impl ContinuousFlag { + pub fn name(self) -> &'static str { + match self { + ContinuousFlag::Discrete => "discrete", + ContinuousFlag::Continuous => "continuous", + ContinuousFlag::Both => "both", + } + } + + fn from_lcon(lcon: i64) -> ContinuousFlag { + match lcon { + 1 => ContinuousFlag::Continuous, + 2 => ContinuousFlag::Both, + _ => ContinuousFlag::Discrete, + } + } +} + +/// The spectrum of one radiation type. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DecaySpectrum { + /// The radiation type, e.g. `"gamma"`. + pub radiation: &'static str, + pub continuous_flag: ContinuousFlag, + /// Normalisation of the discrete lines. + pub discrete_normalization: WithUncertainty, + /// Average energy of this radiation type, in eV. + pub energy_average: WithUncertainty, + /// Normalisation of the continuum. + pub continuous_normalization: WithUncertainty, + pub discrete: Vec, + /// The continuum, as a probability per eV against energy. + pub continuous: Option, + /// The decay chain the continuum comes from. + pub continuous_from_mode: Vec<&'static str>, +} + +/// Radioactive decay data for one nuclide. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Decay { + pub nuclide: DecayNuclide, + /// Half-life in seconds. `None` for a stable nuclide. + pub half_life: Option, + /// Average decay energies by radiation type, in eV. + pub average_energies: BTreeMap<&'static str, WithUncertainty>, + pub modes: Vec, + /// The spectra, by radiation type. An evaluation gives at most one per + /// type, so a later one of the same type replaces the earlier. + pub spectra: BTreeMap<&'static str, DecaySpectrum>, +} + +impl Decay { + /// Read the decay data of a material. + pub fn from_material(material: &Material) -> Result { + let section = material.mf8_mt457().ok_or(Error::Unsupported { + what: "an evaluation with no MF=8 MT=457 decay section", + })?; + + let (z, a) = (section.za / 1000, section.za % 1000); + let stable = section.nst == 1; + let mut decay = Decay { + nuclide: DecayNuclide { + name: gnds_name(z as u32, a as u32, section.liso as u32), + atomic_number: z, + mass_number: a, + isomeric_state: section.liso, + excited_state: section.lis, + mass: section.awr, + stable, + // ENDF-102 writes an unknown spin as -77.777. + spin: (section.spi != -77.777).then_some(section.spi), + parity: section.par, + }, + half_life: if stable { None } else { section.half_life }, + ..Default::default() + }; + + for (name, &value) in AVERAGE_ENERGY_NAMES.iter().zip(§ion.ex) { + decay.average_energies.insert(name, value); + } + + for mode in §ion.modes { + decay.modes.push(DecayMode { + parent: decay.nuclide.name.clone(), + modes: decay_modes(mode.rtyp), + daughter_state: mode.rfs as i64, + energy: mode.q, + branching_ratio: mode.br, + }); + } + + for spectrum in §ion.spectra { + let radiation = RADIATION_TYPES + .iter() + .find(|&&(styp, _)| styp == spectrum.styp as i64) + .map(|&(_, name)| name) + .ok_or(Error::Unsupported { + what: "a decay radiation type the format does not define", + })?; + let continuous_flag = ContinuousFlag::from_lcon(spectrum.lcon); + + let discrete = spectrum + .discrete + .iter() + .map(|line| DiscreteLine { + energy: line.er, + from_mode: decay_modes(line.rtyp), + // A TYPE of zero means the evaluation did not say. + transition_type: DISCRETE_TYPES + .get(line.type_ as usize - usize::from(line.type_ >= 1.0)) + .filter(|_| line.type_ >= 1.0) + .copied(), + intensity: line.ri, + // The same field is the positron intensity for ec/beta+ + // and the internal pair coefficient for gammas. + positron_intensity: (radiation == "ec/beta+").then_some(line.ris).flatten(), + internal_pair: (radiation == "gamma").then_some(line.ris).flatten(), + total_internal_conversion: line.ricc, + k_shell_conversion: line.rick, + l_shell_conversion: line.ricl, + }) + .collect(); + + decay.spectra.insert( + radiation, + DecaySpectrum { + radiation, + continuous_flag, + discrete_normalization: spectrum.fd, + energy_average: spectrum.er_av, + continuous_normalization: spectrum.fc, + discrete, + continuous: spectrum.continuous.as_ref().map(|c| c.rp.clone()), + continuous_from_mode: spectrum + .continuous + .as_ref() + .map_or_else(Vec::new, |c| decay_modes(c.rtyp)), + }, + ); + } + + Ok(decay) + } + + /// The decay constant in inverse seconds, with its uncertainty. + /// + /// `None` for a stable nuclide, and also for one whose half-life the + /// evaluation gives as zero. Zero means the half-life was not evaluated, + /// not that the nuclide decays instantly — ENDF/B-VIII.0's Xe136 is + /// flagged unstable with a half-life of zero, its real one being some + /// 10^21 years. `Chain::from_endf` reads it the same way, and so does the + /// Python property since issue #23 was fixed — it used to divide by the + /// zero and raise `ZeroDivisionError`. + pub fn decay_constant(&self) -> Option { + let (t, sigma) = self.half_life?; + if t == 0.0 { + return None; + } + let ln2 = std::f64::consts::LN_2; + Some((ln2 / t, ln2 / (t * t) * sigma)) + } + + /// Average energy per decay available for decay heat, in eV. + pub fn decay_energy(&self) -> WithUncertainty { + let get = |name| { + self.average_energies + .get(name) + .copied() + .unwrap_or((0.0, 0.0)) + }; + let (a, b, c) = (get("light"), get("electromagnetic"), get("heavy")); + // The uncertainties add in quadrature, as the Python package's + // `uncertainties` does for a sum of independent terms. + (a.0 + b.0 + c.0, (a.1 * a.1 + b.1 * b.1 + c.1 * c.1).sqrt()) + } + + /// The particles this nuclide emits, as distributions in emitted particles + /// per second. + /// + /// The spectra are intensities per decay; multiplying by the decay + /// constant makes them rates. Lines and continua of the same particle are + /// combined, so a nuclide that emits both gammas and x-rays gives one + /// photon distribution. + pub fn sources(&self) -> Result> { + let Some((decay_constant, _)) = self.decay_constant() else { + return Ok(BTreeMap::new()); + }; + + let mut by_particle: BTreeMap<&'static str, Vec> = BTreeMap::new(); + for (radiation, spectrum) in &self.spectra { + let particle = SOURCE_PARTICLES + .iter() + .find(|&&(r, _)| r == *radiation) + .map(|&(_, p)| p) + .ok_or(Error::Unsupported { + what: "a decay radiation type with no source particle", + })?; + let dists = by_particle.entry(particle).or_default(); + + if spectrum.continuous_flag != ContinuousFlag::Continuous { + let norm = spectrum.discrete_normalization.0; + dists.push(Univariate::Discrete(Discrete::new( + spectrum.discrete.iter().map(|d| d.energy.0).collect(), + spectrum + .discrete + .iter() + .map(|d| decay_constant * norm * d.intensity.0) + .collect(), + ))); + } + + if spectrum.continuous_flag != ContinuousFlag::Discrete { + let f = spectrum.continuous.as_ref().ok_or(Error::Unsupported { + what: "a spectrum that claims a continuum and gives none", + })?; + if f.interpolation.len() > 1 { + return Err(Error::Unsupported { + what: "a continuous decay spectrum with more than one interpolation region", + }); + } + let interpolation = + Interpolation::from_endf_code(f.interpolation.first().copied().unwrap_or(2))?; + let norm = spectrum.continuous_normalization.0; + dists.push(Univariate::Tabular(Tabular::new( + f.x.clone(), + f.y.iter().map(|&y| decay_constant * norm * y).collect(), + interpolation, + ))); + } + } + + let mut sources = BTreeMap::new(); + for (particle, dists) in by_particle { + let probs = vec![1.0; dists.len()]; + sources.insert(particle, combine_distributions(&dists, &probs)?); + } + Ok(sources) + } +} + +/// The yield of one fission product. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ProductYield { + /// GNDS name of the product, e.g. `"Xe135_m1"`. + pub name: String, + pub yield_: WithUncertainty, +} + +/// The fissioning nuclide, as MF=1 MT=451 describes it. +/// +/// Smaller than [`DecayNuclide`]: a yield evaluation has no MF=8 MT=457, so +/// there is no spin, parity or mass to report. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct FissioningNuclide { + /// GNDS name, e.g. `"U235"`. + pub name: String, + pub atomic_number: i64, + pub mass_number: i64, + /// Isomeric state ordinal. + pub isomeric_state: i64, + /// Nuclear level index, which is not the same thing. + pub excited_state: i64, +} + +/// Independent and cumulative fission product yields, from MF=8 MT=454 and +/// MT=459. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct FissionProductYields { + /// The fissioning nuclide. + pub nuclide: FissioningNuclide, + /// The incident energies the yields are given at, in eV. + pub energies: Vec, + /// Yields before delayed decay, one map per incident energy. + pub independent: Vec>, + /// Yields after it. + pub cumulative: Vec>, +} + +impl FissionProductYields { + /// Read the fission product yields of a material. + pub fn from_material(material: &Material) -> Result { + let mut out = FissionProductYields::default(); + + // The fissioning nuclide comes from MF=1 MT=451, not from the yield + // sections, which only identify the products. + if let Some(info) = material.mf1_mt451() { + let (z, a) = (info.za / 1000, info.za % 1000); + out.nuclide = FissioningNuclide { + name: crate::gnds_name(z as u32, a as u32, info.liso as u32), + atomic_number: z, + mass_number: a, + isomeric_state: info.liso, + excited_state: info.lis, + }; + } + + for (mt, target) in [(454, true), (459, false)] { + let Some(section) = material.mf8_mt454(mt) else { + continue; + }; + let mut energies = Vec::with_capacity(section.yields.len()); + let mut yields = Vec::with_capacity(section.yields.len()); + for set in §ion.yields { + energies.push(set.energy); + yields.push( + set.products + .iter() + .map(|p| ProductYield { + name: product_name(p.zafp as i64, p.fps as i64), + yield_: p.y, + }) + .collect(), + ); + } + + if out.energies.is_empty() { + out.energies = energies; + } else if out.energies != energies { + return Err(Error::Mismatched { + what: "the incident energies of the independent and cumulative yields", + }); + } + if target { + out.independent = yields; + } else { + out.cumulative = yields; + } + } + Ok(out) + } +} + +/// The name of a fission product, from its ZA and isomeric state. +fn product_name(za: i64, isomeric_state: i64) -> String { + let (z, a) = (za / 1000, za % 1000); + let symbol = ATOMIC_SYMBOL.get(z as usize).copied().unwrap_or("?"); + if isomeric_state > 0 { + format!("{symbol}{a}_m{isomeric_state}") + } else { + format!("{symbol}{a}") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + const IN116M1: &[u8] = include_bytes!("../../../tests/dec-049_In_116m1.endf.xz"); + const IN116M2: &[u8] = include_bytes!("../../../tests/dec-049_In_116m2.endf.xz"); + + fn decay(raw: &[u8]) -> Decay { + let m = Material::from_str(&crate::testdata::text(raw)).unwrap(); + Decay::from_material(&m).unwrap() + } + + #[test] + fn decodes_a_chain_of_decay_modes_from_one_number() { + // RTYP packs the chain as the digits of a decimal. + assert_eq!(decay_modes(1.0), ["beta-"]); + assert_eq!(decay_modes(4.0), ["alpha"]); + assert_eq!(decay_modes(1.5), ["beta-", "n"]); + assert_eq!(decay_modes(2.4), ["ec/beta+", "alpha"]); + // Stripping the zeros is what the format's encoding amounts to, and + // it leaves gamma — mode zero — unrepresentable. + assert!(decay_modes(0.0).is_empty()); + // A ten is two digits, not the tenth mode, which is what the Python + // reader makes of it too. + assert_eq!(decay_modes(10.0), ["beta-", "gamma"]); + } + + #[test] + fn a_decay_mode_names_its_daughter() { + let mode = DecayMode { + parent: "In116_m1".to_string(), + modes: vec!["beta-"], + daughter_state: 0, + ..Default::default() + }; + // Beta- turns a neutron into a proton: Z rises, A does not. + assert_eq!(mode.daughter().as_deref(), Some("Sn116")); + + let alpha = DecayMode { + parent: "Am242".to_string(), + modes: vec!["alpha"], + ..Default::default() + }; + assert_eq!(alpha.daughter().as_deref(), Some("Np238")); + + // A metastable daughter is named as one. + let it = DecayMode { + parent: "In116_m2".to_string(), + modes: vec!["IT"], + daughter_state: 1, + ..Default::default() + }; + assert_eq!(it.daughter().as_deref(), Some("In116_m1")); + + // Spontaneous fission has no single daughter, so the numbers are left + // alone rather than guessed at. + let sf = DecayMode { + parent: "Cf252".to_string(), + modes: vec!["sf"], + ..Default::default() + }; + assert_eq!(sf.daughter().as_deref(), Some("Cf252")); + } + + #[test] + fn reads_a_beta_emitter() { + let d = decay(IN116M1); + assert_eq!(d.nuclide.name, "In116_m1"); + assert_eq!(d.nuclide.isomeric_state, 1); + assert!(!d.nuclide.stable); + assert_eq!(d.nuclide.spin, Some(5.0)); + + assert_eq!(d.half_life, Some((3257.4, 10.2))); + let (lambda, _) = d.decay_constant().unwrap(); + // The decay constant and the half-life are the same fact. + assert!((lambda * 3257.4 - std::f64::consts::LN_2).abs() < 1e-12); + + // One mode, beta-, to tin. + assert_eq!(d.modes.len(), 1); + assert_eq!(d.modes[0].modes, ["beta-"]); + assert_eq!(d.modes[0].daughter().as_deref(), Some("Sn116")); + assert_eq!(d.modes[0].branching_ratio.0, 1.0); + + // Four spectra, and the decay energy is the three average energies. + assert_eq!( + d.spectra.keys().copied().collect::>(), + ["beta-", "e-", "gamma", "xray"] + ); + let sum: f64 = ["light", "electromagnetic", "heavy"] + .iter() + .map(|k| d.average_energies[k].0) + .sum(); + assert_eq!(d.decay_energy().0, sum); + } + + #[test] + fn gammas_and_xrays_become_one_photon_source() { + let d = decay(IN116M1); + let sources = d.sources().unwrap(); + // Four radiation types, two particles: gamma and xray are both + // photons, beta- and e- both electrons. + assert_eq!( + sources.keys().copied().collect::>(), + ["electron", "photon"] + ); + + let Univariate::Discrete(photons) = &sources["photon"] else { + panic!("both photon spectra are discrete, so they merge into one"); + }; + // Every line of both spectra is there, and the energies ascend. + let lines: usize = ["gamma", "xray"] + .iter() + .map(|r| d.spectra[r].discrete.len()) + .sum(); + assert_eq!(photons.x.len(), lines); + assert!(photons.x.windows(2).all(|w| w[1] > w[0])); + + // The intensities are rates, so they scale with the decay constant. + let (lambda, _) = d.decay_constant().unwrap(); + let norm = d.spectra["gamma"].discrete_normalization.0; + let first = &d.spectra["gamma"].discrete[0]; + let i = photons.x.iter().position(|&e| e == first.energy.0).unwrap(); + assert_eq!(photons.p[i], lambda * norm * first.intensity.0); + } + + #[test] + fn an_isomeric_transition_goes_to_the_state_below() { + let d = decay(IN116M2); + assert_eq!(d.nuclide.name, "In116_m2"); + assert_eq!(d.modes.len(), 1); + assert_eq!(d.modes[0].modes, ["IT"]); + assert_eq!(d.modes[0].daughter_state, 1); + assert_eq!(d.modes[0].daughter().as_deref(), Some("In116_m1")); + } + + /// A half-life of zero means "not evaluated", so there is no decay + /// constant and no source rates that scale with one. See issue #23. + #[test] + fn a_zero_half_life_has_no_decay_constant() { + const XE136: &[u8] = include_bytes!("../../../tests/dec-054_Xe_136.endf.xz"); + let m = Material::from_str(&crate::testdata::text(XE136)).unwrap(); + let d = Decay::from_material(&m).unwrap(); + + assert!(!d.nuclide.stable, "Xe136 is flagged unstable"); + assert_eq!(d.half_life, Some((0.0, 0.0))); + assert_eq!(d.decay_constant(), None); + // Every source rate is a multiple of the decay constant, so there is + // nothing to report rather than a rate of zero. + assert!(d.sources().unwrap().is_empty()); + + // A nuclide with a real half-life is unaffected. + const CS137: &[u8] = include_bytes!("../../../tests/dec-055_Cs_137.endf.xz"); + let m = Material::from_str(&crate::testdata::text(CS137)).unwrap(); + let d = Decay::from_material(&m).unwrap(); + let (lambda, _) = d.decay_constant().expect("Cs137 has a half-life"); + assert!(lambda > 0.0); + } + + #[test] + fn reads_independent_and_cumulative_yields() { + const NFY: &[u8] = include_bytes!("../../../tests/synthetic-nfy.endf.xz"); + let m = Material::from_str(&crate::testdata::text(NFY)).unwrap(); + let fpy = FissionProductYields::from_material(&m).unwrap(); + + assert_eq!(fpy.nuclide.name, "U235"); + assert_eq!(fpy.nuclide.atomic_number, 92); + assert_eq!(fpy.nuclide.mass_number, 235); + assert_eq!(fpy.energies, [0.0253, 5.0e5]); + + // The fast energy carries one product more than the thermal one, so a + // reader that reuses NFP across energies would be caught here. + assert_eq!(fpy.independent.len(), 2); + assert_eq!(fpy.independent[0].len(), 3); + assert_eq!(fpy.independent[1].len(), 4); + assert_eq!(fpy.independent[0][1].name, "Xe135_m1"); + assert_eq!(fpy.independent[0][1].yield_, (0.0134, 0.0006)); + + // Independent and cumulative differ, so returning one for the other + // would be caught too. + assert_eq!(fpy.cumulative[0][0].name, "Zr95"); + assert_eq!(fpy.cumulative[0][0].yield_, (0.0605, 0.0018)); + assert_ne!(fpy.independent[0][0].yield_, fpy.cumulative[0][0].yield_); + } + + #[test] + fn an_evaluation_with_no_decay_section_is_refused() { + const AM244: &[u8] = include_bytes!("../../../tests/n-095_Am_244.endf.xz"); + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + assert!(Decay::from_material(&m).is_err()); + // The yields are simply absent rather than an error. + let fpy = FissionProductYields::from_material(&m).unwrap(); + assert!(fpy.energies.is_empty()); + } +} diff --git a/crates/endf/src/error.rs b/crates/endf/src/error.rs new file mode 100644 index 0000000..ca318dd --- /dev/null +++ b/crates/endf/src/error.rs @@ -0,0 +1,100 @@ +//! Errors raised while reading an ENDF-6 file. + +use std::fmt; + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub enum Error { + /// A record was expected but the section ended first. + UnexpectedEof { + /// What the reader was trying to read. + expected: &'static str, + }, + /// A control field (MAT/MF/MT) could not be read as an integer. + BadControlField { + line: String, + }, + /// An INTG record used an NDIGIT value the format does not define. + BadNdigit { + ndigit: i64, + }, + /// An ACE table that could not be read. + BadAceTable { + what: String, + }, + /// An interpolation scheme the reader does not know. + BadInterpolation { + name: String, + }, + /// Two lists that had to be the same length were not. + Mismatched { + what: &'static str, + }, + /// A name that is not a nuclide in GNDS convention. + BadNuclideName { + name: String, + }, + /// A chemical symbol with no atomic number. + UnknownElement { + symbol: String, + }, + /// A representation the reader does not implement, matching where the + /// Python reader raises `NotImplementedError`. + Unsupported { + what: &'static str, + }, + Io(std::io::Error), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Error::UnexpectedEof { expected } => { + write!(f, "ENDF section ended while reading {expected}") + } + Error::BadControlField { line } => { + write!( + f, + "could not read MAT/MF/MT control fields from line: {line:?}" + ) + } + Error::BadNdigit { ndigit } => { + write!(f, "INTG record has NDIGIT={ndigit}, expected 2 through 6") + } + Error::BadAceTable { what } => write!(f, "could not read the ACE table: {what}"), + Error::BadInterpolation { name } => { + write!( + f, + "{name:?} is not an interpolation scheme this reader knows" + ) + } + Error::Mismatched { what } => write!(f, "{what} must match"), + Error::BadNuclideName { name } => { + write!(f, "{name:?} is not a nuclide name in GNDS format") + } + Error::UnknownElement { symbol } => { + write!(f, "{symbol:?} is not a recognised element symbol") + } + Error::Unsupported { what } => { + write!(f, "this reader does not implement {what}") + } + Error::Io(e) => write!(f, "{e}"), + } + } +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(e) => Some(e), + _ => None, + } + } +} + +impl From for Error { + fn from(e: std::io::Error) -> Self { + Error::Io(e) + } +} diff --git a/crates/endf/src/fission_energy.rs b/crates/endf/src/fission_energy.rs new file mode 100644 index 0000000..358682d --- /dev/null +++ b/crates/endf/src/fission_energy.rs @@ -0,0 +1,301 @@ +//! Energy released by fission, split into its components. +//! +//! Built from MF=1 MT=458. Each component is either a polynomial in incident +//! energy or a tabulation, and which one it is varies per component within a +//! single evaluation — U235, U238 and Pu239 all pair a tabulated prompt photon +//! term with a polynomial delayed one. That distinction is preserved here +//! rather than collapsed, because it is what the converted data has to carry. + +use crate::data::EV_PER_MEV; +use crate::error::{Error, Result}; +use crate::function::{Polynomial, Tabulated1D}; +use crate::material::Material; +use crate::mf::mf1::{FissionEnergyRelease as Mt458Component, Nu}; + +/// The components of the fission energy release, in the order MT=458 stores +/// them. `recoverable` and `total` are recomputed from the others rather than +/// read, so they do not appear here. +pub const COMPONENT_NAMES: [&str; 9] = [ + "fragments", + "prompt_neutrons", + "delayed_neutrons", + "prompt_photons", + "delayed_photons", + "betas", + "neutrinos", + "recoverable", + "total", +]; + +/// One component's energy release as a function of incident energy, in eV. +#[derive(Debug, Clone, PartialEq)] +pub enum Component { + Polynomial(Polynomial), + Tabulated(Tabulated1D), +} + +impl Component { + pub fn eval(&self, e: f64) -> f64 { + match self { + Component::Polynomial(p) => p.eval(e), + Component::Tabulated(t) => t.eval(e), + } + } +} + +/// Energy released by fission, by component. Every field is a function of the +/// incident neutron energy in eV, returning eV. +#[derive(Debug, Clone, PartialEq)] +pub struct FissionEnergyRelease { + /// Kinetic energy of the fission fragments. + pub fragments: Component, + /// Kinetic energy of the prompt fission neutrons. + pub prompt_neutrons: Component, + /// Kinetic energy of the delayed fission neutrons. + pub delayed_neutrons: Component, + /// Energy of the prompt fission photons. + pub prompt_photons: Component, + /// Energy of the delayed fission photons. + pub delayed_photons: Component, + /// Energy of the delayed beta particles. + pub betas: Component, + /// Energy carried off by neutrinos, which is not recoverable. + pub neutrinos: Component, +} + +impl FissionEnergyRelease { + /// Everything except the neutrinos, which escape. + pub fn recoverable(&self, e: f64) -> f64 { + self.fragments.eval(e) + + self.prompt_neutrons.eval(e) + + self.delayed_neutrons.eval(e) + + self.prompt_photons.eval(e) + + self.delayed_photons.eval(e) + + self.betas.eval(e) + } + + /// Every component, neutrinos included. + pub fn total(&self, e: f64) -> f64 { + self.recoverable(e) + self.neutrinos.eval(e) + } + + /// Prompt fission Q value: the prompt release less the incident energy. + pub fn q_prompt(&self, e: f64) -> f64 { + self.fragments.eval(e) + self.prompt_neutrons.eval(e) + self.prompt_photons.eval(e) - e + } + + pub fn q_recoverable(&self, e: f64) -> f64 { + self.recoverable(e) - e + } + + pub fn q_total(&self, e: f64) -> f64 { + self.total(e) - e + } + + /// Read the fission energy release from an evaluation. + /// + /// `nu` is only consulted when the evaluation gives a single coefficient + /// per component, in which case the prompt neutron term takes its energy + /// dependence from the Sher-Beck formula, which needs nu-bar. Pass the + /// prompt or total neutron yield from the fission reaction; the delayed + /// fraction is small enough that ENDF-102 does not distinguish them. + pub fn from_material(material: &Material, nu: Option<&Nu>) -> Result { + let metadata = material.mf1_mt451().ok_or(Error::Unsupported { + what: "an evaluation with no MF=1 MT=451 section", + })?; + if metadata.lfi != 1 { + return Err(Error::Unsupported { + what: "fission energy release from a non-fissionable evaluation", + }); + } + let section = material.mf1_mt458().ok_or(Error::Unsupported { + what: "an evaluation with no MF=1 MT=458 section", + })?; + + let npoly = section.nply; + let mut functions: Vec> = vec![None; COMPONENT_NAMES.len()]; + + for (i, name) in COMPONENT_NAMES.iter().enumerate() { + // These two are recomputed from the components above. + if matches!(*name, "recoverable" | "total") { + continue; + } + let Some(Mt458Component::Polynomial(pairs)) = section.components.get(i) else { + continue; + }; + let mut coeffs: Vec = pairs.iter().map(|&(c, _)| c).collect(); + + // ENDF/B-VII.1 left the second-order coefficients in MeV by + // mistake. A 5 MeV neutron cannot change the release by more than + // 100 MeV, so a term that large is the units error rather than + // physics. + if npoly == 2 { + if let Some(c2) = coeffs.get_mut(2) { + if c2.abs() * (5.0e6f64).powi(2) > 1.0e8 { + *c2 /= EV_PER_MEV; + } + } + } + + if npoly > 0 { + functions[i] = Some(Component::Polynomial(Polynomial::new(coeffs))); + continue; + } + + // A single coefficient, so the energy dependence is Sher-Beck. + let zeroth = coeffs.first().copied().unwrap_or(0.0); + let func = match *name { + "delayed_photons" | "betas" => { + Component::Polynomial(Polynomial::new(vec![zeroth, -0.075])) + } + "neutrinos" => Component::Polynomial(Polynomial::new(vec![zeroth, -0.105])), + "prompt_neutrons" => sher_beck_prompt_neutrons(zeroth, nu)?, + _ => Component::Polynomial(Polynomial::new(coeffs)), + }; + functions[i] = Some(func); + } + + // A tabulated component replaces the polynomial form. IFC indexes the + // component list, one-based. + for (i, component) in section.components.iter().enumerate() { + if let Mt458Component::Tabulated { eifc, .. } = component { + functions[i] = Some(Component::Tabulated(eifc.clone())); + } + } + + let take = |i: usize| -> Result { + functions[i].clone().ok_or(Error::Unsupported { + what: "an MF=1 MT=458 section missing a required component", + }) + }; + + Ok(FissionEnergyRelease { + fragments: take(0)?, + prompt_neutrons: take(1)?, + delayed_neutrons: take(2)?, + prompt_photons: take(3)?, + delayed_photons: take(4)?, + betas: take(5)?, + neutrinos: take(6)?, + }) + } +} + +/// The Sher-Beck energy dependence of the prompt neutron kinetic energy, which +/// is written in terms of nu-bar. +fn sher_beck_prompt_neutrons(zeroth: f64, nu: Option<&Nu>) -> Result { + let nu = nu.ok_or(Error::Unsupported { + what: "the Sher-Beck fission energy release without a nu-bar to build it from", + })?; + Ok(match nu { + Nu::Tabulated(t) => { + let y0 = t.y.first().copied().unwrap_or(0.0); + let y = + t.x.iter() + .zip(&t.y) + .map(|(&x, &y)| zeroth + 1.307 * x - 8.07e6 * (y - y0)) + .collect(); + Component::Tabulated(Tabulated1D { + x: t.x.clone(), + y, + breakpoints: t.breakpoints.clone(), + interpolation: t.interpolation.clone(), + threshold_idx: None, + }) + } + Nu::Polynomial(coef) => { + let mut out = vec![zeroth]; + if coef.len() <= 1 { + out.push(1.307); + } else { + out.push(1.307 - 8.07e6 * coef[1]); + out.extend(coef[2..].iter().map(|&c| -8.07e6 * c)); + } + Component::Polynomial(Polynomial::new(out)) + } + Nu::Absent => { + return Err(Error::Unsupported { + what: "the Sher-Beck fission energy release without a nu-bar to build it from", + }) + } + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + const FIXTURE: &[u8] = include_bytes!("../../../tests/n-095_Am_244.endf.xz"); + + /// Values taken from the Python implementation on the same evaluation, so + /// this is a parity test and not just a plausibility one. The golden + /// harness covers the parsed sections; the derived quantities here are + /// pinned separately because they are computed rather than read. + #[test] + fn matches_the_python_fission_energy_release() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let nu = m.mf1_mt452(452).map(|s| &s.nu); + let fer = FissionEnergyRelease::from_material(&m, nu).unwrap(); + + // (incident energy, fragments, prompt neutrons, prompt photons, + // delayed photons, neutrinos, total, prompt Q) + let cases = [ + ( + 0.0253, + 180560600.0, + 6651000.01, + 6949000.0, + 5106196.998, + 7058463.997, + 211579126.0, + 194160600.0, + ), + ( + 1.0e6, + 180015126.4, + 7029000.0, + 6965930.0, + 5031197.0, + 6958464.0, + 211178500.4, + 193010056.4, + ), + ( + 1.4e7, + 172923969.6, + 11943000.0, + 7186020.0, + 4056197.0, + 5658464.0, + 205970367.6, + 178052989.6, + ), + ]; + + for (e, frag, pn, pp, dp, nu_, total, q_prompt) in cases { + let close = |got: f64, want: f64, what: &str| { + assert!( + (got - want).abs() <= 1e-6 * want.abs(), + "at E={e}: {what} is {got}, Python gives {want}" + ); + }; + close(fer.fragments.eval(e), frag, "fragments"); + close(fer.prompt_neutrons.eval(e), pn, "prompt neutrons"); + close(fer.prompt_photons.eval(e), pp, "prompt photons"); + close(fer.delayed_photons.eval(e), dp, "delayed photons"); + close(fer.neutrinos.eval(e), nu_, "neutrinos"); + close(fer.total(e), total, "total"); + close(fer.q_prompt(e), q_prompt, "prompt Q"); + } + + // The neutrinos escape, so the recoverable release is strictly less. + assert!(fer.recoverable(0.0253) < fer.total(0.0253)); + } + + #[test] + fn a_non_fissionable_evaluation_is_rejected() { + const PHOTOAT_H: &[u8] = include_bytes!("../../../tests/photoat-001_H_000.endf.xz"); + let m = Material::from_str(&crate::testdata::text(PHOTOAT_H)).unwrap(); + assert!(FissionEnergyRelease::from_material(&m, None).is_err()); + } +} diff --git a/crates/endf/src/function.rs b/crates/endf/src/function.rs new file mode 100644 index 0000000..8b71ac0 --- /dev/null +++ b/crates/endf/src/function.rs @@ -0,0 +1,453 @@ +//! Tabulated functions: the TAB1 and TAB2 types of the ENDF-6 format. + +use crate::data::EV_PER_MEV; + +/// A one-dimensional tabulated function, mirroring the format's TAB1 type. +/// +/// The `(x, y)` pairs are interpolated according to `interpolation`, one scheme +/// per region, where `breakpoints` holds the one-based index of each region's +/// last point. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Tabulated1D { + pub x: Vec, + pub y: Vec, + /// One-based index of the last point in each interpolation region. + pub breakpoints: Vec, + /// ENDF interpolation scheme per region: 1 histogram, 2 linear-linear, + /// 3 linear-log, 4 log-linear, 5 log-log. + pub interpolation: Vec, + /// Where this function starts on the nuclide's own energy grid. + /// + /// A processed cross section begins at its threshold rather than at the + /// bottom of the grid, and summing several of them needs to know where + /// each one began. `None` for anything not read from an ACE table. + pub threshold_idx: Option, +} + +impl Tabulated1D { + /// A function with a single linear-linear region, the format's default. + pub fn new(x: Vec, y: Vec) -> Self { + let n = x.len() as i32; + Tabulated1D { + x, + y, + breakpoints: vec![n], + interpolation: vec![2], + threshold_idx: None, + } + } + + pub fn with_regions( + x: Vec, + y: Vec, + breakpoints: Vec, + interpolation: Vec, + ) -> Self { + if breakpoints.is_empty() || interpolation.is_empty() { + return Tabulated1D::new(x, y); + } + Tabulated1D { + x, + y, + breakpoints, + interpolation, + threshold_idx: None, + } + } + + pub fn n_pairs(&self) -> usize { + self.x.len() + } + + pub fn n_regions(&self) -> usize { + self.breakpoints.len() + } + + pub fn is_empty(&self) -> bool { + self.x.is_empty() + } + + /// Evaluate the function at `x`, clamping to the tabulated range. + pub fn eval(&self, x: f64) -> f64 { + if self.x.is_empty() { + return 0.0; + } + if x <= self.x[0] { + return self.y[0]; + } + let last = self.x.len() - 1; + if x >= self.x[last] { + return self.y[last]; + } + + // Index of the bin containing x: the count of points at or below it, + // less one. + let idx = self.x.partition_point(|&v| v <= x) - 1; + + // The scheme for the region this bin falls in. Regions are ordered, so + // the first breakpoint past the bin wins; if none is, the last scheme + // applies. + let mut scheme = *self.interpolation.last().unwrap_or(&2); + for (b, p) in self.breakpoints.iter().zip(&self.interpolation) { + if (idx as i64) < (*b as i64) - 1 { + scheme = *p; + break; + } + } + + let (xi, xi1) = (self.x[idx], self.x[idx + 1]); + let (yi, yi1) = (self.y[idx], self.y[idx + 1]); + + match scheme { + 1 => yi, + 2 => yi + (x - xi) / (xi1 - xi) * (yi1 - yi), + 3 => yi + (x / xi).ln() / (xi1 / xi).ln() * (yi1 - yi), + 4 => yi * ((x - xi) / (xi1 - xi) * (yi1 / yi).ln()).exp(), + 5 => yi * ((x / xi).ln() / (xi1 / xi).ln() * (yi1 / yi).ln()).exp(), + _ => yi + (x - xi) / (xi1 - xi) * (yi1 - yi), + } + } + + /// Partial integrals from the start of the range to each tabulated point. + /// + /// The returned vector is the same length as `x`, beginning at zero. + pub fn integral(&self) -> Vec { + let n = self.x.len(); + if n == 0 { + return Vec::new(); + } + let mut partial = vec![0.0; n.saturating_sub(1)]; + + let mut i_low = 0usize; + for (k, &b) in self.breakpoints.iter().enumerate() { + let i_high = ((b as i64 - 1).max(0) as usize).min(n.saturating_sub(1)); + let scheme = *self.interpolation.get(k).unwrap_or(&2); + // The bin index reads x and y at both i and i+1, so it is the index + // itself that is wanted here, not an iterator over one of them. + #[allow(clippy::needless_range_loop)] + for i in i_low..i_high { + let (x0, x1) = (self.x[i], self.x[i + 1]); + let (y0, y1) = (self.y[i], self.y[i + 1]); + partial[i] = match scheme { + 1 => y0 * (x1 - x0), + 2 => { + let m = (y1 - y0) / (x1 - x0); + (y0 - m * x0) * (x1 - x0) + m * (x1 * x1 - x0 * x0) / 2.0 + } + 3 => { + let logx = (x1 / x0).ln(); + let m = (y1 - y0) / logx; + y0 + m * (x1 * (logx - 1.0) + x0) + } + 4 => { + let m = (y1 / y0).ln() / (x1 - x0); + y0 / m * ((m * (x1 - x0)).exp() - 1.0) + } + 5 => { + let m = (y1 / y0).ln() / (x1 / x0).ln(); + y0 / ((m + 1.0) * x0.powf(m)) * (x1.powf(m + 1.0) - x0.powf(m + 1.0)) + } + _ => 0.0, + }; + } + i_low = i_high; + } + + let mut out = Vec::with_capacity(n); + out.push(0.0); + let mut running = 0.0; + for v in partial { + running += v; + out.push(running); + } + out + } + + /// Read a tabulated function from an ACE table's XSS array. + /// + /// `idx` is the zero-based offset of the record within `xss`, which begins + /// with the number of interpolation regions. `convert_units` multiplies the + /// abscissa by [`EV_PER_MEV`], which is wanted whenever it is an energy. + /// + /// The number of values consumed is + /// `2 + 2 * n_regions + 2 * n_pairs`; [`Self::ace_len`] computes it for a + /// caller that has to step past the record. + pub fn from_ace(xss: &[f64], idx: usize, convert_units: bool) -> Tabulated1D { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + + let n_regions = at(idx) as usize; + let n_pairs = at(idx + 1 + 2 * n_regions) as usize; + + let mut idx = idx + 1; + let (breakpoints, interpolation) = if n_regions > 0 { + ( + (0..n_regions).map(|i| at(idx + i) as i32).collect(), + (0..n_regions) + .map(|i| at(idx + n_regions + i) as i32) + .collect(), + ) + } else { + // Zero regions means one linear-linear region over the whole table. + (vec![n_pairs as i32], vec![2]) + }; + + idx += 2 * n_regions + 1; + let mut x: Vec = (0..n_pairs).map(|i| at(idx + i)).collect(); + let y: Vec = (0..n_pairs).map(|i| at(idx + n_pairs + i)).collect(); + + if convert_units { + for v in &mut x { + *v *= EV_PER_MEV; + } + } + + Tabulated1D { + x, + y, + breakpoints, + interpolation, + threshold_idx: None, + } + } + + /// Number of XSS values the record at `idx` occupies. + pub fn ace_len(xss: &[f64], idx: usize) -> usize { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + let n_regions = at(idx) as usize; + let n_pairs = at(idx + 1 + 2 * n_regions) as usize; + 2 + 2 * n_regions + 2 * n_pairs + } +} + +/// A Legendre series, `sum_l c_l P_l(x)`. +/// +/// The angular distributions of MF=4 are given this way. The coefficients are +/// the series' own, not those of the equivalent power polynomial, so this is a +/// different type from [`Polynomial`] rather than a conversion of it. +/// +/// Evaluation and integration follow `numpy.polynomial.legendre` step for step +/// — Clenshaw recurrence for the value, the three-term relation for the +/// antiderivative — because the Python reader uses it and the two have to agree +/// to the last bit. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Legendre { + /// Coefficients in ascending order of degree. + pub coefficients: Vec, +} + +impl Legendre { + /// A series with the given coefficients, kept exactly as passed. + /// + /// Trailing zeros are not dropped, matching `numpy.polynomial`, whose + /// constructor takes `trim=False`. It matters: the Clenshaw recurrence + /// takes one step per coefficient, so a trailing zero moves the last bits + /// of every value the series produces. + pub fn new(coefficients: Vec) -> Self { + Legendre { coefficients } + } + + /// Evaluate the series at `x` by Clenshaw recurrence, as `legval` does. + /// + /// The two ratios are formed before they multiply `c1`, which is how + /// NumPy 2 spells the recurrence. Associating the other way — as NumPy 1 + /// did — changes the last bit or two of the result. + pub fn eval(&self, x: f64) -> f64 { + legval(x, &self.coefficients) + } + + /// The antiderivative that vanishes at zero, as `legint` gives it. + pub fn integ(&self) -> Legendre { + let c = &self.coefficients; + let n = c.len(); + if n == 0 { + return Legendre::new(Vec::new()); + } + if n == 1 && c[0] == 0.0 { + return Legendre::new(vec![0.0]); + } + + let mut tmp = vec![0.0; n + 1]; + tmp[1] = c[0]; + if n > 1 { + tmp[2] = c[1] / 3.0; + } + for j in 2..n { + let d = c[j] / (2.0 * j as f64 + 1.0); + tmp[j + 1] = d; + tmp[j - 1] -= d; + } + // Shift so the antiderivative vanishes at the lower bound of zero. + // `tmp[0]` is still zero at this point, so subtracting the value there + // is the whole of the adjustment. `legint` evaluates the untrimmed + // coefficients here and trims only what it returns. + tmp[0] -= legval(0.0, &tmp); + Legendre::new(tmp) + } +} + +/// `numpy.polynomial.legendre.legval`: a Legendre series at one point. +/// +/// A free function because [`Legendre::integ`] has to evaluate coefficients +/// that have not been trimmed yet, exactly as `legint` does. +fn legval(x: f64, c: &[f64]) -> f64 { + match c.len() { + 0 => 0.0, + 1 => c[0], + 2 => c[0] + c[1] * x, + len => { + let mut nd = len; + let mut c0 = c[len - 2]; + let mut c1 = c[len - 1]; + for i in 3..=len { + let tmp = c0; + nd -= 1; + let nd_f = nd as f64; + c0 = c[len - i] - c1 * ((nd_f - 1.0) / nd_f); + c1 = tmp + c1 * x * ((2.0 * nd_f - 1.0) / nd_f); + } + c0 + c1 * x + } + } +} + +/// Interpolation metadata for a two-dimensional function, the format's TAB2. +/// +/// TAB2 carries no values of its own: it describes how to interpolate between +/// the subrecords that follow it. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Tabulated2D { + pub breakpoints: Vec, + pub interpolation: Vec, +} + +/// A polynomial in ascending powers, used where the format gives coefficients +/// rather than a table (nu-bar in MF=1, for instance). +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Polynomial { + pub coefficients: Vec, +} + +impl Polynomial { + pub fn new(coefficients: Vec) -> Self { + Polynomial { coefficients } + } + + pub fn eval(&self, x: f64) -> f64 { + // Horner, from the highest power down. + self.coefficients + .iter() + .rev() + .fold(0.0, |acc, &c| acc * x + c) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn linear_linear_matches_the_docstring_example() { + // >>> f = Tabulated1D([0, 10], [4, 5]) + // [4.0, 4.25, 4.5, 4.75, 5.0] + let f = Tabulated1D::new(vec![0.0, 10.0], vec![4.0, 5.0]); + let got: Vec = [0.0, 2.5, 5.0, 7.5, 10.0] + .iter() + .map(|&x| f.eval(x)) + .collect(); + for (a, b) in got.iter().zip([4.0, 4.25, 4.5, 4.75, 5.0]) { + assert!((a - b).abs() < 1e-12, "{a} != {b}"); + } + } + + #[test] + fn clamps_outside_the_tabulated_range() { + let f = Tabulated1D::new(vec![1.0, 2.0], vec![10.0, 20.0]); + assert_eq!(f.eval(-5.0), 10.0); + assert_eq!(f.eval(99.0), 20.0); + } + + #[test] + fn histogram_holds_the_left_value() { + let f = + Tabulated1D::with_regions(vec![0.0, 1.0, 2.0], vec![3.0, 7.0, 9.0], vec![3], vec![1]); + assert_eq!(f.eval(0.5), 3.0); + assert_eq!(f.eval(1.5), 7.0); + } + + #[test] + fn integral_of_a_constant_is_the_width() { + let f = Tabulated1D::new(vec![0.0, 1.0, 2.0], vec![5.0, 5.0, 5.0]); + let it = f.integral(); + assert_eq!(it.len(), 3); + assert!((it[0] - 0.0).abs() < 1e-12); + assert!((it[1] - 5.0).abs() < 1e-12); + assert!((it[2] - 10.0).abs() < 1e-12); + } + + #[test] + fn legendre_evaluates_the_series() { + // P_2(x) = (3x^2 - 1)/2, so P_2(0.5) = -0.125 exactly. + let l = Legendre::new(vec![0.0, 0.0, 1.0]); + assert_eq!(l.eval(0.5), -0.125); + assert_eq!(Legendre::new(vec![3.0]).eval(7.0), 3.0); + assert_eq!(Legendre::new(vec![1.0, 2.0]).eval(0.25), 1.5); + } + + #[test] + fn legendre_integrates_as_numpy_does() { + // The antiderivative of P_2 is (P_3 - P_1)/5, and numpy gives the + // coefficients and the value at one to the last bit. + let a = Legendre::new(vec![0.0, 0.0, 1.0]).integ(); + assert_eq!(a.coefficients, vec![0.0, -0.2, 0.0, 0.2]); + assert_eq!(a.eval(1.0), -5.551115123125783e-17); + } + + #[test] + fn legendre_keeps_trailing_zeros() { + // numpy's constructor does not trim, and the recurrence takes a step + // per coefficient, so the length is part of the answer. + let l = Legendre::new(vec![1.0, 0.0, 0.0]); + assert_eq!(l.coefficients.len(), 3); + assert_eq!(l.integ().coefficients, vec![0.0, 1.0, 0.0, 0.0]); + } + + #[test] + fn reads_a_tabulated_function_from_an_ace_array() { + // One region, three pairs, energies in MeV. + let xss = vec![ + 1.0, // n_regions + 3.0, // breakpoint + 5.0, // log-log + 3.0, // n_pairs + 1.0, 2.0, 3.0, // x, in MeV + 10.0, 20.0, 30.0, // y + ]; + let f = Tabulated1D::from_ace(&xss, 0, true); + assert_eq!(f.breakpoints, vec![3]); + assert_eq!(f.interpolation, vec![5]); + assert_eq!(f.x, vec![1.0e6, 2.0e6, 3.0e6]); + assert_eq!(f.y, vec![10.0, 20.0, 30.0]); + assert_eq!(Tabulated1D::ace_len(&xss, 0), xss.len()); + + // Left in MeV when the abscissa is not an energy. + assert_eq!(Tabulated1D::from_ace(&xss, 0, false).x, vec![1.0, 2.0, 3.0]); + } + + #[test] + fn zero_regions_in_an_ace_array_means_one_linear_region() { + let xss = vec![0.0, 2.0, 1.0, 2.0, 7.0, 8.0]; + let f = Tabulated1D::from_ace(&xss, 0, false); + assert_eq!(f.breakpoints, vec![2]); + assert_eq!(f.interpolation, vec![2]); + assert_eq!(f.x, vec![1.0, 2.0]); + assert_eq!(f.y, vec![7.0, 8.0]); + assert_eq!(Tabulated1D::ace_len(&xss, 0), xss.len()); + } + + #[test] + fn polynomial_evaluates_in_ascending_powers() { + // 1 + 2x + 3x^2 at x = 2 -> 17 + let p = Polynomial::new(vec![1.0, 2.0, 3.0]); + assert_eq!(p.eval(2.0), 17.0); + } +} diff --git a/crates/endf/src/incident_neutron.rs b/crates/endf/src/incident_neutron.rs new file mode 100644 index 0000000..9eca545 --- /dev/null +++ b/crates/endf/src/incident_neutron.rs @@ -0,0 +1,558 @@ +//! Continuous-energy neutron interaction data for one nuclide. + +use std::collections::{BTreeMap, BTreeSet}; + +use crate::ace::{self, MetastableScheme, Table}; +use crate::data::{gnds_name, sum_rule, temperature_str, ATOMIC_SYMBOL, EV_PER_MEV, K_BOLTZMANN}; +use crate::error::{Error, Result}; +use crate::function::Tabulated1D; +use crate::material::Material; +use crate::mf::mf4::{AngleAtEnergy, AngleDistribution}; +use crate::reaction::{photon_products_ace, Reaction}; +use crate::urr::ProbabilityTables; + +/// Reactions whose cross sections are sums of others even where the sum rules +/// do not say so. +/// +/// The first five are the particle production cross sections, which count +/// every reaction that emits that particle; MT=444 is damage energy, which is +/// a weighted sum rather than a channel. +const ALWAYS_REDUNDANT: [i32; 6] = [203, 204, 205, 206, 207, 444]; + +/// The transmutation reactions an ACE file may give only as separate levels. +const SUMMED_IF_ABSENT: [i32; 6] = [16, 103, 104, 105, 106, 107]; + +/// Continuous-energy neutron interaction data for one nuclide. +/// +/// Built from an ENDF evaluation, which is at a single temperature, or from +/// one or more ACE tables, which carry one temperature each and are merged +/// with [`IncidentNeutron::add_temperature_from_ace`]. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct IncidentNeutron { + pub atomic_number: u32, + pub mass_number: u32, + /// Zero for the ground state. + pub metastable: u32, + pub atomic_weight_ratio: Option, + /// Temperatures as kT in eV. + pub k_ts: Vec, + /// The reactions, by MT. + pub reactions: BTreeMap, + /// The nuclide's energy grid at each temperature, in eV. Empty for an + /// ENDF evaluation, which gives each reaction its own grid. + pub energy: BTreeMap>, + /// Unresolved resonance probability tables, by temperature. + pub urr: BTreeMap, + /// A name given explicitly, overriding the one the Z, A and metastable + /// state imply. + pub name_override: Option, +} + +impl IncidentNeutron { + /// An empty nuclide. + pub fn new(atomic_number: u32, mass_number: u32, metastable: u32) -> IncidentNeutron { + IncidentNeutron { + atomic_number, + mass_number, + metastable, + ..Default::default() + } + } + + /// The nuclide's name in GNDS convention, e.g. `"Am242_m1"`. + pub fn name(&self) -> String { + self.name_override + .clone() + .unwrap_or_else(|| gnds_name(self.atomic_number, self.mass_number, self.metastable)) + } + + /// The atomic symbol, e.g. `"Zr"`. + pub fn atomic_symbol(&self) -> &'static str { + ATOMIC_SYMBOL + .get(self.atomic_number as usize) + .copied() + .unwrap_or("?") + } + + /// The temperatures data exists at, as the strings that key the cross + /// sections — `"294K"` and the like. + pub fn temperatures(&self) -> Vec { + self.k_ts + .iter() + .map(|&k_t| temperature_str(k_t / K_BOLTZMANN)) + .collect() + } + + /// Whether the nuclide has a reaction with this MT. + pub fn contains(&self, mt: i32) -> bool { + self.reactions.contains_key(&mt) + } + + /// One reaction, by MT. + pub fn get(&self, mt: i32) -> Option<&Reaction> { + self.reactions.get(&mt) + } + + /// One reaction, by name or alias — `"elastic"`, `"(n,2n)"`, `"n,2n"`. + pub fn get_by_name(&self, name: &str) -> Option<&Reaction> { + let mt = crate::reaction::reaction_mt(name) + .or_else(|| crate::reaction::reaction_mt(&format!("({name})")))?; + self.get(mt) + } + + /// Read a nuclide from an ENDF material. + /// + /// Every MT with an MF=3 cross section becomes a reaction. + pub fn from_endf(material: &Material) -> Result { + let metadata = material.mf1_mt451().ok_or(Error::Unsupported { + what: "a neutron evaluation with no MF=1 MT=451", + })?; + let (z, a) = (metadata.za / 1000, metadata.za % 1000); + let mut data = IncidentNeutron::new(z as u32, a as u32, metadata.liso as u32); + + for &(mf, mt) in material.section_data.keys() { + if mf == 3 { + data.reactions + .insert(mt, Reaction::from_endf(mt, material)?); + } + } + Ok(data) + } + + /// Read a nuclide from a continuous-energy neutron ACE table. + pub fn from_ace(table: &Table, scheme: MetastableScheme) -> Result { + if table.data_type()? != ace::TableType::NeutronContinuous { + return Err(Error::BadAceTable { + what: format!("{} is not a continuous-energy neutron table", table.name), + }); + } + let meta = ace::get_metadata(table.zaid()?, scheme)?; + + // `Table::kt` is the raw value from the file, in MeV; kTs is in eV. + let mut data = IncidentNeutron { + atomic_number: meta.z, + mass_number: meta.mass_number, + metastable: meta.metastable, + atomic_weight_ratio: Some(table.atomic_weight_ratio), + k_ts: vec![table.kt * EV_PER_MEV], + ..Default::default() + }; + let t = data.temperatures().remove(0); + + // The energy grid, and the summed cross sections stored beside it. + let n = table.nxs[3].max(0) as usize; + let i = table.jxs[1].max(0) as usize; + let at = |k: usize| table.xss.get(k).copied().unwrap_or(0.0); + let column = |c: usize| -> Vec { (0..n).map(|k| at(i + c * n + k)).collect() }; + + let energy: Vec = column(0).into_iter().map(|e| e * EV_PER_MEV).collect(); + let total_xs = column(1); + let absorption_xs = column(2); + let heating: Vec = column(4).into_iter().map(|h| h * EV_PER_MEV).collect(); + data.energy.insert(t.clone(), energy.clone()); + + // Three redundant reactions the table gives outright rather than as + // channels: the total, the absorption, and the heating number, which + // becomes a heating "cross section" once multiplied by the total. + let redundant = |mt: i32, y: Vec| { + let mut rx = Reaction::new(mt); + let mut xs = Tabulated1D::new(energy.clone(), y); + xs.threshold_idx = Some(0); + rx.xs.insert(t.clone(), xs); + rx.redundant = true; + rx + }; + data.reactions.insert(1, redundant(1, total_xs.clone())); + if absorption_xs.iter().any(|&v| v != 0.0) { + data.reactions.insert(101, redundant(101, absorption_xs)); + } + let heating_xs: Vec = heating + .iter() + .zip(&total_xs) + .map(|(&h, &s)| h * s) + .collect(); + data.reactions.insert(301, redundant(301, heating_xs)); + + for i_reaction in 0..=table.nxs[4] { + let rx = Reaction::from_ace(table, i_reaction)?; + data.reactions.insert(rx.mt, rx); + } + + // Some photon production is assigned to an MT with no cross section of + // its own, usually MT=4. A redundant reaction is built from the + // components so the photons have somewhere to live. + let n_photon = table.nxs[6].max(0); + let photon_mts: BTreeSet = (0..n_photon) + .map(|k| (table.xss[(table.jxs[13] + k) as usize] as i64 / 1000) as i32) + .collect(); + for mt in photon_mts { + if data.contains(mt) || sum_rule(mt).is_none() { + // Photon production for a reaction with neither a cross + // section nor a sum rule has nowhere to go. The Python reader + // warns; there is nothing else to do with it. + continue; + } + let mts = data.reaction_components(mt); + if mts.is_empty() { + continue; + } + let mut rx = data.redundant_reaction(mt, &mts); + rx.products.extend(photon_products_ace(table, &rx)?); + data.reactions.insert(mt, rx); + } + + // An ACE file sometimes gives only the individual levels of a + // transmutation reaction, e.g. MT=600-649 rather than MT=103. The + // summation is built explicitly so it can be tallied. + for mt in SUMMED_IF_ABSENT { + if data.contains(mt) { + continue; + } + let mts = data.reaction_components(mt); + if mts.is_empty() { + continue; + } + let rx = data.redundant_reaction(mt, &mts); + data.reactions.insert(mt, rx); + } + + // Mark what is a sum of other channels rather than a channel. + let redundant: Vec = data + .reactions + .keys() + .copied() + .filter(|&mt| ALWAYS_REDUNDANT.contains(&mt) || data.reaction_components(mt) != [mt]) + .collect(); + for mt in redundant { + if let Some(rx) = data.reactions.get_mut(&mt) { + rx.redundant = true; + } + } + + if let Some(urr) = ProbabilityTables::from_ace(table) { + data.urr.insert(t, urr); + } + + Ok(data) + } + + /// Add the cross sections of the same nuclide at another temperature. + /// + /// The reactions must already exist: a table that brings a reaction this + /// one does not have is a different evaluation, and the extra reaction is + /// dropped rather than half-added. + pub fn add_temperature_from_ace( + &mut self, + table: &Table, + scheme: MetastableScheme, + ) -> Result<()> { + let data = IncidentNeutron::from_ace(table, scheme)?; + let t = data.temperatures().remove(0); + if self.temperatures().contains(&t) { + // Already present. The Python reader warns and returns. + return Ok(()); + } + if data.name() != self.name() { + return Err(Error::Mismatched { + what: "the nuclide of an added temperature and of the data it is added to", + }); + } + + self.k_ts.extend(data.k_ts); + self.energy.insert(t.clone(), data.energy[&t].clone()); + for (mt, rx) in data.reactions { + if let Some(existing) = self.reactions.get_mut(&mt) { + existing.xs.insert(t.clone(), rx.xs[&t].clone()); + } + } + if let Some(urr) = data.urr.get(&t) { + self.urr.insert(t, urr.clone()); + } + Ok(()) + } + + /// Which reactions make up a redundant one. + /// + /// The sum rules are applied recursively, and only reactions the nuclide + /// actually has are returned. An MT that is not a sum, or whose components + /// are all absent, gives itself back — or nothing, if it is absent too. + pub fn reaction_components(&self, mt: i32) -> Vec { + let mut mts = Vec::new(); + if let Some(rule) = sum_rule(mt) { + for &component in rule { + mts.extend(self.reaction_components(component)); + } + } + if !mts.is_empty() { + return mts; + } + if self.contains(mt) { + vec![mt] + } else { + Vec::new() + } + } + + /// Build a redundant reaction by summing its components. + /// + /// The sum starts at the lowest threshold of any component, since below + /// that every one of them is zero. + pub fn redundant_reaction(&self, mt: i32, mts: &[i32]) -> Reaction { + let mut rx = Reaction::new(mt); + for t in self.temperatures() { + let Some(grid) = self.energy.get(&t) else { + continue; + }; + let parts: Vec<&Tabulated1D> = mts + .iter() + .filter_map(|m| self.reactions.get(m).and_then(|r| r.xs.get(&t))) + .collect(); + let idx = parts + .iter() + .map(|xs| xs.threshold_idx.unwrap_or(0)) + .min() + .unwrap_or(0) + .min(grid.len()); + let energy = grid[idx..].to_vec(); + let y: Vec = energy + .iter() + .map(|&e| parts.iter().map(|xs| xs.eval(e)).sum()) + .collect(); + let mut xs = Tabulated1D::new(energy, y); + xs.threshold_idx = Some(idx); + rx.xs.insert(t, xs); + } + rx.redundant = true; + rx + } + + /// The removal cross section: the total less the part of elastic + /// scattering that goes forward. + /// + /// Point-kernel shielding treats a forward-scattered neutron as still in + /// the uncollided beam, so it is not removed. `mu_cutoff` is the cosine of + /// the cone's half angle; zero is the forward hemisphere. + pub fn removal_xs(&self, temperature: &str, mu_cutoff: f64) -> Result { + let total = + self.get(1) + .and_then(|rx| rx.xs.get(temperature)) + .ok_or(Error::Unsupported { + what: "a removal cross section without the total cross section", + })?; + let elastic_rx = self.get(2).ok_or(Error::Unsupported { + what: "a removal cross section without elastic scattering", + })?; + let elastic = elastic_rx.xs.get(temperature).ok_or(Error::Unsupported { + what: "a removal cross section without elastic scattering", + })?; + + let angle = elastic_rx + .products + .first() + .and_then(|p| p.distribution.first()) + .and_then(|d| match d { + crate::angle_energy::AngleEnergy::Uncorrelated(u) => u.angle.as_ref(), + _ => None, + }); + + let (energies, forward) = match angle { + Some(angle) if !angle.energy.is_empty() => { + (angle.energy.clone(), angle.forward_fraction(mu_cutoff)) + } + // Isotropic scattering sends the same fraction forward at every + // energy, so the elastic grid will do. + _ => ( + elastic.x.clone(), + vec![(1.0 - mu_cutoff) / 2.0; elastic.x.len()], + ), + }; + + let y: Vec = energies + .iter() + .zip(&forward) + .map(|(&e, &f)| total.eval(e) - f * elastic.eval(e)) + .collect(); + Ok(Tabulated1D::new(energies, y)) + } +} + +/// The fraction of an isotropic distribution that goes into the forward cone. +/// +/// Only here so the meaning of the constant in [`IncidentNeutron::removal_xs`] +/// is written down somewhere: the cosine is uniform on `[-1, 1]`, so the cone +/// `[mu, 1]` holds `(1 - mu)/2` of it. +pub fn isotropic_forward_fraction(mu_cutoff: f64) -> f64 { + (1.0 - mu_cutoff) / 2.0 +} + +/// Whether an angular distribution is isotropic at every energy. +pub fn is_isotropic(angle: &AngleDistribution) -> bool { + angle + .mu + .iter() + .all(|mu| matches!(mu, AngleAtEnergy::Isotropic(_))) +} + +#[cfg(test)] +mod tests { + use super::*; + + const AM244: &[u8] = include_bytes!("../../../tests/n-095_Am_244.endf.xz"); + + fn li6() -> IncidentNeutron { + let table = crate::testdata::ace_tables(crate::testdata::LI6_ACE).remove(0); + IncidentNeutron::from_ace(&table, MetastableScheme::Mcnp).unwrap() + } + + #[test] + fn an_endf_evaluation_gives_one_reaction_per_cross_section() { + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + let n = IncidentNeutron::from_endf(&m).unwrap(); + assert_eq!(n.name(), "Am244"); + assert_eq!((n.atomic_number, n.mass_number, n.metastable), (95, 244, 0)); + assert_eq!(n.atomic_symbol(), "Am"); + + // Exactly the MTs that have an MF=3 section, and nothing else. + let mf3: Vec = m + .section_data + .keys() + .filter(|&&(mf, _)| mf == 3) + .map(|&(_, mt)| mt) + .collect(); + assert_eq!(n.reactions.keys().copied().collect::>(), mf3); + + // An ENDF evaluation is at one temperature and gives no shared grid. + assert!(n.k_ts.is_empty()); + assert!(n.energy.is_empty()); + assert!(n.urr.is_empty()); + } + + #[test] + fn reactions_are_reachable_by_name() { + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + let n = IncidentNeutron::from_endf(&m).unwrap(); + assert_eq!(n.get_by_name("elastic").unwrap().mt, 2); + assert_eq!(n.get_by_name("(n,elastic)").unwrap().mt, 2); + // The bare form, which the lookup wraps in parentheses. + assert_eq!(n.get_by_name("n,gamma").unwrap().mt, 102); + assert!(n.get_by_name("(n,nonsense)").is_none()); + } + + #[test] + fn an_ace_table_brings_its_temperature_and_its_grid() { + let n = li6(); + assert_eq!(n.name(), "Li6"); + assert_eq!(n.temperatures(), ["294K"]); + assert_eq!(n.k_ts.len(), 1); + assert!(n.atomic_weight_ratio.is_some()); + + // One grid, shared by every reaction of that temperature. + let grid = &n.energy["294K"]; + assert_eq!(grid.len(), 721); + assert!(grid.windows(2).all(|w| w[1] > w[0]), "the grid ascends"); + // Li6 has no unresolved region. + assert!(n.urr.is_empty()); + } + + #[test] + fn the_summed_cross_sections_come_from_the_main_energy_block() { + let n = li6(); + // The total, and the heating, are always there; absorption only when + // it is nonzero. + for mt in [1, 301] { + let rx = &n.reactions[&mt]; + assert!(rx.redundant, "MT={mt} is a sum, not a channel"); + assert_eq!(rx.xs["294K"].x.len(), n.energy["294K"].len()); + } + // The total is at least the elastic scattering it contains. + let total = &n.reactions[&1].xs["294K"]; + let elastic = &n.reactions[&2].xs["294K"]; + for &e in &[0.0253, 1.0e3, 1.0e6, 1.0e7] { + assert!(total.eval(e) >= elastic.eval(e), "at {e} eV"); + } + } + + #[test] + fn a_reaction_the_table_gives_only_as_levels_is_summed() { + let n = li6(); + // Li6 gives MT=51..55 and MT=91 but no MT=4, so the components of the + // inelastic summation are the levels themselves. + let components = n.reaction_components(4); + assert!(!components.is_empty()); + assert!(components.iter().all(|mt| (51..=91).contains(mt))); + + // A reaction that is its own only component is not a sum. + assert_eq!(n.reaction_components(2), [2]); + assert!(!n.reactions[&2].redundant); + + // A reaction the nuclide does not have has no components. + assert!(n.reaction_components(18).is_empty()); + } + + #[test] + fn a_summed_reaction_is_the_sum_of_its_parts() { + let n = li6(); + // MT=4 is the inelastic summation, which Li6 gives only as levels. + let mts = n.reaction_components(4); + assert_eq!(mts, [51, 52, 53, 54, 55, 91]); + let rx = n.redundant_reaction(4, &mts); + assert!(rx.redundant); + let xs = &rx.xs["294K"]; + for &e in &[1.0e3, 1.0e6, 1.0e7] { + let want: f64 = mts.iter().map(|m| n.reactions[m].xs["294K"].eval(e)).sum(); + assert!((xs.eval(e) - want).abs() <= 1e-12 * want.abs().max(1e-30)); + } + } + + #[test] + fn the_particle_production_cross_sections_are_marked_redundant() { + let n = li6(); + for mt in ALWAYS_REDUNDANT { + if let Some(rx) = n.get(mt) { + assert!(rx.redundant, "MT={mt} counts other reactions"); + } + } + } + + #[test] + fn adding_a_temperature_that_is_already_there_changes_nothing() { + let table = crate::testdata::ace_tables(crate::testdata::LI6_ACE).remove(0); + let mut n = IncidentNeutron::from_ace(&table, MetastableScheme::Mcnp).unwrap(); + let before = n.clone(); + n.add_temperature_from_ace(&table, MetastableScheme::Mcnp) + .unwrap(); + assert_eq!(n, before); + } + + #[test] + fn the_removal_cross_section_takes_the_forward_cone_off_the_total() { + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + let n = IncidentNeutron::from_endf(&m).unwrap(); + + let total = &n.get(1).unwrap().xs["0K"]; + let elastic = &n.get(2).unwrap().xs["0K"]; + + // At a cutoff of -1 the whole of elastic scattering is forward, so + // removal is the total less all of it. + let all = n.removal_xs("0K", -1.0).unwrap(); + for (i, &e) in all.x.iter().enumerate() { + let want = total.eval(e) - elastic.eval(e); + assert!((all.y[i] - want).abs() <= 1e-9 * want.abs().max(1e-30)); + } + + // Raising the cutoff can only take less off, so removal rises. + let half = n.removal_xs("0K", 0.0).unwrap(); + let most = n.removal_xs("0K", 0.5).unwrap(); + for (i, &e) in all.x.iter().enumerate() { + assert!(all.y[i] <= half.y[i] + 1e-9, "at {e} eV"); + assert!(half.y[i] <= most.y[i] + 1e-9, "at {e} eV"); + assert!(most.y[i] <= total.eval(e) + 1e-9, "at {e} eV"); + } + } + + #[test] + fn a_removal_cross_section_needs_the_total_and_the_elastic() { + let n = IncidentNeutron::new(3, 6, 0); + assert!(n.removal_xs("0K", 0.0).is_err()); + } +} diff --git a/crates/endf/src/incident_photon.rs b/crates/endf/src/incident_photon.rs new file mode 100644 index 0000000..8e59d6b --- /dev/null +++ b/crates/endf/src/incident_photon.rs @@ -0,0 +1,750 @@ +//! Photon interaction data for one element. +//! +//! Built from the photoatomic sublibrary — MF=23 cross sections, MF=27 form +//! factors, MF=28 atomic relaxation — or from a processed ACE photoatomic +//! table. + +use std::collections::BTreeMap; + +use crate::ace::{self, Table}; +use crate::data::{sum_rule, ATOMIC_SYMBOL, EV_PER_MEV}; +use crate::error::{Error, Result}; +use crate::function::Tabulated1D; +use crate::material::Material; + +/// Atomic subshells, indexed by the designator the format uses. Index 0 is +/// unused, so a designator can be looked up directly. +pub const SUBSHELLS: [&str; 40] = [ + "", "K", "L1", "L2", "L3", "M1", "M2", "M3", "M4", "M5", "N1", "N2", "N3", "N4", "N5", "N6", + "N7", "O1", "O2", "O3", "O4", "O5", "O6", "O7", "O8", "O9", "P1", "P2", "P3", "P4", "P5", "P6", + "P7", "P8", "P9", "P10", "P11", "Q1", "Q2", "Q3", +]; + +/// The photon reactions the format names outright. The subshell +/// photoelectric reactions, MT=534 upward, are named for their subshell. +const PHOTON_REACTION_NAME_BASE: [(i32, &str); 11] = [ + (501, "total"), + (502, "coherent"), + (504, "incoherent"), + (515, "pair_production_electron"), + (516, "pair_production_total"), + (517, "pair_production_nuclear"), + (522, "photoelectric"), + (525, "heating"), + (526, "electro_atomic_scat"), + (527, "electro_atomic_brem"), + (528, "electro_atomic_excit"), +]; + +/// The name of a photon reaction, e.g. `"coherent"` for MT=502 or `"K"` for +/// MT=534, the K-shell photoelectric cross section. +pub fn photon_reaction_name(mt: i32) -> Option<&'static str> { + if let Some(&(_, name)) = PHOTON_REACTION_NAME_BASE.iter().find(|&&(m, _)| m == mt) { + return Some(name); + } + // MT = 533 + designator. + let designator = mt - 533; + if designator >= 1 { + return SUBSHELLS.get(designator as usize).copied(); + } + None +} + +/// The MT of a named photon reaction. +pub fn photon_reaction_mt(name: &str) -> Option { + if let Some(&(mt, _)) = PHOTON_REACTION_NAME_BASE.iter().find(|&&(_, n)| n == name) { + return Some(mt); + } + SUBSHELLS + .iter() + .position(|&s| s == name && !s.is_empty()) + .map(|i| 533 + i as i32) +} + +/// One photon interaction channel. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct PhotonReaction { + pub mt: i32, + /// Cross section against incident photon energy, in barns and eV. + pub xs: Option, + /// The coherent or incoherent form factor. + pub scattering_factor: Option, + /// Real part of the anomalous scattering factor, MT=502 only. + pub anomalous_real: Option, + /// Imaginary part, likewise. + pub anomalous_imag: Option, + /// Binding energy in eV, for the subshell photoelectric reactions. + pub subshell_binding_energy: Option, + /// Fluorescence yield, for MT=534 to 572. + pub fluorescence_yield: Option, +} + +impl PhotonReaction { + pub fn new(mt: i32) -> PhotonReaction { + PhotonReaction { + mt, + ..Default::default() + } + } + + pub fn name(&self) -> Option<&'static str> { + photon_reaction_name(self.mt) + } +} + +/// One radiative or non-radiative transition filling a vacancy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Transitions { + /// The subshell the electron falls from. + pub secondary_subshell: Vec<&'static str>, + /// For a non-radiative transition, the subshell the Auger electron leaves. + /// Empty for a radiative one. + pub tertiary_subshell: Vec<&'static str>, + /// Energy of the emitted particle in eV. + pub energy: Vec, + /// Fractional probability of each transition. + pub probability: Vec, +} + +/// How an atom relaxes after a photoelectric event leaves a vacancy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct AtomicRelaxation { + /// Binding energy in eV, by subshell. + pub binding_energy: BTreeMap<&'static str, f64>, + /// Electron occupancy of the neutral atom, by subshell. + pub num_electrons: BTreeMap<&'static str, f64>, + /// The transitions that fill a vacancy in each subshell. + pub transitions: BTreeMap<&'static str, Transitions>, +} + +impl AtomicRelaxation { + /// The subshells present, in the format's own order rather than + /// alphabetically. + pub fn subshells(&self) -> Vec<&'static str> { + let mut out: Vec<&'static str> = self.binding_energy.keys().copied().collect(); + out.sort_by_key(|s| { + SUBSHELLS + .iter() + .position(|&x| x == *s) + .unwrap_or(usize::MAX) + }); + out + } + + /// Read atomic relaxation data from an MF=28 MT=533 section. + pub fn from_endf(material: &Material) -> Result { + let section = material.mf28(533).ok_or(Error::Unsupported { + what: "atomic relaxation from a material with no MF=28 MT=533", + })?; + + let name = |designator: f64| -> Result<&'static str> { + SUBSHELLS + .get(designator as usize) + .copied() + .ok_or(Error::Unsupported { + what: "an atomic subshell designator the format does not define", + }) + }; + + let mut out = AtomicRelaxation::default(); + for shell in §ion.shells { + let subi = name(shell.subi)?; + out.binding_energy.insert(subi, shell.ebi); + out.num_electrons.insert(subi, shell.eln); + if shell.ntr > 0 { + out.transitions.insert( + subi, + Transitions { + secondary_subshell: shell + .subj + .iter() + .map(|&s| name(s)) + .collect::>()?, + tertiary_subshell: shell + .subk + .iter() + .map(|&s| name(s)) + .collect::>()?, + energy: shell.etr.clone(), + probability: shell.ftr.clone(), + }, + ); + } + } + Ok(out) + } + + /// Read atomic relaxation data from an ACE photoatomic table. + pub fn from_ace(table: &Table) -> Result { + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| table.xss.get(i).copied()) + .unwrap_or(0.0) + }; + let name = |designator: f64| -> Result<&'static str> { + SUBSHELLS + .get(designator as usize) + .copied() + .ok_or(Error::Unsupported { + what: "an atomic subshell designator the format does not define", + }) + }; + + let n = table.nxs[7].max(0); + let shells: Vec<&'static str> = (0..n) + .map(|i| name(at(table.jxs[11] + i))) + .collect::>()?; + + let mut out = AtomicRelaxation::default(); + for (i, &shell) in shells.iter().enumerate() { + out.num_electrons + .insert(shell, at(table.jxs[12] + i as i64)); + out.binding_energy + .insert(shell, at(table.jxs[13] + i as i64) * EV_PER_MEV); + } + + let mut idx = table.jxs[18]; + for (i, &subi) in shells.iter().enumerate() { + let n_transitions = at(table.jxs[15] + i as i64) as i64; + if n_transitions <= 0 { + continue; + } + let mut transitions = Transitions::default(); + for j in 0..n_transitions { + transitions.secondary_subshell.push(name(at(idx))?); + transitions.tertiary_subshell.push(name(at(idx + 1))?); + transitions.energy.push(at(idx + 2) * EV_PER_MEV); + // The table stores cumulative probabilities, so each one after + // the first is the difference from the one before. + transitions.probability.push(if j == 0 { + at(idx + 3) + } else { + at(idx + 3) - at(idx - 1) + }); + idx += 4; + } + out.transitions.insert(subi, transitions); + } + Ok(out) + } +} + +/// Photon interaction data for one element. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct IncidentPhoton { + pub atomic_number: i64, + pub reactions: BTreeMap, + pub atomic_relaxation: Option, + /// Compton profiles. An ACE photoatomic table carries them; an ENDF + /// evaluation does not, so for those they come from the auxiliary + /// tabulations via [`IncidentPhoton::add_photon_data`]. + pub compton_profiles: Option, + /// Bremsstrahlung and density-effect data, which no evaluation carries. + /// Filled by [`IncidentPhoton::add_photon_data`]. + pub bremsstrahlung: Option, +} + +/// Bremsstrahlung data attached to an element, on the shared grids. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Bremsstrahlung { + /// Mean excitation energy, in eV. + pub i: f64, + pub num_electrons: Vec, + /// Ionization energy of each subshell, in eV. + pub ionization_energy: Vec, + /// Incident electron kinetic energies, in eV. + pub electron_energy: Vec, + /// Reduced photon energies. + pub photon_energy: Vec, + /// Scaled cross sections in barns: one row per electron energy, one + /// column per reduced photon energy. + pub dcs: Vec>, +} + +/// The Compton profiles of an element, by shell. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ComptonProfiles { + pub num_electrons: Vec, + /// Binding energy in eV. + pub binding_energy: Vec, + /// The profile of each shell, against electron momentum. + pub j: Vec, +} + +impl IncidentPhoton { + /// Attach the auxiliary Compton profile and bremsstrahlung data. + /// + /// None of it is in the evaluation: it is looked up by atomic number in + /// tabulations that ship alongside, which is what the Python package does + /// at the end of `from_endf`. Kept as a separate call here because the + /// data lives in files the caller has to find — see + /// [`crate::PhotonData`]. + /// + /// Compton profiles already read from an ACE table are left alone, since + /// those came from the file being read and are specific to it. + pub fn add_photon_data(&mut self, data: &crate::PhotonData) { + if let Some(profile) = data.compton.get(&self.atomic_number) { + if self.compton_profiles.is_none() { + self.compton_profiles = Some(ComptonProfiles { + num_electrons: profile.num_electrons.clone(), + binding_energy: profile.binding_energy.clone(), + j: profile + .j + .iter() + .map(|row| Tabulated1D::new(data.pz.clone(), row.clone())) + .collect(), + }); + } + } + if let Some(brem) = data.bremsstrahlung.get(&self.atomic_number) { + self.bremsstrahlung = Some(Bremsstrahlung { + i: brem.i, + num_electrons: brem.num_electrons.clone(), + ionization_energy: brem.ionization_energy.clone(), + electron_energy: data.electron_energy.clone(), + photon_energy: data.photon_energy.clone(), + dcs: brem.dcs.clone(), + }); + } + } + + pub fn new(atomic_number: i64) -> IncidentPhoton { + IncidentPhoton { + atomic_number, + ..Default::default() + } + } + + /// The element's symbol, e.g. `"Fe"`. + pub fn name(&self) -> &'static str { + ATOMIC_SYMBOL + .get(self.atomic_number as usize) + .copied() + .unwrap_or("?") + } + + pub fn contains(&self, mt: i32) -> bool { + self.reactions.contains_key(&mt) + } + + pub fn get(&self, mt: i32) -> Option<&PhotonReaction> { + self.reactions.get(&mt) + } + + /// One reaction, by name — `"coherent"`, `"K"`. + pub fn get_by_name(&self, name: &str) -> Option<&PhotonReaction> { + self.get(photon_reaction_mt(name)?) + } + + /// Read photon data from a photoatomic evaluation. + /// + /// `relaxation` is a separate atomic relaxation evaluation, for libraries + /// that ship one apart from the photoatomic file. When the photoatomic + /// material carries its own MF=28, that is used and this overrides it. + pub fn from_endf( + photoatomic: &Material, + relaxation: Option<&Material>, + ) -> Result { + let metadata = photoatomic.mf1_mt451().ok_or(Error::Unsupported { + what: "a photoatomic evaluation with no MF=1 MT=451", + })?; + let mut data = IncidentPhoton::new(metadata.za / 1000); + + for &(mf, mt) in photoatomic.section_data.keys() { + if mf != 23 { + continue; + } + let Some(section) = photoatomic.mf23(mt) else { + continue; + }; + let mut rx = PhotonReaction::new(mt); + rx.xs = Some(section.sigma.clone()); + if (534..=599).contains(&mt) { + rx.subshell_binding_energy = Some(section.epe); + } + if (534..=572).contains(&mt) { + rx.fluorescence_yield = Some(section.efl); + } + data.reactions.insert(mt, rx); + } + + // MF=27 carries the form factors, keyed by their own MT numbers, which + // belong to the MF=23 reactions rather than standing alone. + for &(mf, mt) in photoatomic.section_data.keys() { + if mf != 27 { + continue; + } + let Some(section) = photoatomic.mf27(mt) else { + continue; + }; + let h = section.h.clone(); + match mt { + 502 | 504 => { + if let Some(rx) = data.reactions.get_mut(&mt) { + rx.scattering_factor = Some(h); + } + } + 505 => { + if let Some(rx) = data.reactions.get_mut(&502) { + rx.anomalous_imag = Some(h); + } + } + 506 => { + if let Some(rx) = data.reactions.get_mut(&502) { + rx.anomalous_real = Some(h); + } + } + _ => {} + } + } + + if photoatomic.mf28(533).is_some() { + data.atomic_relaxation = Some(AtomicRelaxation::from_endf(photoatomic)?); + } + if let Some(relaxation) = relaxation { + data.atomic_relaxation = Some(AtomicRelaxation::from_endf(relaxation)?); + } + + Ok(data) + } + + /// Read photon data from an ACE photoatomic table. + pub fn from_ace(table: &Table) -> Result { + if table.data_type()? != ace::TableType::Photoatomic { + return Err(Error::BadAceTable { + what: format!("{} is not a photoatomic table", table.name), + }); + } + let meta = ace::get_metadata(table.zaid()?, ace::MetastableScheme::Mcnp)?; + let mut data = IncidentPhoton::new(meta.z as i64); + + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| table.xss.get(i).copied()) + .unwrap_or(0.0) + }; + let slice = |i: i64, n: usize| -> Vec { (0..n as i64).map(|k| at(i + k)).collect() }; + + // The energy grid is stored as logarithms. + let n_energy = table.nxs[3].max(0) as usize; + let energy: Vec = slice(table.jxs[1], n_energy) + .into_iter() + .map(|e| e.exp() * EV_PER_MEV) + .collect(); + + // The five main cross sections sit in columns beside the grid, also as + // logarithms; a stored zero means zero rather than one. + for (mt, column) in [(502, 2), (504, 1), (517, 4), (522, 3), (525, 5)] { + let mut rx = PhotonReaction::new(mt); + let raw = slice(table.jxs[1] + (column * n_energy) as i64, n_energy); + let y: Vec = raw + .iter() + .map(|&v| if v == 0.0 { 0.0 } else { v.exp() }) + .collect(); + // Log-log, which is how the columns were stored. + rx.xs = Some(Tabulated1D::with_regions( + energy.clone(), + y, + vec![n_energy as i32], + vec![5], + )); + data.reactions.insert(mt, rx); + } + + // The Compton profiles the table carries. + let n_shell = table.nxs[5].max(0) as usize; + if n_shell != 0 { + let mut profiles = Vec::with_capacity(n_shell); + for k in 0..n_shell as i64 { + let loca = at(table.jxs[9] + k) as i64; + let jj = at(table.jxs[10] + loca - 1) as i32; + let m = at(table.jxs[10] + loca) as usize; + let idx = table.jxs[10] + loca + 1; + profiles.push(Tabulated1D::with_regions( + slice(idx, m), + slice(idx + m as i64, m), + vec![m as i32], + vec![jj], + )); + } + data.compton_profiles = Some(ComptonProfiles { + num_electrons: slice(table.jxs[6], n_shell), + binding_energy: slice(table.jxs[7], n_shell) + .into_iter() + .map(|e| e * EV_PER_MEV) + .collect(), + j: profiles, + }); + } + + // The subshell photoelectric cross sections, and the relaxation data + // that names their binding energies. + if table.nxs[7] > 0 { + let relaxation = AtomicRelaxation::from_ace(table)?; + let n_subshells = table.nxs[7]; + let designators: Vec = (0..n_subshells) + .map(|i| at(table.jxs[11] + i) as i64) + .collect(); + + let mut idx = table.jxs[16]; + for d in designators { + let mt = 533 + d as i32; + let mut rx = PhotonReaction::new(mt); + + // Stored as logarithms above the threshold and zero below it. + let raw = slice(idx, n_energy); + let y: Vec = raw + .iter() + .map(|&v| if v == 0.0 { 0.0 } else { v.exp() }) + .collect(); + let threshold = y.iter().position(|&v| v > 0.0).unwrap_or(0); + rx.xs = Some(Tabulated1D::with_regions( + energy[threshold..].to_vec(), + y[threshold..].to_vec(), + vec![(n_energy - threshold) as i32], + vec![5], + )); + idx += n_energy as i64; + + rx.subshell_binding_energy = SUBSHELLS + .get(d as usize) + .and_then(|shell| relaxation.binding_energy.get(shell)) + .copied(); + data.reactions.insert(mt, rx); + } + data.atomic_relaxation = Some(relaxation); + } + + Ok(data) + } + + /// Which reactions make up a redundant one, by the same sum rules the + /// neutron data uses. + pub fn reaction_components(&self, mt: i32) -> Vec { + let mut mts = Vec::new(); + if let Some(rule) = sum_rule(mt) { + for &component in rule { + mts.extend(self.reaction_components(component)); + } + } + if !mts.is_empty() { + return mts; + } + if self.contains(mt) { + vec![mt] + } else { + Vec::new() + } + } +} + +/// Cumulative distributions for a set of Compton profiles. +/// +/// Each profile is integrated over the momentum grid by the trapezoidal rule. +/// The result is deliberately left un-normalised, so each row ends near 0.5 +/// rather than 1: a profile is tabulated for positive momentum only and the +/// missing half is symmetric, which is what samplers expect. +/// +/// `j` is `n_shells` rows of `pz.len()` values. +pub fn compton_profile_cdfs(j: &[Vec], pz: &[f64]) -> Vec> { + j.iter() + .map(|row| { + let mut cdf = vec![0.0; row.len()]; + let mut running = 0.0; + for i in 1..row.len().min(pz.len()) { + running += 0.5 * (row[i - 1] + row[i]) * (pz[i] - pz[i - 1]); + cdf[i] = running; + } + cdf + }) + .collect() +} + +/// Which atomic-relaxation subshells each Compton-profile shell corresponds to. +/// +/// Returned in CSR form: Compton shell `c` maps to the subshells +/// `indices[offsets[c]..offsets[c + 1]]`, weighted by occupancy so the weights +/// of a group sum to one. An empty range means the shell has no clean +/// counterpart, which happens for the outer shells where the two orderings +/// diverge. +pub fn compton_subshell_map( + compton_num_electrons: &[f64], + subshell_num_electrons: &[f64], +) -> (Vec, Vec, Vec) { + let mut offsets = vec![0usize]; + let mut indices: Vec = Vec::new(); + let mut weights: Vec = Vec::new(); + let mut cursor = 0usize; + let mut stopped = false; + + for &c_occ in compton_num_electrons { + if !stopped && c_occ > 0.0 { + let mut acc = 0.0; + let mut group = Vec::new(); + let mut j = cursor; + // Take consecutive subshells until their occupancy reaches this + // Compton shell's. The tolerance keeps the one that completes it. + while j < subshell_num_electrons.len() && acc < c_occ - 1e-6 { + acc += subshell_num_electrons[j]; + group.push(j); + j += 1; + } + if !group.is_empty() && (acc - c_occ).abs() <= 1e-3 * 1.0f64.max(c_occ) { + for &k in &group { + indices.push(k); + weights.push(subshell_num_electrons[k] / c_occ); + } + cursor = j; + } else { + // The first mismatch means the two orderings have diverged, so + // this shell and every later one are dropped. + stopped = true; + } + } + offsets.push(indices.len()); + } + (offsets, indices, weights) +} + +#[cfg(test)] +mod tests { + use super::*; + + const PHOTOAT_H: &[u8] = include_bytes!("../../../tests/photoat-001_H_000.endf.xz"); + const ATOM_H: &[u8] = include_bytes!("../../../tests/atom-001_H_000.endf.xz"); + + fn material(raw: &[u8]) -> Material { + Material::from_str(&crate::testdata::text(raw)).unwrap() + } + + #[test] + fn names_the_photon_reactions_both_ways() { + assert_eq!(photon_reaction_name(502), Some("coherent")); + assert_eq!(photon_reaction_name(522), Some("photoelectric")); + // The subshell photoelectric reactions are named for their subshell. + assert_eq!(photon_reaction_name(534), Some("K")); + assert_eq!(photon_reaction_name(535), Some("L1")); + assert_eq!(photon_reaction_name(572), Some("Q3")); + assert_eq!(photon_reaction_name(1), None); + + assert_eq!(photon_reaction_mt("coherent"), Some(502)); + assert_eq!(photon_reaction_mt("K"), Some(534)); + assert_eq!(photon_reaction_mt("Q3"), Some(572)); + assert_eq!(photon_reaction_mt("nonsense"), None); + // The empty string is the unused zeroth entry, not a subshell. + assert_eq!(photon_reaction_mt(""), None); + + for mt in 501..600 { + if let Some(name) = photon_reaction_name(mt) { + assert_eq!(photon_reaction_mt(name), Some(mt), "{name} came back wrong"); + } + } + } + + #[test] + fn reads_a_photoatomic_evaluation() { + let m = material(PHOTOAT_H); + let d = IncidentPhoton::from_endf(&m, None).unwrap(); + assert_eq!(d.atomic_number, 1); + assert_eq!(d.name(), "H"); + assert_eq!( + d.reactions.keys().copied().collect::>(), + [501, 502, 504, 515, 516, 517, 522, 534] + ); + + // Coherent scattering carries a form factor and both anomalous terms, + // which arrive from MF=27 under MTs of their own. + let coherent = d.get(502).unwrap(); + assert!(coherent.scattering_factor.is_some()); + assert!(coherent.anomalous_real.is_some()); + assert!(coherent.anomalous_imag.is_some()); + // Incoherent has a form factor and no anomalous terms. + let incoherent = d.get(504).unwrap(); + assert!(incoherent.scattering_factor.is_some()); + assert!(incoherent.anomalous_real.is_none()); + + // The K-shell photoelectric reaction carries its binding energy and + // fluorescence yield; the total does not. + let k = d.get_by_name("K").unwrap(); + assert_eq!(k.mt, 534); + assert_eq!(k.subshell_binding_energy, Some(13.6)); + assert!(k.fluorescence_yield.is_some()); + assert!(d.get(501).unwrap().subshell_binding_energy.is_none()); + + // The total is a sum of the channels below it. + let components = d.reaction_components(501); + assert!(components.len() > 1); + assert!(!components.contains(&501)); + } + + #[test] + fn relaxation_data_can_come_from_a_separate_evaluation() { + let photoatomic = material(PHOTOAT_H); + let relaxation = material(ATOM_H); + + // Hydrogen's photoatomic file carries no MF=28 of its own. + let without = IncidentPhoton::from_endf(&photoatomic, None).unwrap(); + assert!(without.atomic_relaxation.is_none()); + + let with = IncidentPhoton::from_endf(&photoatomic, Some(&relaxation)).unwrap(); + let ar = with.atomic_relaxation.unwrap(); + // Hydrogen has one electron, in the K shell, bound by 13.6 eV. + assert_eq!(ar.subshells(), ["K"]); + assert_eq!(ar.binding_energy["K"], 13.6); + assert_eq!(ar.num_electrons["K"], 1.0); + // Nothing to relax into, so no transitions. + assert!(ar.transitions.is_empty()); + } + + #[test] + fn subshells_come_back_in_the_formats_order() { + // Alphabetically L1 sorts before M1 but after K; the format's order is + // by binding energy, which is what `subshells` has to give. + let ar = AtomicRelaxation { + binding_energy: BTreeMap::from([("M1", 1.0), ("K", 3.0), ("L2", 2.0)]), + ..Default::default() + }; + assert_eq!(ar.subshells(), ["K", "L2", "M1"]); + } + + #[test] + fn a_compton_cdf_integrates_the_profile() { + // A flat profile of height 2 over a unit-spaced grid accumulates 2 per + // step by the trapezoidal rule. + let pz = [0.0, 1.0, 2.0, 3.0]; + let j = vec![vec![2.0, 2.0, 2.0, 2.0]]; + assert_eq!( + compton_profile_cdfs(&j, &pz), + vec![vec![0.0, 2.0, 4.0, 6.0]] + ); + + // A triangle: the first step averages 0 and 1. + let j = vec![vec![0.0, 1.0, 0.0, 0.0]]; + assert_eq!( + compton_profile_cdfs(&j, &pz), + vec![vec![0.0, 0.5, 1.0, 1.0]] + ); + } + + #[test] + fn compton_shells_map_onto_the_subshells_that_fill_them() { + // Two Compton shells of 2 and 8 electrons against K, L1, L2, L3. + let (offsets, indices, weights) = compton_subshell_map(&[2.0, 8.0], &[2.0, 2.0, 2.0, 4.0]); + assert_eq!(offsets, [0, 1, 4]); + assert_eq!(indices, [0, 1, 2, 3]); + assert_eq!(weights, [1.0, 0.25, 0.25, 0.5]); + // The weights of each group sum to one. + assert_eq!(weights[1] + weights[2] + weights[3], 1.0); + } + + #[test] + fn a_mismatched_occupancy_stops_the_mapping() { + // The second Compton shell cannot be made from whole subshells, so it + // and everything after it is dropped. + let (offsets, indices, _) = compton_subshell_map(&[2.0, 7.0, 4.0], &[2.0, 2.0, 2.0, 4.0]); + assert_eq!(offsets, [0, 1, 1, 1]); + assert_eq!(indices, [0]); + } +} diff --git a/crates/endf/src/lib.rs b/crates/endf/src/lib.rs new file mode 100644 index 0000000..a93df83 --- /dev/null +++ b/crates/endf/src/lib.rs @@ -0,0 +1,73 @@ +//! A reader for ENDF-6 formatted evaluated nuclear data files. +//! +//! The layout follows the format itself: [`records`] holds the fixed-width +//! record primitives, [`function`] the tabulated function types, [`mf`] one +//! module per ENDF file (MF), and [`material`] the splitting of a file into +//! materials and sections. +//! +//! ```no_run +//! let material = endf::Material::from_file("n-095_Am_244.endf")?; +//! let total = material.mf3(1).expect("total cross section"); +//! println!("{} barns at {} eV", total.sigma.eval(0.0253), 0.0253); +//! # Ok::<(), endf::Error>(()) +//! ``` +//! +//! Everything here describes the file format and nothing more. A +//! simulation-ready projection of this data — reconstructed resonances, +//! summed reactions, unionised grids — belongs in a consumer built on top, +//! not in this crate. + +#![forbid(unsafe_code)] + +pub mod ace; +pub mod angle_energy; +pub mod chain; +pub mod data; +pub mod decay; +pub mod error; +pub mod fission_energy; +pub mod function; +pub mod incident_neutron; +pub mod incident_photon; +pub mod material; +pub mod mf; +pub mod njoy; +pub mod photon_data; +pub mod product; +pub mod radionuclide_production; +pub mod reaction; +pub mod records; +pub mod spline; + +#[cfg(test)] +mod testdata; +pub mod univariate; +pub mod urr; + +// The ACE table is where a transport code starts, so its types are at the +// root rather than behind `ace::`. `MetastableScheme` in particular is an +// argument to `IncidentNeutron::from_ace`, and needing a module path to call a +// re-exported method is the kind of friction that shows up immediately. +pub use ace::{get_table, get_tables, tables_from_str, MetastableScheme, Table, TableType}; +pub use angle_energy::{ + AngleEnergy, CorrelatedAngleEnergy, KalbachMann, NBodyPhaseSpace, UncorrelatedAngleEnergy, +}; +pub use chain::{Chain, Nuclide, ReactionInfo, REACTIONS}; +pub use data::{gnds_name, zam, EV_PER_MEV, K_BOLTZMANN}; +pub use decay::{Decay, DecayMode, FissionProductYields, FissioningNuclide, ProductYield}; +pub use error::{Error, Result}; +pub use fission_energy::FissionEnergyRelease; +pub use function::{Polynomial, Tabulated1D, Tabulated2D}; +pub use incident_neutron::IncidentNeutron; +pub use incident_photon::{AtomicRelaxation, IncidentPhoton, PhotonReaction}; +pub use material::{get_materials, materials_from_str, Interpretation, Material, Section}; +pub use photon_data::{ComptonProfile, PhotonData}; +pub use product::{EmissionMode, Product, Yield}; +pub use radionuclide_production::{ + isomer_table, isomer_table_from_materials, level_to_isomeric_state, radionuclide_production, + Isomer, IsomerTable, RadionuclideProduction, +}; +pub use reaction::{reaction_mt, reaction_name, Reaction, FISSION_MTS}; +pub use records::{float_endf, int_endf, Cont, Head, ListRecord, Matrix, Reader, Tab1, Tab2}; +pub use spline::CubicSpline; +pub use urr::ProbabilityTables; diff --git a/crates/endf/src/material.rs b/crates/endf/src/material.rs new file mode 100644 index 0000000..f569db7 --- /dev/null +++ b/crates/endf/src/material.rs @@ -0,0 +1,599 @@ +//! Splitting an ENDF-6 file into materials and their (MF, MT) sections. + +use std::collections::BTreeMap; +use std::path::Path; + +use crate::error::{Error, Result}; +use crate::mf; +use crate::records::{field, Reader}; + +/// A parsed section, one variant per MF/MT family. +/// +/// [`Section::Unparsed`] covers the files not yet ported to Rust. Their text is +/// still kept in [`Material::section_text`], so a consumer can fall back to the +/// Python reader for them while the port proceeds file by file. +#[derive(Debug, Clone, PartialEq)] +pub enum Section { + /// MF=1 MT=451, descriptive data and the section directory. + Mf1Mt451(Box), + /// MF=1 MT=452 or MT=456, total or prompt neutrons per fission. + Mf1Mt452(mf::mf1::Mf1Mt452), + /// MF=1 MT=455, delayed neutron data. + Mf1Mt455(mf::mf1::Mf1Mt455), + /// MF=1 MT=458, components of the fission energy release. + Mf1Mt458(mf::mf1::Mf1Mt458), + /// MF=1 MT=460, delayed photon data. + Mf1Mt460(mf::mf1::Mf1Mt460), + /// MF=2 MT=151, resonance parameters. + Mf2(Box), + /// MF=3, reaction cross sections. + Mf3(mf::mf3::Mf3), + /// MF=4, angular distributions. + Mf4(Box), + /// MF=5, energy distributions. + Mf5(Box), + /// MF=6, energy-angle distributions of reaction products. + Mf6(Box), + /// MF=7 MT=2, elastic thermal scattering. + Mf7Mt2(Box), + /// MF=7 MT=4, incoherent inelastic thermal scattering. + Mf7Mt4(Box), + /// MF=7 MT=451, thermal scattering general information. + Mf7Mt451(Box), + /// MF=8, radioactive nuclide production. + Mf8(Box), + /// MF=8 MT=454 or MT=459, fission product yields. + Mf8Mt454(Box), + /// MF=8 MT=457, radioactive decay data. + Mf8Mt457(Box), + /// MF=9 or MF=10, isomer multiplicities and production cross sections. + Mf9Mf10(Box), + /// MF=12, photon production multiplicities. + Mf12(Box), + /// MF=13, photon production cross sections. + Mf13(Box), + /// MF=14, photon angular distributions. + Mf14(Box), + /// MF=15, continuous photon energy spectra. + Mf15(Box), + /// MF=23, photo-atomic and electro-atomic cross sections. + Mf23(Box), + /// MF=26, electro-atomic secondary distributions. + Mf26(Box), + /// MF=27, atomic form factors and scattering functions. + Mf27(Box), + /// MF=28, atomic relaxation data. + Mf28(Box), + /// MF=33, covariances of neutron cross sections. + Mf33(Box), + /// MF=34, covariances of angular distributions. + Mf34(Box), + /// MF=40, covariances of radionuclide production. + Mf40(Box), + Unparsed { + mf: i32, + mt: i32, + }, +} + +/// An ENDF material: one evaluation, made up of (MF, MT) sections. +#[derive(Debug, Clone)] +pub struct Material { + /// ENDF material number. + pub mat: i32, + /// Raw text of each section, keyed by (MF, MT), control columns included. + pub section_text: BTreeMap<(i32, i32), String>, + /// Parsed form of each section. + pub section_data: BTreeMap<(i32, i32), Section>, +} + +/// Read a MAT/MF/MT control field. +/// +/// A blank field reads as zero, which is what the format means by it. Anything +/// present but not an integer is a malformed line and an error, rather than +/// being silently taken as zero. +fn control_field(line: &str, start: usize, end: usize) -> Result { + let s = field(line, start, end).trim(); + if s.is_empty() { + return Ok(0); + } + s.parse::().map_err(|_| Error::BadControlField { + line: line.to_string(), + }) +} + +/// The (MAT, MF, MT) control fields in the last 14 columns of a line. +fn control(line: &str) -> Result<(i32, i32, i32)> { + Ok(( + control_field(line, 66, 70)?, + control_field(line, 70, 72)?, + control_field(line, 72, 75)?, + )) +} + +/// What [`Material::interpret`] built, one variant per sublibrary that has a +/// high-level interface. +#[derive(Debug, Clone, PartialEq)] +pub enum Interpretation { + IncidentNeutron(Box), + IncidentPhoton(Box), +} + +impl Material { + /// Parse the first material in `text`, skipping the leading TPID record. + /// + /// Not `std::str::FromStr`: that trait's `Err` would have to be this + /// crate's error type anyway, and the inherent method keeps the name the + /// Python reader uses. + #[allow(clippy::should_implement_trait)] + pub fn from_str(text: &str) -> Result { + let lines: Vec<&str> = text.lines().collect(); + let mut cursor = usize::from(!lines.is_empty()); + Material::parse(&lines, &mut cursor) + } + + pub fn from_file(path: impl AsRef) -> Result { + let text = std::fs::read_to_string(path)?; + Material::from_str(&text) + } + + /// Parse one material starting at `cursor`, leaving `cursor` on the line + /// after the material's MEND record. + fn parse(lines: &[&str], cursor: &mut usize) -> Result { + // Evaluators sometimes write ill-formed TPID records, so the material + // number is taken from the first line that actually belongs to a file + // (MF != 0) rather than from the header. + let mat = loop { + let line = lines.get(*cursor).ok_or(Error::UnexpectedEof { + expected: "the start of a material", + })?; + let (m, mf, _) = control(line)?; + if mf != 0 { + break m; + } + *cursor += 1; + }; + + let mut section_text: BTreeMap<(i32, i32), String> = BTreeMap::new(); + loop { + // Advance to the next section head, or to the end of the material. + let (cur_mat, mf, mt) = loop { + let line = lines.get(*cursor).ok_or(Error::UnexpectedEof { + expected: "the next section", + })?; + let c = control(line)?; + if c.2 > 0 || c.0 == 0 { + break c; + } + *cursor += 1; + }; + + // MAT=0 is the MEND record: this material is done. + if cur_mat == 0 { + *cursor += 1; + break; + } + + // Collect the section's lines up to its SEND record (MT=0). + let mut body = String::new(); + loop { + let line = lines.get(*cursor).ok_or(Error::UnexpectedEof { + expected: "the end of a section", + })?; + *cursor += 1; + if control(line)?.2 == 0 { + break; + } + body.push_str(line); + body.push('\n'); + } + section_text.insert((mf, mt), body); + } + + let mut section_data = BTreeMap::new(); + for (&(mf, mt), text) in §ion_text { + section_data.insert((mf, mt), parse_section(mf, mt, text)?); + } + + Ok(Material { + mat, + section_text, + section_data, + }) + } + + /// The (MF, MT) sections present, in ascending order. + pub fn sections(&self) -> Vec<(i32, i32)> { + self.section_text.keys().copied().collect() + } + + pub fn contains(&self, mf: i32, mt: i32) -> bool { + self.section_data.contains_key(&(mf, mt)) + } + + pub fn get(&self, mf: i32, mt: i32) -> Option<&Section> { + self.section_data.get(&(mf, mt)) + } + + /// The MF=3 cross section for a reaction, if the material has one. + pub fn mf3(&self, mt: i32) -> Option<&mf::mf3::Mf3> { + match self.section_data.get(&(3, mt))? { + Section::Mf3(s) => Some(s), + _ => None, + } + } + + /// The MF=4 angular distribution for a reaction. + pub fn mf4(&self, mt: i32) -> Option<&mf::mf4::Mf4> { + match self.section_data.get(&(4, mt))? { + Section::Mf4(s) => Some(s), + _ => None, + } + } + + /// The MF=5 energy distributions for a reaction. + pub fn mf5(&self, mt: i32) -> Option<&mf::mf5::Mf5> { + match self.section_data.get(&(5, mt))? { + Section::Mf5(s) => Some(s), + _ => None, + } + } + + /// The MF=6 product distributions for a reaction. + pub fn mf6(&self, mt: i32) -> Option<&mf::mf6::Mf6> { + match self.section_data.get(&(6, mt))? { + Section::Mf6(s) => Some(s), + _ => None, + } + } + + /// The MF=8 radioactive production data for a reaction. + pub fn mf8(&self, mt: i32) -> Option<&mf::mf8::Mf8> { + match self.section_data.get(&(8, mt))? { + Section::Mf8(s) => Some(s), + _ => None, + } + } + + /// The MF=8 MT=457 radioactive decay data. + pub fn mf8_mt457(&self) -> Option<&mf::mf8::Mf8Mt457> { + match self.section_data.get(&(8, 457))? { + Section::Mf8Mt457(s) => Some(s), + _ => None, + } + } + + /// Fission product yields: MT=454 independent, MT=459 cumulative. + pub fn mf8_mt454(&self, mt: i32) -> Option<&mf::mf8::Mf8Mt454> { + match self.section_data.get(&(8, mt))? { + Section::Mf8Mt454(s) => Some(s), + _ => None, + } + } + + /// MF=9 isomer multiplicities for a reaction. + pub fn mf9(&self, mt: i32) -> Option<&mf::mf8::Mf9Mf10> { + match self.section_data.get(&(9, mt))? { + Section::Mf9Mf10(s) => Some(s), + _ => None, + } + } + + /// MF=10 isomer production cross sections for a reaction. + pub fn mf10(&self, mt: i32) -> Option<&mf::mf8::Mf9Mf10> { + match self.section_data.get(&(10, mt))? { + Section::Mf9Mf10(s) => Some(s), + _ => None, + } + } + + /// The MF=12 section for a reaction. + pub fn mf12(&self, mt: i32) -> Option<&mf::photon::Mf12> { + match self.section_data.get(&(12, mt))? { + Section::Mf12(s) => Some(s), + _ => None, + } + } + + /// The MF=13 section for a reaction. + pub fn mf13(&self, mt: i32) -> Option<&mf::photon::Mf13> { + match self.section_data.get(&(13, mt))? { + Section::Mf13(s) => Some(s), + _ => None, + } + } + + /// The MF=14 section for a reaction. + pub fn mf14(&self, mt: i32) -> Option<&mf::photon::Mf14> { + match self.section_data.get(&(14, mt))? { + Section::Mf14(s) => Some(s), + _ => None, + } + } + + /// The MF=15 section for a reaction. + pub fn mf15(&self, mt: i32) -> Option<&mf::photon::Mf15> { + match self.section_data.get(&(15, mt))? { + Section::Mf15(s) => Some(s), + _ => None, + } + } + + /// The MF=23 section for a reaction. + pub fn mf23(&self, mt: i32) -> Option<&mf::atomic::Mf23> { + match self.section_data.get(&(23, mt))? { + Section::Mf23(s) => Some(s), + _ => None, + } + } + + /// The MF=26 section for a reaction. + pub fn mf26(&self, mt: i32) -> Option<&mf::atomic::Mf26> { + match self.section_data.get(&(26, mt))? { + Section::Mf26(s) => Some(s), + _ => None, + } + } + + /// The MF=27 section for a reaction. + pub fn mf27(&self, mt: i32) -> Option<&mf::atomic::Mf27> { + match self.section_data.get(&(27, mt))? { + Section::Mf27(s) => Some(s), + _ => None, + } + } + + /// The MF=28 section for a reaction. + pub fn mf28(&self, mt: i32) -> Option<&mf::atomic::Mf28> { + match self.section_data.get(&(28, mt))? { + Section::Mf28(s) => Some(s), + _ => None, + } + } + + /// The MF=33 covariance section for a reaction. + pub fn mf33(&self, mt: i32) -> Option<&mf::covariance::Mf33> { + match self.section_data.get(&(33, mt))? { + Section::Mf33(s) => Some(s), + _ => None, + } + } + + /// The MF=34 covariance section for a reaction. + pub fn mf34(&self, mt: i32) -> Option<&mf::covariance::Mf34> { + match self.section_data.get(&(34, mt))? { + Section::Mf34(s) => Some(s), + _ => None, + } + } + + /// The MF=40 covariance section for a reaction. + pub fn mf40(&self, mt: i32) -> Option<&mf::covariance::Mf40> { + match self.section_data.get(&(40, mt))? { + Section::Mf40(s) => Some(s), + _ => None, + } + } + + /// The MF=2 MT=151 resonance parameters. + pub fn mf2(&self) -> Option<&mf::mf2::Mf2> { + match self.section_data.get(&(2, 151))? { + Section::Mf2(s) => Some(s), + _ => None, + } + } + + /// The MF=1 MT=451 descriptive data, which every material carries. + pub fn mf1_mt451(&self) -> Option<&mf::mf1::Mf1Mt451> { + match self.section_data.get(&(1, 451))? { + Section::Mf1Mt451(s) => Some(s), + _ => None, + } + } + + /// Build the high-level interface the material's sublibrary calls for. + /// + /// NSUB in MF=1 MT=451 says which: 3 is photoatomic, 10 incident neutron. + /// A photoatomic evaluation is interpreted on its own, so any atomic + /// relaxation data has to come from its own MF=28; pass a separate + /// evaluation to [`IncidentPhoton::from_endf`] directly when there is one. + pub fn interpret(&self) -> Result { + let nsub = self + .mf1_mt451() + .ok_or(Error::Unsupported { + what: "a material with no MF=1 MT=451 to interpret", + })? + .nsub; + match nsub { + 3 => Ok(Interpretation::IncidentPhoton(Box::new( + crate::IncidentPhoton::from_endf(self, None)?, + ))), + 10 => Ok(Interpretation::IncidentNeutron(Box::new( + crate::IncidentNeutron::from_endf(self)?, + ))), + _ => Err(Error::Unsupported { + what: "a sublibrary with no high-level interface (NSUB is not 3 or 10)", + }), + } + } + + /// A neutron yield: MT=452 total, MT=456 prompt. + pub fn mf1_mt452(&self, mt: i32) -> Option<&mf::mf1::Mf1Mt452> { + match self.section_data.get(&(1, mt))? { + Section::Mf1Mt452(s) => Some(s), + _ => None, + } + } + + /// The MF=1 MT=455 delayed neutron data. + pub fn mf1_mt455(&self) -> Option<&mf::mf1::Mf1Mt455> { + match self.section_data.get(&(1, 455))? { + Section::Mf1Mt455(s) => Some(s), + _ => None, + } + } + + /// The MF=1 MT=458 fission energy release. + pub fn mf1_mt458(&self) -> Option<&mf::mf1::Mf1Mt458> { + match self.section_data.get(&(1, 458))? { + Section::Mf1Mt458(s) => Some(s), + _ => None, + } + } + + /// The MF=1 MT=460 delayed photon data. + pub fn mf1_mt460(&self) -> Option<&mf::mf1::Mf1Mt460> { + match self.section_data.get(&(1, 460))? { + Section::Mf1Mt460(s) => Some(s), + _ => None, + } + } + + /// The sublibrary number (NSUB) from MT=451, which says what kind of + /// evaluation this is: 10 incident-neutron, 4 radioactive decay, and so on. + pub fn nsub(&self) -> Option { + Some(self.mf1_mt451()?.nsub) + } +} + +/// Dispatch a section to its file's parser. +/// +/// Each MF ported to Rust adds an arm here; everything else stays +/// [`Section::Unparsed`] with its text preserved. +fn parse_section(mf: i32, mt: i32, text: &str) -> Result
{ + let mut r = Reader::new(text); + Ok(match (mf, mt) { + (1, 451) => Section::Mf1Mt451(Box::new(mf::mf1::parse_mf1_mt451(&mut r)?)), + (1, 452) | (1, 456) => Section::Mf1Mt452(mf::mf1::parse_mf1_mt452(&mut r)?), + (1, 455) => Section::Mf1Mt455(mf::mf1::parse_mf1_mt455(&mut r)?), + (1, 458) => Section::Mf1Mt458(mf::mf1::parse_mf1_mt458(&mut r)?), + (1, 460) => Section::Mf1Mt460(mf::mf1::parse_mf1_mt460(&mut r)?), + (2, 151) => Section::Mf2(Box::new(mf::mf2::parse_mf2(&mut r)?)), + (3, _) => Section::Mf3(mf::mf3::parse_mf3(&mut r)?), + (4, _) => Section::Mf4(Box::new(mf::mf4::parse_mf4(&mut r)?)), + (5, _) => Section::Mf5(Box::new(mf::mf5::parse_mf5(&mut r)?)), + (6, _) => Section::Mf6(Box::new(mf::mf6::parse_mf6(&mut r)?)), + (7, 2) => Section::Mf7Mt2(Box::new(mf::mf7::parse_mf7_mt2(&mut r)?)), + (7, 4) => Section::Mf7Mt4(Box::new(mf::mf7::parse_mf7_mt4(&mut r)?)), + (7, 451) => Section::Mf7Mt451(Box::new(mf::mf7::parse_mf7_mt451(&mut r)?)), + (8, 454) | (8, 459) => Section::Mf8Mt454(Box::new(mf::mf8::parse_mf8_mt454(&mut r)?)), + (8, 457) => Section::Mf8Mt457(Box::new(mf::mf8::parse_mf8_mt457(&mut r)?)), + (8, _) => Section::Mf8(Box::new(mf::mf8::parse_mf8(&mut r)?)), + (9, _) | (10, _) => Section::Mf9Mf10(Box::new(mf::mf8::parse_mf9_mf10(&mut r, mf as i64)?)), + (12, _) => Section::Mf12(Box::new(mf::photon::parse_mf12(&mut r)?)), + (13, _) => Section::Mf13(Box::new(mf::photon::parse_mf13(&mut r)?)), + (14, _) => Section::Mf14(Box::new(mf::photon::parse_mf14(&mut r)?)), + (15, _) => Section::Mf15(Box::new(mf::photon::parse_mf15(&mut r)?)), + (23, _) => Section::Mf23(Box::new(mf::atomic::parse_mf23(&mut r)?)), + (26, _) => Section::Mf26(Box::new(mf::atomic::parse_mf26(&mut r)?)), + (27, _) => Section::Mf27(Box::new(mf::atomic::parse_mf27(&mut r)?)), + (28, _) => Section::Mf28(Box::new(mf::atomic::parse_mf28(&mut r)?)), + (33, _) => Section::Mf33(Box::new(mf::covariance::parse_mf33(&mut r)?)), + (34, _) => Section::Mf34(Box::new(mf::covariance::parse_mf34(&mut r, mt as i64)?)), + (40, _) => Section::Mf40(Box::new(mf::covariance::parse_mf40(&mut r)?)), + _ => Section::Unparsed { mf, mt }, + }) +} + +/// Read every material in an ENDF-6 file. +pub fn get_materials(path: impl AsRef) -> Result> { + let text = std::fs::read_to_string(path)?; + materials_from_str(&text) +} + +/// Read every material in the text of an ENDF-6 file. +pub fn materials_from_str(text: &str) -> Result> { + let lines: Vec<&str> = text.lines().collect(); + if lines.is_empty() { + return Ok(Vec::new()); + } + // Skip the TPID record that opens the file. + let mut cursor = 1usize; + let mut materials = Vec::new(); + while cursor < lines.len() { + // MAT=-1 is the TEND record that closes the file. + if control_field(lines[cursor], 66, 70)? == -1 { + break; + } + let before = cursor; + materials.push(Material::parse(&lines, &mut cursor)?); + debug_assert!(cursor > before, "parsing a material must consume lines"); + } + Ok(materials) +} + +#[cfg(test)] +mod tests { + use super::*; + + const FIXTURE: &[u8] = include_bytes!("../../../tests/n-095_Am_244.endf.xz"); + + #[test] + fn reads_the_material_number() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + assert_eq!(m.mat, 9552); + } + + #[test] + fn finds_the_expected_sections() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let sections = m.sections(); + // The evaluation opens with the descriptive MF=1/MT=451 section and + // carries resonance parameters and cross sections. + assert!(sections.contains(&(1, 451))); + assert!(sections.contains(&(2, 151))); + assert!(sections.contains(&(3, 1))); + assert!(sections.contains(&(3, 2))); + assert!(sections.contains(&(3, 18))); + assert!(!sections.is_empty()); + } + + #[test] + fn section_text_excludes_the_send_record() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let text = &m.section_text[&(3, 1)]; + for line in text.lines() { + let (_, mf, mt) = control(line).unwrap(); + assert_eq!(mf, 3); + assert_ne!(mt, 0, "a SEND record leaked into the section body"); + } + } + + #[test] + fn every_section_is_dispatched() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + assert_eq!(m.section_text.len(), m.section_data.len()); + } + + #[test] + fn reads_the_whole_file_as_one_material() { + let materials = materials_from_str(&crate::testdata::text(FIXTURE)).unwrap(); + assert_eq!(materials.len(), 1); + assert_eq!(materials[0].mat, 9552); + } + + #[test] + fn interprets_by_sublibrary() { + let neutron = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + match neutron.interpret().unwrap() { + Interpretation::IncidentNeutron(n) => assert_eq!(n.name(), "Am244"), + other => panic!("NSUB=10 gave {other:?}"), + } + + const PHOTOATOMIC: &[u8] = include_bytes!("../../../tests/photoat-001_H_000.endf.xz"); + let photon = Material::from_str(&crate::testdata::text(PHOTOATOMIC)).unwrap(); + match photon.interpret().unwrap() { + Interpretation::IncidentPhoton(p) => assert_eq!(p.atomic_number, 1), + other => panic!("NSUB=3 gave {other:?}"), + } + } + + #[test] + fn a_sublibrary_with_no_interface_says_so() { + // Thermal scattering: NSUB=12, which has no high-level class in either + // reader. + const TSL: &[u8] = include_bytes!("../../../tests/tsl-s-CH4.endf.xz"); + let m = Material::from_str(&crate::testdata::text(TSL)).unwrap(); + assert!(m.interpret().is_err()); + } +} diff --git a/crates/endf/src/mf/atomic.rs b/crates/endf/src/mf/atomic.rs new file mode 100644 index 0000000..390e386 --- /dev/null +++ b/crates/endf/src/mf/atomic.rs @@ -0,0 +1,265 @@ +//! MF=23, 26, 27 and 28: photo-atomic and electro-atomic data. +//! +//! Grouped into one module because the four files describe one thing between +//! them: the photon and electron interaction cross sections (MF=23), the +//! secondary distributions of the electro-atomic ones (MF=26), the form factors +//! and scattering functions that modify coherent and incoherent scattering +//! (MF=27), and how the ionised atom relaxes afterwards (MF=28). + +use crate::error::Result; +use crate::function::Tabulated1D; +use crate::mf::mf6::{ + parse_continuum_energy_angle, parse_discrete_two_body, ContinuumEnergyAngle, DiscreteTwoBody, +}; +use crate::records::Reader; + +// ------------------------------------------------------------------------- +// MF=23 +// ------------------------------------------------------------------------- + +/// MF=23: a photo-atomic or electro-atomic cross section. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf23 { + pub za: i64, + pub awr: f64, + /// Subshell binding energy, for the photoelectric subshell reactions. + pub epe: f64, + /// Fluorescence yield. + pub efl: f64, + pub sigma: Tabulated1D, +} + +/// Parse an MF=23 section. +pub fn parse_mf23(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let tab = reader.tab1_record()?; + Ok(Mf23 { + za: head.za, + awr: head.awr, + epe: tab.c1, + efl: tab.c2, + sigma: tab.table, + }) +} + +// ------------------------------------------------------------------------- +// MF=26 +// ------------------------------------------------------------------------- + +/// One product of an electro-atomic reaction. +#[derive(Debug, Clone, PartialEq)] +pub struct AtomicProduct { + /// ZA of the product: 0 a photon, 11 an electron. + pub zap: i64, + pub awi: f64, + pub law: i64, + /// Multiplicity as a function of incident energy. + pub yield_: Tabulated1D, + pub distribution: ElectroAtomicDistribution, +} + +/// The distribution of an electro-atomic product, by law. +#[derive(Debug, Clone, PartialEq)] +pub enum ElectroAtomicDistribution { + /// A law the reader does not recognise, which the Python reader warns + /// about and otherwise ignores. + None, + /// LAW=1, shared with MF=6. + ContinuumEnergyAngle(Box), + /// LAW=2, shared with MF=6. + DiscreteTwoBody(Box), + /// LAW=8: the energy transferred to the atom by excitation. + EnergyTransfer(Tabulated1D), +} + +/// MF=26: secondary distributions for electro-atomic data. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf26 { + pub za: i64, + pub awr: f64, + pub nk: i64, + pub products: Vec, +} + +/// Parse an MF=26 section. +pub fn parse_mf26(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let nk = head.n1; + let mut data = Mf26 { + za: head.za, + awr: head.awr, + nk, + products: Vec::new(), + }; + + for _ in 0..nk.max(0) { + let tab = reader.tab1_record()?; + let law = tab.l2; + let distribution = match law { + 1 => ElectroAtomicDistribution::ContinuumEnergyAngle(Box::new( + parse_continuum_energy_angle(reader)?, + )), + 2 => ElectroAtomicDistribution::DiscreteTwoBody(Box::new(parse_discrete_two_body( + reader, + )?)), + 8 => ElectroAtomicDistribution::EnergyTransfer(reader.tab1_record()?.table), + _ => ElectroAtomicDistribution::None, + }; + data.products.push(AtomicProduct { + zap: tab.c1 as i64, + awi: tab.c2, + law, + yield_: tab.table, + distribution, + }); + } + + Ok(data) +} + +// ------------------------------------------------------------------------- +// MF=27 +// ------------------------------------------------------------------------- + +/// MF=27: an atomic form factor or scattering function. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf27 { + pub za: i64, + pub awr: f64, + /// Atomic number, written in a C field so it is a float here. + pub z: f64, + /// The form factor or scattering function against momentum transfer. + pub h: Tabulated1D, +} + +/// Parse an MF=27 section. +pub fn parse_mf27(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let tab = reader.tab1_record()?; + Ok(Mf27 { + za: head.za, + awr: head.awr, + z: tab.c2, + h: tab.table, + }) +} + +// ------------------------------------------------------------------------- +// MF=28 +// ------------------------------------------------------------------------- + +/// The relaxation data for one subshell. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Subshell { + /// Subshell designator, written in a C field so it is a float here. + pub subi: f64, + /// Number of transitions. + pub ntr: i64, + /// Binding energy. + pub ebi: f64, + /// Number of electrons in the subshell when neutral. + pub eln: f64, + /// Secondary subshell of each transition. + pub subj: Vec, + /// Tertiary subshell, zero for a radiative transition. + pub subk: Vec, + /// Energy of each transition. + pub etr: Vec, + /// Fractional probability of each transition. + pub ftr: Vec, +} + +/// MF=28: atomic relaxation data. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf28 { + pub za: i64, + pub awr: f64, + pub nss: i64, + pub shells: Vec, +} + +fn column(values: &[f64], offset: usize, stride: usize) -> Vec { + values + .iter() + .skip(offset) + .step_by(stride) + .copied() + .collect() +} + +/// Parse an MF=28 section. +pub fn parse_mf28(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let nss = head.n1; + let mut data = Mf28 { + za: head.za, + awr: head.awr, + nss, + shells: Vec::new(), + }; + + for _ in 0..nss.max(0) { + let list = reader.list_record()?; + let v = &list.values; + // The first six values describe the subshell; the transitions follow + // in groups of six. + data.shells.push(Subshell { + subi: list.cont.c1, + ntr: list.cont.n2, + ebi: v.first().copied().unwrap_or(0.0), + eln: v.get(1).copied().unwrap_or(0.0), + subj: column(v, 6, 6), + subk: column(v, 7, 6), + etr: column(v, 8, 6), + ftr: column(v, 9, 6), + }); + } + + Ok(data) +} + +#[cfg(test)] +mod tests { + use crate::material::Material; + + const PHOTOAT_H: &[u8] = include_bytes!("../../../../tests/photoat-001_H_000.endf.xz"); + const ATOM_H: &[u8] = include_bytes!("../../../../tests/atom-001_H_000.endf.xz"); + + #[test] + fn reads_photo_atomic_cross_sections() { + let m = Material::from_str(&crate::testdata::text(PHOTOAT_H)).unwrap(); + // MT=501 is the total photon interaction cross section. + let total = m.mf23(501).expect("MF=23 MT=501 is present"); + assert_eq!(total.za, 1000, "photo-atomic data is per element, so A=0"); + assert!(!total.sigma.x.is_empty()); + assert!(total.sigma.x.windows(2).all(|w| w[1] >= w[0])); + assert!(total.sigma.y.iter().all(|&v| v >= 0.0)); + } + + #[test] + fn reads_the_incoherent_scattering_function() { + let m = Material::from_str(&crate::testdata::text(PHOTOAT_H)).unwrap(); + // MT=502 coherent form factor, MT=504 incoherent scattering function. + let sf = m.mf27(504).expect("MF=27 MT=504 is present"); + assert_eq!(sf.z, 1.0, "hydrogen"); + // The incoherent scattering function rises from 0 towards Z. + assert!(sf.h.y.first().copied().unwrap() >= 0.0); + assert!(sf.h.y.last().copied().unwrap() <= 1.0 + 1e-9); + } + + #[test] + fn reads_atomic_relaxation() { + let m = Material::from_str(&crate::testdata::text(ATOM_H)).unwrap(); + let relax = m.mf28(533).expect("MF=28 MT=533 is present"); + assert_eq!(relax.shells.len(), relax.nss as usize); + // Hydrogen has only the K shell, and with one electron there is + // nothing to relax from, so it lists no transitions. + assert_eq!(relax.shells.len(), 1); + let k = &relax.shells[0]; + assert_eq!(k.subi, 1.0, "the K shell"); + assert_eq!(k.eln, 1.0, "one electron"); + assert!(k.ebi > 0.0, "binding energy"); + assert_eq!(k.ntr, 0); + assert!(k.subj.is_empty()); + } +} diff --git a/crates/endf/src/mf/covariance.rs b/crates/endf/src/mf/covariance.rs new file mode 100644 index 0000000..7994827 --- /dev/null +++ b/crates/endf/src/mf/covariance.rs @@ -0,0 +1,439 @@ +//! MF=33, 34 and 40: covariances. +//! +//! Grouped into one module because MF=40 reuses MF=33's subsection format +//! verbatim, and MF=34 is the same idea applied to angular distributions. + +use crate::error::{Error, Result}; +use crate::records::Reader; + +// ------------------------------------------------------------------------- +// MF=33 +// ------------------------------------------------------------------------- + +/// An NC-type sub-subsection: a covariance derived from other reactions. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct NcSubsection { + pub lty: i64, + pub e1: f64, + pub e2: f64, + /// LTY=0. + pub nci: i64, + pub ci: Vec, + pub xmti: Vec, + /// LTY/=0. + pub mats: i64, + pub mts: i64, + pub nei: i64, + pub xmfs: f64, + pub xlfss: f64, + pub ei: Vec, + pub wei: Vec, +} + +/// An NI-type sub-subsection: a covariance given explicitly. +/// +/// `lb` selects the layout, and which fields are populated follows from it. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct NiSubsection { + pub lt: i64, + pub ls: i64, + pub lb: i64, + pub nt: i64, + pub np: i64, + pub ne: i64, + pub ner: i64, + pub nec: i64, + /// LB 0 to 4, and LB 8 or 9. + pub ek: Vec, + pub fk: Vec, + /// LB 0 to 4 only: the second (E, F) table. + pub el: Vec, + pub fl: Vec, + /// LB=5: the covariance matrix, in the format's packed order. + pub fkk: Vec, + /// LB=6. + pub er: Vec, + pub ec: Vec, + pub fkl: Vec, +} + +/// One MF=33 subsection: the covariance of this reaction with another. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf33Subsection { + pub xmf1: f64, + pub xlfs1: f64, + pub mat1: i64, + pub mt1: i64, + pub nc: i64, + pub ni: i64, + pub nc_subsections: Vec, + pub ni_subsections: Vec, +} + +/// MF=33: covariances of neutron cross sections. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf33 { + pub za: i64, + pub awr: f64, + /// MT of the reaction this one is lumped into, if any. + pub mtl: i64, + pub nl: i64, + pub subsections: Vec, +} + +fn column(values: &[f64], offset: usize, stride: usize) -> Vec { + values + .iter() + .skip(offset) + .step_by(stride) + .copied() + .collect() +} + +/// Parse one MF=33 subsection. Shared with MF=40, which uses the same format. +pub fn parse_mf33_subsection(reader: &mut Reader) -> Result { + let c = reader.cont_record()?; + let mut sub = Mf33Subsection { + xmf1: c.c1, + xlfs1: c.c2, + mat1: c.l1, + mt1: c.l2, + nc: c.n1, + ni: c.n2, + ..Default::default() + }; + + for _ in 0..sub.nc.max(0) { + let lty = reader.cont_record()?.l2; + let list = reader.list_record()?; + let v = &list.values; + let subsub = if lty == 0 { + NcSubsection { + lty, + e1: list.cont.c1, + e2: list.cont.c2, + nci: list.cont.n2, + ci: column(v, 0, 2), + xmti: column(v, 1, 2), + ..Default::default() + } + } else { + NcSubsection { + lty, + e1: list.cont.c1, + e2: list.cont.c2, + mats: list.cont.l1, + mts: list.cont.l2, + nei: list.cont.n2, + xmfs: v.first().copied().unwrap_or(0.0), + xlfss: v.get(1).copied().unwrap_or(0.0), + ei: column(&v[2.min(v.len())..], 0, 2), + wei: column(&v[2.min(v.len())..], 1, 2), + ..Default::default() + } + }; + // One entry per subsection, whatever LTY is. Both readers used to + // append the LTY=0 case twice; see + // . + sub.nc_subsections.push(subsub); + } + + for _ in 0..sub.ni.max(0) { + // The layout depends on LB, which is in the record about to be read, + // so peek at it first. + let lb = reader.peek_cont_record()?.l2; + let list = reader.list_record()?; + let v = &list.values; + let mut subsub = NiSubsection { + lb, + nt: list.cont.n1, + ..Default::default() + }; + match lb { + 0..=4 => { + subsub.lt = list.cont.l1; + subsub.np = list.cont.n2; + let split = (subsub.nt - subsub.np).clamp(0, v.len() as i64) as usize; + let (k, l) = v.split_at(split); + subsub.ek = column(k, 0, 2); + subsub.fk = column(k, 1, 2); + subsub.el = column(l, 0, 2); + subsub.fl = column(l, 1, 2); + } + 5 => { + subsub.ls = list.cont.l1; + subsub.ne = list.cont.n2; + let ne = subsub.ne.clamp(0, v.len() as i64) as usize; + subsub.ek = v[..ne].to_vec(); + // Left in the format's packed order, as upstream does. + subsub.fkk = v[ne..].to_vec(); + } + 6 => { + subsub.ner = list.cont.n2; + let ner = subsub.ner.max(0) as usize; + subsub.nec = if ner > 0 { + (subsub.nt - 1) / subsub.ner + } else { + 0 + }; + let nec = subsub.nec.max(0) as usize; + subsub.er = v[..ner.min(v.len())].to_vec(); + subsub.ec = v[ner.min(v.len())..(ner + nec).min(v.len())].to_vec(); + subsub.fkl = v[(ner + nec).min(v.len())..].to_vec(); + } + 8 | 9 => { + subsub.lt = list.cont.l1; + subsub.np = list.cont.n2; + subsub.ek = column(v, 0, 2); + subsub.fk = column(v, 1, 2); + } + _ => { + return Err(Error::Unsupported { + what: "an unrecognised MF=33 LB value", + }) + } + } + sub.ni_subsections.push(subsub); + } + + Ok(sub) +} + +/// Parse an MF=33 section. +pub fn parse_mf33(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf33 { + za: head.za, + awr: head.awr, + mtl: head.l2, + nl: head.n2, + subsections: Vec::new(), + }; + for _ in 0..data.nl.max(0) { + data.subsections.push(parse_mf33_subsection(reader)?); + } + Ok(data) +} + +// ------------------------------------------------------------------------- +// MF=34 +// ------------------------------------------------------------------------- + +/// The covariance blocks of one (L, L1) pair. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf34SubSubsection { + /// The symmetry flag of each covariance block. + pub ls: Vec, + /// The covariance matrix type of each block. Both readers used to fill + /// this with LS; see + /// . + pub lb: Vec, + pub nt: Vec, + pub ne: Vec, + pub data: Vec>, +} + +/// One MF=34 subsection. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf34Subsection { + pub mat1: i64, + pub mt1: i64, + pub nl: i64, + pub nss: i64, + pub lct: i64, + /// Legendre order of each sub-subsection. Floats, as upstream stores them. + pub l: Vec, + pub l1: Vec, + pub ni: Vec, + pub subsubsections: Vec, +} + +/// MF=34: covariances of angular distributions. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf34 { + pub za: i64, + pub awr: f64, + pub ltt: i64, + pub nmt1: i64, + /// One per (MAT1, MT1) pair the section covers. + /// + /// Both readers used to build these and then drop them on the floor, so + /// this was always empty; see + /// . + pub subsections: Vec, +} + +/// Parse an MF=34 section. `mt` is the reaction the section belongs to, which +/// the subsection count depends on. +pub fn parse_mf34(reader: &mut Reader, mt: i64) -> Result { + let head = reader.head_record()?; + let mut data = Mf34 { + za: head.za, + awr: head.awr, + ltt: head.l2, + nmt1: head.n2, + subsections: Vec::new(), + }; + + for _ in 0..data.nmt1.max(0) { + let c = reader.cont_record()?; + let (mat1, mt1, nl, nl1) = (c.l1, c.l2, c.n1, c.n2); + // A reaction's covariance with itself is symmetric, so only the upper + // triangle is stored. + let nss = if mt1 == 0 || mt == mt1 { + nl * (nl + 1) / 2 + } else { + nl * nl1 + }; + + let mut sub = Mf34Subsection { + mat1, + mt1, + nl, + nss, + ..Default::default() + }; + + for n in 0..nss.max(0) { + let c = reader.cont_record()?; + let ni = c.n2; + sub.l.push(c.l1 as f64); + sub.l1.push(c.l2 as f64); + sub.ni.push(ni as f64); + if n == 0 { + sub.lct = c.n1; + } + + let mut subsub = Mf34SubSubsection::default(); + for _ in 0..ni.max(0) { + let list = reader.list_record()?; + subsub.ls.push(list.cont.l1 as f64); + subsub.lb.push(list.cont.l2 as f64); + subsub.nt.push(list.cont.n1 as f64); + subsub.ne.push(list.cont.n2 as f64); + subsub.data.push(list.values); + } + sub.subsubsections.push(subsub); + } + + data.subsections.push(sub); + } + + Ok(data) +} + +// ------------------------------------------------------------------------- +// MF=40 +// ------------------------------------------------------------------------- + +/// One MF=40 subsection: the covariance for one reaction product. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf40Subsection { + pub qm: f64, + pub qi: f64, + pub izap: i64, + pub lfs: i64, + pub nl: i64, + /// Each has the same format as an MF=33 subsection. + pub subsubsections: Vec, +} + +/// MF=40: covariances of radionuclide production cross sections. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf40 { + pub za: i64, + pub awr: f64, + pub lis: i64, + pub ns: i64, + pub subsections: Vec, +} + +/// Parse an MF=40 section. +pub fn parse_mf40(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf40 { + za: head.za, + awr: head.awr, + lis: head.l1, + ns: head.n1, + subsections: Vec::new(), + }; + + for _ in 0..data.ns.max(0) { + let c = reader.cont_record()?; + let mut sub = Mf40Subsection { + qm: c.c1, + qi: c.c2, + izap: c.l1, + lfs: c.l2, + nl: c.n2, + subsubsections: Vec::new(), + }; + for _ in 0..sub.nl.max(0) { + sub.subsubsections.push(parse_mf33_subsection(reader)?); + } + data.subsections.push(sub); + } + + Ok(data) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn f(v: f64) -> String { + format!("{v:>11}") + } + fn i(v: i64) -> String { + format!("{v:>11}") + } + fn line(fields: [String; 6]) -> String { + format!("{:<66}9999341251\n", fields.concat()) + } + + /// MF=34 keeps its subsections, and LB holds LB rather than a copy of LS. + /// Both were broken; see + /// . + #[test] + fn mf34_keeps_its_subsections_and_reads_lb() { + // NMT1=1; one (L, L1) pair; one NI block with LS=7 and LB=5, chosen + // so that copying one into the other is unmistakable. + let text = line([f(26000.0), f(55.365), i(0), i(1), i(0), i(1)]) + + &line([f(0.0), f(0.0), i(0), i(0), i(1), i(1)]) + + &line([f(0.0), f(0.0), i(1), i(1), i(1), i(1)]) + + &line([f(0.0), f(0.0), i(7), i(5), i(2), i(1)]) + + &line([f(1.0), f(2.0), f(0.0), f(0.0), f(0.0), f(0.0)]); + + let d = parse_mf34(&mut Reader::new(&text), 251).unwrap(); + assert_eq!(d.nmt1, 1); + assert_eq!(d.subsections.len(), 1, "the parsed subsection is kept"); + + let sub = &d.subsections[0]; + assert_eq!(sub.nl, 1); + assert_eq!(sub.subsubsections.len(), 1); + + let subsub = &sub.subsubsections[0]; + assert_eq!(subsub.ls, [7.0], "LS is the symmetry flag"); + assert_eq!(subsub.lb, [5.0], "LB is the matrix type, not a copy of LS"); + assert_eq!(subsub.nt, [2.0]); + assert_eq!(subsub.data[0], [1.0, 2.0]); + } + + #[test] + fn mf33_reads_an_ni_subsection() { + // NC=0, NI=1, LB=5: a covariance matrix with its energy grid. + let text = line([f(0.0), f(0.0), i(0), i(2), i(0), i(1)]) + + &line([f(0.0), f(0.0), i(1), i(5), i(5), i(3)]) + + &line([f(1.0), f(2.0), f(3.0), f(10.0), f(20.0), f(0.0)]); + + let sub = parse_mf33_subsection(&mut Reader::new(&text)).unwrap(); + assert_eq!(sub.mt1, 2); + assert_eq!(sub.ni_subsections.len(), 1); + let ni = &sub.ni_subsections[0]; + assert_eq!(ni.lb, 5); + assert_eq!(ni.ne, 3); + assert_eq!(ni.ek, vec![1.0, 2.0, 3.0]); + assert_eq!(ni.fkk, vec![10.0, 20.0]); + } +} diff --git a/crates/endf/src/mf/mf1.rs b/crates/endf/src/mf/mf1.rs new file mode 100644 index 0000000..617ce3f --- /dev/null +++ b/crates/endf/src/mf/mf1.rs @@ -0,0 +1,380 @@ +//! MF=1, descriptive data, neutron yields and fission energy release. + +use crate::error::Result; +use crate::function::{Tabulated1D, Tabulated2D}; +use crate::records::{field, Reader}; + +/// A neutron yield (nu-bar), in whichever of the two forms the evaluation uses. +/// +/// LNU=1 gives polynomial coefficients, LNU=2 a tabulation. Evaluations mix the +/// two freely — U235, U238 and Pu239 carry a tabulated prompt yield alongside a +/// polynomial delayed one — so the form is recorded per quantity, never assumed. +#[derive(Debug, Clone, PartialEq, Default)] +pub enum Nu { + /// LNU=1: coefficients in ascending powers of incident energy. + Polynomial(Vec), + /// LNU=2: tabulated against incident energy. + Tabulated(Tabulated1D), + /// LNU was neither 1 nor 2. + #[default] + Absent, +} + +/// MF=1 MT=451: descriptive data and the section directory. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf1Mt451 { + pub za: i64, + pub awr: f64, + pub lrp: i64, + pub lfi: i64, + pub nlib: i64, + pub nmod: i64, + pub elis: f64, + pub sta: f64, + pub lis: i64, + pub liso: i64, + pub nfor: i64, + pub awi: f64, + pub emax: f64, + pub lrel: i64, + pub nsub: i64, + pub nver: i64, + pub temp: f64, + pub ldrv: i64, + pub nwd: i64, + pub nxc: i64, + /// Target name, e.g. `" 95-Am-244 "`. `None` when the evaluation writes + /// fewer than five text records, which leaves the whole header absent. + pub zsymam: Option, + pub alab: Option, + pub edate: Option, + pub auth: Option, + pub reference: Option, + pub ddate: Option, + pub rdate: Option, + pub endate: Option, + pub hsub: Vec, + pub description: Vec, + /// The directory: (MF, MT, number of records, modification number). + pub section_list: Vec<(i64, i64, i64, i64)>, +} + +/// MF=1 MT=452 or MT=456: total or prompt neutrons per fission. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf1Mt452 { + pub za: i64, + pub awr: f64, + pub lnu: i64, + pub nu: Nu, +} + +/// Delayed-group constants at one incident energy (LDG=1). +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DelayedGroupConstants { + pub energy: f64, + pub lambda: Vec, + pub alpha: Vec, +} + +/// MF=1 MT=455: delayed neutron data. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf1Mt455 { + pub za: i64, + pub awr: f64, + pub ldg: i64, + pub lnu: i64, + /// LDG=0: decay constants, energy independent. + pub lambda: Vec, + /// LDG=1: interpolation across incident energy. + pub e_int: Option, + /// LDG=1: the constants at each incident energy. + pub constants: Vec, + pub nu: Nu, +} + +/// One component of the fission energy release. +/// +/// The two forms are what MT=458 actually stores, and they survive into the +/// converted data unchanged: a component is either polynomial coefficients or a +/// tabulation, never both, and which one it is varies per component within a +/// single evaluation. +#[derive(Debug, Clone, PartialEq)] +pub enum FissionEnergyRelease { + /// (coefficient, uncertainty) in ascending powers of incident energy. + Polynomial(Vec<(f64, f64)>), + /// LFC=1: tabulated against incident energy. + Tabulated { ldrv: i64, eifc: Tabulated1D }, +} + +/// The nine components of the fission energy release, in the order MT=458 +/// stores them. `IFC` in the format indexes this list, one-based. +pub const FISSION_ENERGY_COMPONENTS: [&str; 9] = + ["EFR", "ENP", "END", "EGP", "EGD", "EB", "ENU", "ER", "ET"]; + +/// MF=1 MT=458: components of the fission energy release. +#[derive(Debug, Clone, PartialEq)] +pub struct Mf1Mt458 { + /// Read from a CONT rather than a HEAD record, so this is the raw float the + /// field holds and not the integer every other section reports. See + /// . + pub za: f64, + pub awr: f64, + pub lfc: i64, + pub nply: i64, + pub nfc: i64, + /// One entry per name in [`FISSION_ENERGY_COMPONENTS`], same order. + pub components: Vec, +} + +impl Mf1Mt458 { + /// A component by its MT=458 name, e.g. `"EGP"` for prompt fission photons. + pub fn component(&self, name: &str) -> Option<&FissionEnergyRelease> { + let i = FISSION_ENERGY_COMPONENTS.iter().position(|&n| n == name)?; + self.components.get(i) + } +} + +/// MF=1 MT=460: delayed photon data. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf1Mt460 { + pub za: i64, + pub awr: f64, + pub lo: i64, + pub ng: i64, + /// LO=1: the energy of each discrete photon. + pub energy: Vec, + /// LO=1: time dependence of each photon, aligned with `energy`. + pub time: Vec, + /// LO=2: decay constants for the precursors. + pub lambda: Vec, +} + +/// Read a nu-bar in whichever form `lnu` selects. +fn parse_nu(reader: &mut Reader, lnu: i64) -> Result { + Ok(match lnu { + 1 => Nu::Polynomial(reader.list_record()?.values), + 2 => Nu::Tabulated(reader.tab1_record()?.table), + _ => Nu::Absent, + }) +} + +/// Trim a fixed-width text field, keeping `None` distinct from empty. +fn text_field(line: &str, start: usize, end: usize) -> Option { + Some(field(line, start, end).to_string()) +} + +/// Parse MF=1 MT=451. +pub fn parse_mf1_mt451(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let c1 = reader.cont_record()?; + let c2 = reader.cont_record()?; + let c3 = reader.cont_record()?; + + let mut data = Mf1Mt451 { + za: head.za, + awr: head.awr, + lrp: head.l1, + lfi: head.l2, + nlib: head.n1, + nmod: head.n2, + elis: c1.c1, + sta: c1.c2, + lis: c1.l1, + liso: c1.l2, + nfor: c1.n2, + awi: c2.c1, + emax: c2.c2, + lrel: c2.l1, + nsub: c2.n1, + nver: c2.n2, + temp: c3.c1, + ldrv: c3.l1, + nwd: c3.n1, + nxc: c3.n2, + ..Default::default() + }; + + let nwd = data.nwd.max(0) as usize; + let mut text = Vec::with_capacity(nwd); + for _ in 0..nwd { + text.push(reader.text_record()?.to_string()); + } + + // Fewer than five text records means the evaluation left the descriptive + // header out entirely; the reader reports that rather than inventing it. + if text.len() >= 5 { + data.zsymam = text_field(&text[0], 0, 11); + data.alab = text_field(&text[0], 11, 22); + data.edate = text_field(&text[0], 22, 32); + data.auth = text_field(&text[0], 32, 66); + data.reference = text_field(&text[1], 1, 22); + data.ddate = text_field(&text[1], 22, 32); + data.rdate = text_field(&text[1], 33, 43); + data.endate = text_field(&text[1], 55, 63); + data.hsub = text[2..5].to_vec(); + data.description = text[5..].to_vec(); + } + + for _ in 0..data.nxc.max(0) { + let c = reader.cont_record()?; + data.section_list.push((c.l1, c.l2, c.n1, c.n2)); + } + + Ok(data) +} + +/// Parse MF=1 MT=452 or MT=456. +pub fn parse_mf1_mt452(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let lnu = head.l2; + Ok(Mf1Mt452 { + za: head.za, + awr: head.awr, + lnu, + nu: parse_nu(reader, lnu)?, + }) +} + +/// Parse MF=1 MT=455. +pub fn parse_mf1_mt455(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let (ldg, lnu) = (head.l1, head.l2); + let mut data = Mf1Mt455 { + za: head.za, + awr: head.awr, + ldg, + lnu, + ..Default::default() + }; + + if ldg == 0 { + data.lambda = reader.list_record()?.values; + } else if ldg == 1 { + let tab2 = reader.tab2_record()?; + let ne = tab2.cont.n2.max(0); + data.e_int = Some(tab2.table); + for _ in 0..ne { + let list = reader.list_record()?; + data.constants.push(DelayedGroupConstants { + energy: list.cont.c2, + lambda: list.values.iter().step_by(2).copied().collect(), + alpha: list.values.iter().skip(1).step_by(2).copied().collect(), + }); + } + } + + // With energy-independent group constants the abundances are not given + // here at all; they have to come from MF=5 MT=455, which carries one + // energy distribution per delayed group. + data.nu = parse_nu(reader, lnu)?; + Ok(data) +} + +/// Parse MF=1 MT=458. +pub fn parse_mf1_mt458(reader: &mut Reader) -> Result { + let head = reader.cont_record()?; + let (lfc, nfc) = (head.l2, head.n2); + + let list = reader.list_record()?; + let nply = list.cont.l2; + let values = &list.values; + + // The LIST holds, for each polynomial order in turn, a value and an + // uncertainty for each of the nine components: 18 numbers per order. + let n = FISSION_ENERGY_COMPONENTS.len(); + let stride = 2 * n; + let mut components = Vec::with_capacity(n); + for i in 0..n { + let pairs = values + .iter() + .skip(2 * i) + .step_by(stride) + .zip(values.iter().skip(2 * i + 1).step_by(stride)) + .map(|(&c, &d)| (c, d)) + .collect(); + components.push(FissionEnergyRelease::Polynomial(pairs)); + } + + let mut data = Mf1Mt458 { + za: head.c1, + awr: head.c2, + lfc, + nply, + nfc, + components, + }; + + // LFC=1 replaces some components with a tabulation. IFC says which. + if lfc == 1 { + for _ in 0..nfc.max(0) { + let tab = reader.tab1_record()?; + let (ldrv, ifc) = (tab.l1, tab.l2); + let idx = (ifc - 1).max(0) as usize; + if let Some(slot) = data.components.get_mut(idx) { + *slot = FissionEnergyRelease::Tabulated { + ldrv, + eifc: tab.table, + }; + } + } + } + + Ok(data) +} + +/// Parse MF=1 MT=460. +pub fn parse_mf1_mt460(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let lo = head.l1; + let mut data = Mf1Mt460 { + za: head.za, + awr: head.awr, + lo, + ..Default::default() + }; + + if lo == 1 { + data.ng = head.n1; + for _ in 0..data.ng.max(0) { + let tab = reader.tab1_record()?; + data.energy.push(tab.c1); + data.time.push(tab.table); + } + } else if lo == 2 { + data.lambda = reader.list_record()?.values; + } + + Ok(data) +} + +#[cfg(test)] +mod tests { + use crate::material::Material; + + const FIXTURE: &[u8] = include_bytes!("../../../../tests/n-095_Am_244.endf.xz"); + + #[test] + fn reads_the_descriptive_header() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let d = m.mf1_mt451().expect("MF=1 MT=451 is present"); + assert_eq!(d.za, 95244); + // NSUB=10 is incident-neutron data. + assert_eq!(d.nsub, 10); + assert_eq!(d.zsymam.as_deref(), Some(" 95-Am-244 ")); + // The directory lists every section in the material. + assert_eq!(d.section_list.len(), d.nxc as usize); + assert!(!d.section_list.is_empty()); + } + + #[test] + fn the_directory_agrees_with_the_sections_present() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let d = m.mf1_mt451().unwrap(); + for &(mf, mt, ..) in &d.section_list { + assert!( + m.contains(mf as i32, mt as i32), + "the directory lists MF={mf} MT={mt} but it is not in the file" + ); + } + } +} diff --git a/crates/endf/src/mf/mf2.rs b/crates/endf/src/mf/mf2.rs new file mode 100644 index 0000000..a93b1ef --- /dev/null +++ b/crates/endf/src/mf/mf2.rs @@ -0,0 +1,711 @@ +//! MF=2 MT=151, resonance parameters. + +use crate::error::{Error, Result}; +use crate::function::Tabulated1D; +use crate::records::Reader; + +/// MF=2 MT=151. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf2 { + pub za: i64, + pub awr: f64, + pub nis: i64, + pub isotopes: Vec, +} + +/// One isotope of the material, with its energy ranges. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Isotope { + pub zai: f64, + pub abn: f64, + pub lfw: i64, + pub ner: i64, + pub ranges: Vec, +} + +/// One energy range, and the parameters given over it. +#[derive(Debug, Clone, PartialEq)] +pub struct ResonanceRange { + pub el: f64, + pub eh: f64, + /// 1 resolved, 2 unresolved, 0 neither. + pub lru: i64, + /// Which representation the parameters use. + pub lrf: i64, + pub nro: i64, + pub naps: i64, + pub parameters: ResonanceParameters, +} + +/// The parameters of a range, in whichever representation it uses. +#[derive(Debug, Clone, PartialEq)] +pub enum ResonanceParameters { + /// LRF=0: the scattering radius and nothing else. + ScatteringRadius { spi: f64, ap: f64, nls: i64 }, + /// LRF=1 single-level or LRF=2 multi-level Breit-Wigner. The two are read + /// identically; only the reconstruction differs. + BreitWigner(BreitWigner), + /// LRF=3. + ReichMoore(ReichMoore), + /// LRF=7. + RMatrixLimited(Box), + /// LRU=2. + Unresolved(Box), + /// Nothing was read for this range. + /// + /// Reached for an unresolved range with LRF=1, which the Python reader + /// dispatches past without reading: see + /// . [`Unresolved`] + /// below implements those cases already, so correcting the dispatch is a + /// one-line change once that is settled upstream. + Absent, +} + +/// LRF=1 and LRF=2: Breit-Wigner parameters. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct BreitWigner { + /// NRO/=0: energy-dependent scattering radius. + pub ape: Option, + pub spi: f64, + pub ap: f64, + pub nls: i64, + pub sections: Vec, +} + +/// The resonances of one orbital angular momentum. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct BreitWignerSection { + pub awri: f64, + pub qx: f64, + pub l: i64, + pub lrx: i64, + pub nrs: i64, + /// Resonance energy. + pub er: Vec, + /// Spin. + pub aj: Vec, + /// Total width. + pub gt: Vec, + /// Neutron width. + pub gn: Vec, + /// Radiation width. + pub gg: Vec, + /// Fission width. + pub gf: Vec, +} + +/// LRF=3: Reich-Moore parameters. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ReichMoore { + pub ape: Option, + pub spi: f64, + pub ap: f64, + pub lad: i64, + pub nls: i64, + pub nlsc: i64, + pub sections: Vec, +} + +/// The resonances of one orbital angular momentum. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ReichMooreSection { + pub awri: f64, + pub apl: f64, + pub l: i64, + pub nrs: i64, + pub er: Vec, + pub aj: Vec, + pub gn: Vec, + pub gg: Vec, + /// First fission width. + pub gfa: Vec, + /// Second fission width. + pub gfb: Vec, +} + +/// The particle pairs of an R-matrix limited evaluation, column-wise. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ParticlePairs { + pub ma: Vec, + pub mb: Vec, + pub za: Vec, + pub zb: Vec, + pub ia: Vec, + pub ib: Vec, + pub q: Vec, + pub pnt: Vec, + pub shf: Vec, + pub mt: Vec, + pub pa: Vec, + pub pb: Vec, +} + +/// The channels of one spin group, column-wise. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Channels { + pub ppi: Vec, + pub l: Vec, + pub sch: Vec, + pub bnd: Vec, + pub ape: Vec, + pub apt: Vec, +} + +/// One spin group of an R-matrix limited evaluation. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct SpinGroup { + pub aj: f64, + pub pj: f64, + pub kbk: i64, + pub kps: i64, + pub nch: i64, + pub channels: Channels, + pub nrs: i64, + pub nx: i64, + /// Resonance energies. + pub er: Vec, + /// Widths, `nch` rows of `nrs` — the transpose of how the file stores them. + pub gam: Vec>, + // Background R-matrix, present when KBK > 0. + pub lch: Option, + pub lbk: Option, + pub rbr: Option, + pub rbi: Option, + pub ed: Option, + pub eu: Option, + // Tabulated phase shifts, present when KPS > 0. + pub lps: Option, + pub psr: Option, + pub psi: Option, +} + +/// LRF=7: R-matrix limited parameters. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct RMatrixLimited { + pub ifg: i64, + pub krm: i64, + pub njs: i64, + pub krl: i64, + pub npp: i64, + pub particle_pairs: ParticlePairs, + pub spin_groups: Vec, +} + +/// LRU=2: unresolved resonance parameters. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Unresolved { + pub ape: Option, + pub spi: f64, + pub ap: f64, + pub lssf: i64, + pub nls: i64, + /// Case B only: the energies the fission widths are given on. + pub ne: Option, + pub es: Vec, + pub ranges: Vec, +} + +/// The unresolved parameters of one orbital angular momentum. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct UnresolvedRange { + pub awri: f64, + pub l: i64, + pub njs: i64, + /// Case A: energy-independent parameters, one entry per J. + pub d: Vec, + pub aj: Vec, + pub amun: Vec, + pub gno: Vec, + pub gg: Vec, + /// Cases B and C: one entry per J. + pub parameters: Vec, +} + +/// The unresolved parameters of one spin, in Case B or Case C form. +#[derive(Debug, Clone, PartialEq)] +pub enum UnresolvedParameters { + /// LFW=1, LRF=1: only the fission widths are energy dependent. + CaseB { + muf: i64, + d: f64, + aj: f64, + amun: f64, + gn0: f64, + gg: f64, + gf: Vec, + }, + /// LRF=2: every parameter is energy dependent. + CaseC { + aj: f64, + interpolation: i64, + ne: i64, + amux: f64, + amun: f64, + amuf: f64, + e: Vec, + d: Vec, + gx: Vec, + gn0: Vec, + gg: Vec, + gf: Vec, + }, +} + +/// Take every `stride`-th value starting at `offset`. +fn column(values: &[f64], offset: usize, stride: usize) -> Vec { + values + .iter() + .skip(offset) + .step_by(stride) + .copied() + .collect() +} + +/// Read the energy-dependent scattering radius that NRO/=0 puts first. +fn parse_ape(reader: &mut Reader, nro: i64) -> Result> { + if nro != 0 { + Ok(Some(reader.tab1_record()?.table)) + } else { + Ok(None) + } +} + +fn parse_breit_wigner(reader: &mut Reader, nro: i64) -> Result { + let ape = parse_ape(reader, nro)?; + let c = reader.cont_record()?; + let mut data = BreitWigner { + ape, + spi: c.c1, + ap: c.c2, + nls: c.n1, + sections: Vec::new(), + }; + for _ in 0..data.nls.max(0) { + let list = reader.list_record()?; + let v = &list.values; + data.sections.push(BreitWignerSection { + awri: list.cont.c1, + qx: list.cont.c2, + l: list.cont.l1, + lrx: list.cont.l2, + nrs: list.cont.n2, + er: column(v, 0, 6), + aj: column(v, 1, 6), + gt: column(v, 2, 6), + gn: column(v, 3, 6), + gg: column(v, 4, 6), + gf: column(v, 5, 6), + }); + } + Ok(data) +} + +fn parse_reich_moore(reader: &mut Reader, nro: i64) -> Result { + let ape = parse_ape(reader, nro)?; + let c = reader.cont_record()?; + let mut data = ReichMoore { + ape, + spi: c.c1, + ap: c.c2, + lad: c.l1, + nls: c.n1, + nlsc: c.n2, + sections: Vec::new(), + }; + for _ in 0..data.nls.max(0) { + let list = reader.list_record()?; + let v = &list.values; + data.sections.push(ReichMooreSection { + awri: list.cont.c1, + apl: list.cont.c2, + l: list.cont.l1, + nrs: list.cont.n2, + er: column(v, 0, 6), + aj: column(v, 1, 6), + gn: column(v, 2, 6), + gg: column(v, 3, 6), + gfa: column(v, 4, 6), + gfb: column(v, 5, 6), + }); + } + Ok(data) +} + +fn parse_r_matrix_limited(reader: &mut Reader) -> Result { + let c = reader.cont_record()?; + let mut data = RMatrixLimited { + ifg: c.l1, + krm: c.l2, + njs: c.n1, + krl: c.n2, + ..Default::default() + }; + + let list = reader.list_record()?; + let v = &list.values; + data.npp = list.cont.l1; + data.particle_pairs = ParticlePairs { + ma: column(v, 0, 12), + mb: column(v, 1, 12), + za: column(v, 2, 12), + zb: column(v, 3, 12), + ia: column(v, 4, 12), + ib: column(v, 5, 12), + q: column(v, 6, 12), + pnt: column(v, 7, 12), + shf: column(v, 8, 12), + mt: column(v, 9, 12), + pa: column(v, 10, 12), + pb: column(v, 11, 12), + }; + + for _ in 0..data.njs.max(0) { + let list = reader.list_record()?; + let v = &list.values; + let nch = list.cont.n2; + let mut group = SpinGroup { + aj: list.cont.c1, + pj: list.cont.c2, + kbk: list.cont.l1, + kps: list.cont.l2, + nch, + channels: Channels { + ppi: column(v, 0, 6), + l: column(v, 1, 6), + sch: column(v, 2, 6), + bnd: column(v, 3, 6), + ape: column(v, 4, 6), + apt: column(v, 5, 6), + }, + ..Default::default() + }; + + // Resonance energies and widths: each resonance is one energy followed + // by `nch` widths. + let list = reader.list_record()?; + let v = &list.values; + group.nrs = list.cont.l2; + group.nx = list.cont.n2; + let width = nch.max(0) as usize + 1; + group.er = column(v, 0, width); + // Stored resonance-major; transposed to channel-major here, matching + // what the Python reader returns. + let nrs = group.nrs.max(0) as usize; + let nch_u = nch.max(0) as usize; + let mut gam = vec![Vec::with_capacity(nrs); nch_u]; + for j in 0..nrs { + for (c, row) in gam.iter_mut().enumerate() { + row.push(v.get(1 + width * j + c).copied().unwrap_or(0.0)); + } + } + group.gam = gam; + + // Background R-matrix. + if group.kbk > 0 { + let list = reader.list_record()?; + group.lch = Some(list.cont.l1); + group.lbk = Some(list.cont.l2); + match list.cont.l2 { + 1 => { + group.rbr = Some(reader.tab1_record()?.table); + group.rbi = Some(reader.tab1_record()?.table); + } + 2 | 3 => { + let list = reader.list_record()?; + group.ed = Some(list.cont.c1); + group.eu = Some(list.cont.c2); + } + _ => {} + } + } + + // Tabulated phase shifts. + if group.kps > 0 { + let list = reader.list_record()?; + let lps = list.cont.n1; + group.lps = Some(lps); + if lps == 1 { + group.psr = Some(reader.tab1_record()?.table); + group.psi = Some(reader.tab1_record()?.table); + } + } + + data.spin_groups.push(group); + } + + Ok(data) +} + +fn parse_unresolved(reader: &mut Reader, lfw: i64, lrf: i64, nro: i64) -> Result { + let mut data = Unresolved { + ape: parse_ape(reader, nro)?, + ..Default::default() + }; + + // Case B carries these in its own LIST record instead of a CONT. + if !(lfw == 1 && lrf == 1) { + let c = reader.cont_record()?; + data.spi = c.c1; + data.ap = c.c2; + data.lssf = c.l1; + data.nls = c.n1; + } + + if lfw == 0 && lrf == 1 { + // Case A: no fission widths, everything energy independent. + for _ in 0..data.nls.max(0) { + let list = reader.list_record()?; + let v = &list.values; + data.ranges.push(UnresolvedRange { + awri: list.cont.c1, + l: list.cont.l1, + njs: list.cont.n2, + d: column(v, 0, 6), + aj: column(v, 1, 6), + amun: column(v, 2, 6), + gno: column(v, 3, 6), + gg: column(v, 4, 6), + parameters: Vec::new(), + }); + } + } else if lfw == 1 && lrf == 1 { + // Case B: only the fission widths are energy dependent. + let list = reader.list_record()?; + data.spi = list.cont.c1; + data.ap = list.cont.c2; + data.lssf = list.cont.l1; + data.ne = Some(list.cont.n1); + data.nls = list.cont.n2; + data.es = list.values; + + for _ in 0..data.nls.max(0) { + let c = reader.cont_record()?; + let mut range = UnresolvedRange { + awri: c.c1, + l: c.l1, + njs: c.n1, + ..Default::default() + }; + for _ in 0..range.njs.max(0) { + let list = reader.list_record()?; + let v = &list.values; + range.parameters.push(UnresolvedParameters::CaseB { + muf: list.cont.l2, + d: v.first().copied().unwrap_or(0.0), + aj: v.get(1).copied().unwrap_or(0.0), + amun: v.get(2).copied().unwrap_or(0.0), + gn0: v.get(3).copied().unwrap_or(0.0), + gg: v.get(4).copied().unwrap_or(0.0), + // v[5] is unused by the format. + gf: v.get(6..).unwrap_or(&[]).to_vec(), + }); + } + data.ranges.push(range); + } + } else if lrf == 2 { + // Case C: every parameter is energy dependent. + for _ in 0..data.nls.max(0) { + let c = reader.cont_record()?; + let mut range = UnresolvedRange { + awri: c.c1, + l: c.l1, + njs: c.n1, + ..Default::default() + }; + for _ in 0..range.njs.max(0) { + let list = reader.list_record()?; + let v = &list.values; + range.parameters.push(UnresolvedParameters::CaseC { + aj: list.cont.c1, + interpolation: list.cont.l1, + ne: list.cont.n2, + amux: v.get(2).copied().unwrap_or(0.0), + amun: v.get(3).copied().unwrap_or(0.0), + amuf: v.get(5).copied().unwrap_or(0.0), + e: column(v, 6, 6), + d: column(v, 7, 6), + gx: column(v, 8, 6), + gn0: column(v, 9, 6), + gg: column(v, 10, 6), + gf: column(v, 11, 6), + }); + } + data.ranges.push(range); + } + } + + Ok(data) +} + +/// Parse MF=2 MT=151. +pub fn parse_mf2(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf2 { + za: head.za, + awr: head.awr, + nis: head.n1, + isotopes: Vec::new(), + }; + + for _ in 0..data.nis.max(0) { + let c = reader.cont_record()?; + let mut iso = Isotope { + zai: c.c1, + abn: c.c2, + lfw: c.l2, + ner: c.n1, + ranges: Vec::new(), + }; + + for _ in 0..iso.ner.max(0) { + let c = reader.cont_record()?; + let (lru, lrf, nro) = (c.l1, c.l2, c.n1); + + let parameters = if lrf == 0 { + let c = reader.cont_record()?; + ResonanceParameters::ScatteringRadius { + spi: c.c1, + ap: c.c2, + nls: c.n1, + } + } else if lru == 0 || lru == 1 { + match lrf { + 1 | 2 => ResonanceParameters::BreitWigner(parse_breit_wigner(reader, nro)?), + 3 => ResonanceParameters::ReichMoore(parse_reich_moore(reader, nro)?), + 4 => { + return Err(Error::Unsupported { + what: "the Adler-Adler resonance formalism (MF=2, LRF=4)", + }) + } + 7 => ResonanceParameters::RMatrixLimited(Box::new(parse_r_matrix_limited( + reader, + )?)), + _ => { + return Err(Error::Unsupported { + what: "an unrecognised MF=2 resonance formalism", + }) + } + } + } else if lru == 2 { + // `lru`, because LRU is what says resolved or unresolved; LRF + // only selects the formalism within the range. Both readers + // tested LRF here, which skipped Cases A and B (LRU=2 with + // LRF=1) and left their records unread, so the next range was + // parsed from the middle of this one. Fixed in + // . + ResonanceParameters::Unresolved(Box::new(parse_unresolved( + reader, iso.lfw, lrf, nro, + )?)) + } else { + ResonanceParameters::Absent + }; + + iso.ranges.push(ResonanceRange { + el: c.c1, + eh: c.c2, + lru, + lrf, + nro, + naps: c.n2, + parameters, + }); + } + + data.isotopes.push(iso); + } + + Ok(data) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::material::Material; + + const FIXTURE: &[u8] = include_bytes!("../../../../tests/n-095_Am_244.endf.xz"); + + #[test] + fn reads_a_scattering_radius_only_range() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let d = m.mf2().expect("MF=2 MT=151 is present"); + assert_eq!(d.za, 95244); + assert_eq!(d.isotopes.len(), 1); + let iso = &d.isotopes[0]; + assert_eq!(iso.ranges.len(), iso.ner as usize); + + // This evaluation gives no resonance parameters, only the radius. + let range = &iso.ranges[0]; + assert_eq!(range.lru, 0); + assert_eq!(range.lrf, 0); + match &range.parameters { + ResonanceParameters::ScatteringRadius { ap, .. } => assert!(*ap > 0.0), + other => panic!("expected a scattering radius, got {other:?}"), + } + } + + /// An unresolved range with LRF=1 — Case A — is read, and its records are + /// consumed so a following range stays aligned. + /// + /// Both readers used to dispatch on LRF here where the format uses LRU, so + /// this range matched no branch: its parameters were dropped and its + /// records were left on the stream. See + /// . + #[test] + fn an_unresolved_range_with_lrf_1_is_read() { + // Plain decimals, right-justified in the format's 11-column fields. + // `float_endf` reads these as readily as the e-less exponential form. + fn f(v: f64) -> String { + format!("{v:>11}") + } + fn i(v: i64) -> String { + format!("{v:>11}") + } + fn line(fields: [String; 6]) -> String { + format!("{:<66}9999 2151\n", fields.concat()) + } + + // NIS=1; LFW=0 and NER=2, so a Case A range and then a resolved one. + let text = line([f(95244.0), f(241.968), i(0), i(0), i(1), i(0)]) + + &line([f(95244.0), f(1.0), i(0), i(0), i(2), i(0)]) + // Range 1: LRU=2, LRF=1. + + &line([f(100.0), f(1000.0), i(2), i(1), i(0), i(0)]) + + &line([f(2.5), f(0.9), i(0), i(0), i(1), i(0)]) + + &line([f(241.968), f(0.0), i(0), i(0), i(6), i(1)]) + + &line([f(10.0), f(3.0), f(1.0), f(0.5), f(0.04), f(0.0)]) + // Range 2: LRU=1, LRF=2, one resonance. Only reachable if the + // range above consumed exactly its own two records. + + &line([f(1000.0), f(9000.0), i(1), i(2), i(0), i(0)]) + + &line([f(2.5), f(0.9), i(0), i(0), i(1), i(0)]) + + &line([f(241.968), f(0.0), i(0), i(0), i(6), i(1)]) + + &line([f(500.0), f(3.0), f(1.2), f(1.0), f(0.2), f(0.0)]); + + let d = parse_mf2(&mut Reader::new(&text)).unwrap(); + assert_eq!(d.isotopes[0].ranges.len(), 2); + + let range = &d.isotopes[0].ranges[0]; + assert_eq!((range.lru, range.lrf), (2, 1)); + match &range.parameters { + ResonanceParameters::Unresolved(u) => { + assert_eq!(u.spi, 2.5); + assert_eq!(u.ap, 0.9); + assert_eq!(u.nls, 1); + // Case A: energy-independent parameters, not a `parameters` + // list, which is what Cases B and C build. + assert_eq!(u.ranges[0].d, [10.0]); + assert_eq!(u.ranges[0].gno, [0.5]); + assert!(u.ranges[0].parameters.is_empty()); + } + other => panic!("expected unresolved Case A parameters, got {other:?}"), + } + + // The dangerous half: before the fix this came back as the leftovers + // of the range above rather than as its own header. + let after = &d.isotopes[0].ranges[1]; + assert_eq!((after.lru, after.lrf), (1, 2)); + assert_eq!((after.el, after.eh), (1000.0, 9000.0)); + match &after.parameters { + ResonanceParameters::BreitWigner(b) => assert_eq!(b.sections[0].er, [500.0]), + other => panic!("expected Breit-Wigner parameters, got {other:?}"), + } + } +} diff --git a/crates/endf/src/mf/mf3.rs b/crates/endf/src/mf/mf3.rs new file mode 100644 index 0000000..e14f558 --- /dev/null +++ b/crates/endf/src/mf/mf3.rs @@ -0,0 +1,97 @@ +//! MF=3, reaction cross sections. + +use crate::error::Result; +use crate::function::Tabulated1D; +use crate::records::Reader; + +/// A reaction cross section as given in MF=3. +#[derive(Debug, Clone, PartialEq)] +pub struct Mf3 { + /// ZA identifier, 1000*Z + A. + pub za: i64, + /// Ratio of the target mass to that of a neutron. + pub awr: f64, + /// Mass-difference Q value, eV. + pub qm: f64, + /// Reaction Q value for the lowest energy state, eV. + pub qi: f64, + /// Complex-break-up flag. + pub lr: i64, + /// Cross section as a function of incident energy, barns against eV. + pub sigma: Tabulated1D, +} + +/// Parse an MF=3 section. +pub fn parse_mf3(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let tab = reader.tab1_record()?; + Ok(Mf3 { + za: head.za, + awr: head.awr, + qm: tab.c1, + qi: tab.c2, + lr: tab.l2, + sigma: tab.table, + }) +} + +#[cfg(test)] +mod tests { + use crate::material::Material; + + const FIXTURE: &[u8] = include_bytes!("../../../../tests/n-095_Am_244.endf.xz"); + + #[test] + fn reads_the_total_cross_section() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let total = m.mf3(1).expect("MF=3 MT=1 is present"); + + assert_eq!(total.za, 95244); + // MT=1 is the total cross section, so it has no threshold and no Q. + assert_eq!(total.qm, 0.0); + assert_eq!(total.qi, 0.0); + assert_eq!(total.lr, 0); + + let x = &total.sigma.x; + let y = &total.sigma.y; + assert_eq!(x.len(), y.len()); + assert!(!x.is_empty()); + // Cross sections are tabulated on an ascending energy grid. + assert!(x.windows(2).all(|w| w[1] >= w[0])); + assert!(y.iter().all(|&v| v >= 0.0)); + // The evaluation runs from 1e-5 eV to 20 MeV. + assert!((x[0] - 1e-5).abs() < 1e-12); + assert!((x[x.len() - 1] - 2.0e7).abs() < 1.0); + } + + #[test] + fn the_sum_rule_holds_at_the_first_energy() { + // MT=1 is total, and for this evaluation elastic (2), fission (18) and + // capture (102) are its parts at thermal energies. + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let total = m.mf3(1).unwrap(); + let parts: f64 = [2, 18, 102] + .iter() + .filter_map(|&mt| m.mf3(mt)) + .map(|r| r.sigma.y[0]) + .sum(); + let got = total.sigma.y[0]; + // MF=3 values are written in 11-character fields, so the evaluation + // carries six significant figures and its own total is rounded: here + // 146212.0 against 146211.6223 summed. The agreement to ~3e-6 is the + // format's, not the reader's, and the Python reader gives the same two + // numbers. + assert!( + (got - parts).abs() <= 1e-5 * got.abs(), + "total {got} != sum of parts {parts}" + ); + } + + #[test] + fn interpolating_returns_a_tabulated_point() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let total = m.mf3(1).unwrap(); + let x0 = total.sigma.x[0]; + assert_eq!(total.sigma.eval(x0), total.sigma.y[0]); + } +} diff --git a/crates/endf/src/mf/mf4.rs b/crates/endf/src/mf/mf4.rs new file mode 100644 index 0000000..70bf83b --- /dev/null +++ b/crates/endf/src/mf/mf4.rs @@ -0,0 +1,363 @@ +//! MF=4, angular distributions of secondary particles. + +use crate::ace::Table; +use crate::data::EV_PER_MEV; +use crate::error::Result; +use crate::function::{Legendre, Tabulated1D, Tabulated2D}; +use crate::records::Reader; +use crate::univariate::{Interpolation, Tabular, Uniform}; + +/// Angular distributions given as Legendre coefficients (LTT=1). +#[derive(Debug, Clone, PartialEq, Default)] +pub struct LegendreAngles { + /// Interpolation across incident energy. + pub e_int: Tabulated2D, + /// Temperature. The format gives one per incident energy; like the Python + /// reader, only the last is kept. + pub t: f64, + /// Test flag, likewise the last one read. + pub lt: i64, + /// Incident energies. + pub energy: Vec, + /// Legendre coefficients at each incident energy, `a_1` upward — the + /// `a_0 = 1` term the format omits is not inserted here. + pub a_l: Vec>, +} + +/// Angular distributions given as tabulated probabilities (LTT=2). +#[derive(Debug, Clone, PartialEq, Default)] +pub struct TabulatedAngles { + pub e_int: Tabulated2D, + pub t: f64, + pub lt: i64, + pub energy: Vec, + /// The distribution of the scattering cosine at each incident energy. + pub mu: Vec, +} + +/// MF=4: the angular distribution of one reaction's secondary particle. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf4 { + pub za: i64, + pub awr: f64, + /// 0 isotropic, 1 Legendre, 2 tabulated, 3 Legendre then tabulated. + pub ltt: i64, + /// 1 when the distribution is isotropic at every energy. + pub li: i64, + /// 1 laboratory frame, 2 centre-of-mass. + pub lct: i64, + /// Present for LTT=1 and LTT=3. + pub legendre: Option, + /// Present for LTT=2 and LTT=3. + pub tabulated: Option, + /// True when the obsolete energy transformation matrix was present and + /// skipped. The Python reader warns here. + pub had_transformation_matrix: bool, +} + +fn parse_legendre(reader: &mut Reader) -> Result { + let tab2 = reader.tab2_record()?; + let n_energy = tab2.cont.n2.max(0); + let mut data = LegendreAngles { + e_int: tab2.table, + ..Default::default() + }; + for _ in 0..n_energy { + let list = reader.list_record()?; + // T and LT are per incident energy in the format but only one slot is + // kept, so the last wins. Mirrors the Python reader. + data.t = list.cont.c1; + data.lt = list.cont.l1; + data.energy.push(list.cont.c2); + data.a_l.push(list.values); + } + Ok(data) +} + +fn parse_tabulated(reader: &mut Reader) -> Result { + let tab2 = reader.tab2_record()?; + let n_energy = tab2.cont.n2.max(0); + let mut data = TabulatedAngles { + e_int: tab2.table, + ..Default::default() + }; + for _ in 0..n_energy { + let tab = reader.tab1_record()?; + data.t = tab.c1; + data.lt = tab.l1; + data.energy.push(tab.c2); + data.mu.push(tab.table); + } + Ok(data) +} + +/// Parse an MF=4 section. +pub fn parse_mf4(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let lvt = head.l1; + let ltt = head.l2; + let c = reader.cont_record()?; + let (li, lct, nk) = (c.l1, c.l2, c.n1); + + let mut data = Mf4 { + za: head.za, + awr: head.awr, + ltt, + li, + lct, + ..Default::default() + }; + + // The energy transformation matrix was removed from the format long ago. + // Evaluations that still carry one are read past. + if lvt > 0 { + data.had_transformation_matrix = true; + reader.skip_lines((nk.max(0) as usize).div_ceil(6))?; + } + + match (ltt, li) { + // Purely isotropic: nothing follows. + (0, 1) => {} + (1, 0) => data.legendre = Some(parse_legendre(reader)?), + (2, 0) => data.tabulated = Some(parse_tabulated(reader)?), + (3, 0) => { + data.legendre = Some(parse_legendre(reader)?); + data.tabulated = Some(parse_tabulated(reader)?); + } + _ => {} + } + + Ok(data) +} + +/// The distribution of the scattering cosine at one incident energy. +/// +/// Which shape it takes depends on where the data came from: ENDF gives +/// Legendre coefficients or a tabulated density, ACE gives a tabulated density +/// or a bare "isotropic" flag. +#[derive(Debug, Clone, PartialEq)] +pub enum AngleAtEnergy { + /// Legendre coefficients including the `a_0 = 1` term the format omits. + Legendre(Legendre), + /// A density tabulated against the cosine, as ENDF's MF=4 LTT=2 gives it. + Tabulated(Tabulated1D), + /// A density tabulated against the cosine, as an ACE table gives it — + /// carrying the CDF the file supplied. + Tabular(Tabular), + /// Isotropic scattering. + Isotropic(Uniform), +} + +/// The angular distribution of a reaction's secondary particle, as a function +/// of incident energy. +/// +/// This is the interpreted form of [`Mf4`]: the parsed section says what the +/// file holds, and this says what it means. Build it with +/// [`AngleDistribution::from_mf4`] or [`AngleDistribution::from_ace`]. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct AngleDistribution { + /// Incident energies in eV at which a distribution is given. + pub energy: Vec, + /// The distribution at each of those energies. + pub mu: Vec, +} + +impl AngleDistribution { + /// Interpret a parsed MF=4 section. + /// + /// A purely isotropic section (LTT=0, LI=1) yields empty vectors rather + /// than a uniform distribution at every energy, matching the Python + /// reader — the incident energy grid is not given in that case, so there + /// is nothing to hang a distribution on. + pub fn from_mf4(data: &Mf4) -> AngleDistribution { + // The format writes the coefficients from `a_1`; `a_0` is 1 by the + // normalisation and is restored here. + let with_a0 = |a_l: &Vec| { + let mut coef = Vec::with_capacity(a_l.len() + 1); + coef.push(1.0); + coef.extend_from_slice(a_l); + AngleAtEnergy::Legendre(Legendre::new(coef)) + }; + + let mut out = AngleDistribution::default(); + match (data.ltt, data.li) { + (1, 0) | (3, 0) => { + if let Some(leg) = &data.legendre { + out.energy.extend_from_slice(&leg.energy); + out.mu.extend(leg.a_l.iter().map(with_a0)); + } + } + _ => {} + } + if matches!((data.ltt, data.li), (2, 0) | (3, 0)) { + if let Some(tab) = &data.tabulated { + out.energy.extend_from_slice(&tab.energy); + out.mu + .extend(tab.mu.iter().cloned().map(AngleAtEnergy::Tabulated)); + } + } + out + } + + /// Read an angular distribution from an ACE table. + /// + /// `location_dist` is the start of the angular distribution block, e.g. + /// JXS(9); `location_start` is the one-based offset within it of this + /// reaction's array, as the LOCB list gives it. + pub fn from_ace( + table: &Table, + location_dist: i64, + location_start: i64, + ) -> Result { + let xss = &table.xss; + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| xss.get(i).copied()) + .unwrap_or(0.0) + }; + let slice = |i: i64, n: usize| -> Vec { (0..n as i64).map(|k| at(i + k)).collect() }; + + let mut idx = location_dist + location_start - 1; + + let n_energies = at(idx) as usize; + idx += 1; + + let energy: Vec = slice(idx, n_energies) + .into_iter() + .map(|e| e * EV_PER_MEV) + .collect(); + idx += n_energies as i64; + + // Where each energy's distribution sits, and in which of the two + // encodings: positive is the 32 equiprobable bins of the older format, + // negative is a tabulated density, zero means isotropic. + let lc: Vec = slice(idx, n_energies) + .into_iter() + .map(|v| v as i64) + .collect(); + + let mut mu = Vec::with_capacity(n_energies); + for &loc in &lc { + mu.push(match loc { + 0 => AngleAtEnergy::Isotropic(Uniform::new(-1.0, 1.0)), + _ => { + let idx = location_dist + loc.abs() - 1; + if loc > 0 { + // 32 equiprobable bins, given by their 33 boundaries. + const N_BINS: usize = 32; + let cos = slice(idx, N_BINS + 1); + let mut pdf = vec![0.0; N_BINS + 1]; + for i in 0..N_BINS { + pdf[i] = 1.0 / (N_BINS as f64 * (cos[i + 1] - cos[i])); + } + let cdf: Vec = + (0..=N_BINS).map(|i| i as f64 / N_BINS as f64).collect(); + AngleAtEnergy::Tabular(Tabular::with_cdf( + cos, + pdf, + Interpolation::Histogram, + cdf, + )) + } else { + let intt = at(idx) as i32; + let n_points = at(idx + 1) as usize; + // Stored as three consecutive rows: values, PDF, CDF. + let values = slice(idx + 2, n_points); + let pdf = slice(idx + 2 + n_points as i64, n_points); + let cdf = slice(idx + 2 + 2 * n_points as i64, n_points); + let interp = Interpolation::from_endf_code(intt)?; + AngleAtEnergy::Tabular(Tabular::with_cdf(values, pdf, interp, cdf)) + } + } + }); + } + + Ok(AngleDistribution { energy, mu }) + } + + /// Fraction of scattering into the cone `mu >= mu_cutoff`, at each energy. + /// + /// Used for the removal cross sections of point-kernel shielding, where a + /// forward-scattered neutron counts as still in the uncollided beam. + /// + /// Every shape is handled, including the two an ACE table produces. The + /// Python reader fills only the Legendre and tabulated entries and returns + /// whatever `np.empty` gave it for the rest, so its answer for ACE data is + /// not merely different but changes between calls; see issue #21. There is + /// no behaviour to match, so this computes them. + pub fn forward_fraction(&self, mu_cutoff: f64) -> Vec { + let mut fractions = vec![0.0; self.energy.len()]; + for (i, mu_i) in self.mu.iter().enumerate() { + if i >= fractions.len() { + break; + } + fractions[i] = match mu_i { + AngleAtEnergy::Legendre(leg) => { + // The stored coefficients are the ENDF `a_l`; the density + // is p(mu) = sum_l (2l+1)/2 a_l P_l(mu). + let pdf_coeffs: Vec = leg + .coefficients + .iter() + .enumerate() + .map(|(l, &a)| (2.0 * l as f64 + 1.0) / 2.0 * a) + .collect(); + let antideriv = Legendre::new(pdf_coeffs).integ(); + antideriv.eval(1.0) - antideriv.eval(mu_cutoff) + } + AngleAtEnergy::Tabulated(f) => { + let cdf = f.integral(); + let cdf_func = Tabulated1D::new(f.x.clone(), cdf.clone()); + let total = *cdf.last().unwrap_or(&0.0); + (total - cdf_func.eval(mu_cutoff)) / total + } + AngleAtEnergy::Tabular(t) => { + // The same, through the density's own cumulative + // distribution rather than through an integral of a TAB1. + let cdf = t.cdf(); + let cdf_func = Tabulated1D::new(t.x.clone(), cdf.clone()); + let total = *cdf.last().unwrap_or(&0.0); + if total > 0.0 { + (total - cdf_func.eval(mu_cutoff)) / total + } else { + 0.0 + } + } + AngleAtEnergy::Isotropic(u) => { + // The part of [a, b] that lies at or above the cutoff. + let width = u.b - u.a; + if width > 0.0 { + ((u.b - mu_cutoff.max(u.a)) / width).clamp(0.0, 1.0) + } else { + 0.0 + } + } + }; + } + fractions + } +} + +#[cfg(test)] +mod tests { + use crate::material::Material; + + const FIXTURE: &[u8] = include_bytes!("../../../../tests/n-095_Am_244.endf.xz"); + + #[test] + fn reads_legendre_angular_distributions() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let d = m.mf4(2).expect("MF=4 MT=2 is present"); + assert_eq!(d.za, 95244); + // Elastic scattering is given in the centre-of-mass frame. + assert_eq!(d.lct, 2); + + let leg = d + .legendre + .as_ref() + .expect("LTT=1 gives Legendre coefficients"); + assert_eq!(leg.energy.len(), leg.a_l.len()); + assert!(!leg.energy.is_empty()); + assert!(leg.energy.windows(2).all(|w| w[1] >= w[0])); + } +} diff --git a/crates/endf/src/mf/mf5.rs b/crates/endf/src/mf/mf5.rs new file mode 100644 index 0000000..2fcdb91 --- /dev/null +++ b/crates/endf/src/mf/mf5.rs @@ -0,0 +1,454 @@ +//! MF=5, energy distributions of secondary particles. + +use crate::ace::Table; +use crate::data::EV_PER_MEV; +use crate::error::{Error, Result}; +use crate::function::{Tabulated1D, Tabulated2D}; +use crate::records::Reader; +use crate::univariate::{Discrete, Interpolation, Mixture, Tabular, Univariate}; + +/// MF=5: the energy distributions of one reaction. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf5 { + pub za: i64, + pub awr: f64, + pub nk: i64, + pub subsections: Vec, +} + +/// One partial distribution, with the fraction of emission it accounts for. +#[derive(Debug, Clone, PartialEq)] +pub struct Subsection { + /// Which law the distribution uses. + pub lf: i64, + /// Applicability: the fraction of the emission this subsection describes, + /// as a function of incident energy. + pub p: Tabulated1D, + pub distribution: EnergyDistribution, +} + +/// An energy distribution, in whichever law the evaluation uses. +#[derive(Debug, Clone, PartialEq)] +pub enum EnergyDistribution { + /// LF=1: an arbitrary tabulated function of outgoing energy. + ArbitraryTabulated { + e_int: Tabulated2D, + /// Incident energies. + energy: Vec, + /// The outgoing distribution at each incident energy. + g: Vec, + }, + /// LF=5: general evaporation spectrum. + GeneralEvaporation { + u: f64, + theta: Tabulated1D, + g: Tabulated1D, + }, + /// LF=7: simple Maxwellian fission spectrum. + MaxwellEnergy { u: f64, theta: Tabulated1D }, + /// LF=9: evaporation spectrum. + Evaporation { u: f64, theta: Tabulated1D }, + /// LF=11: energy-dependent Watt spectrum. + WattEnergy { + u: f64, + a: Tabulated1D, + b: Tabulated1D, + }, + /// LF=12: Madland-Nix fission spectrum. + MadlandNix { + efl: f64, + efh: f64, + t_m: Tabulated1D, + }, + /// ACE laws 3 and 33: inelastic scattering to a discrete level. + /// + /// No ENDF law corresponds; the processed file states the kinematics + /// directly rather than tabulating the resulting spectrum. + LevelInelastic { + /// Laboratory threshold, `(A + 1)/A * |Q|`, in eV. + threshold: f64, + /// `(A/(A + 1))^2`. + mass_ratio: f64, + }, + /// ACE law 2: a photon of one energy. + DiscretePhoton { + /// 1 for a primary photon, 2 for a non-primary one. + primary_flag: i64, + /// The photon energy if primary, the binding energy if not, in eV. + energy: f64, + /// Of the nuclide that emitted it. + atomic_weight_ratio: f64, + }, + /// ACE law 4: an outgoing spectrum tabulated at each incident energy. + ContinuousTabular { + breakpoints: Vec, + interpolation: Vec, + /// Incident energies in eV. + energy: Vec, + /// The outgoing energy distribution at each of them. + energy_out: Vec, + }, +} + +/// Parse an MF=5 section. +pub fn parse_mf5(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf5 { + za: head.za, + awr: head.awr, + nk: head.n1, + subsections: Vec::new(), + }; + + for _ in 0..data.nk.max(0) { + // The applicability record also carries the law and its parameters. + let applicability = reader.tab1_record()?; + let lf = applicability.l2; + let (c1, c2) = (applicability.c1, applicability.c2); + + let distribution = match lf { + 1 => { + let tab2 = reader.tab2_record()?; + let n = tab2.cont.n2.max(0); + let mut energy = Vec::with_capacity(n as usize); + let mut g = Vec::with_capacity(n as usize); + for _ in 0..n { + let tab = reader.tab1_record()?; + energy.push(tab.c2); + g.push(tab.table); + } + EnergyDistribution::ArbitraryTabulated { + e_int: tab2.table, + energy, + g, + } + } + 5 => EnergyDistribution::GeneralEvaporation { + u: c1, + theta: reader.tab1_record()?.table, + g: reader.tab1_record()?.table, + }, + 7 => EnergyDistribution::MaxwellEnergy { + u: c1, + theta: reader.tab1_record()?.table, + }, + 9 => EnergyDistribution::Evaporation { + u: c1, + theta: reader.tab1_record()?.table, + }, + 11 => EnergyDistribution::WattEnergy { + u: c1, + a: reader.tab1_record()?.table, + b: reader.tab1_record()?.table, + }, + 12 => EnergyDistribution::MadlandNix { + efl: c1, + efh: c2, + t_m: reader.tab1_record()?.table, + }, + // The Python reader leaves `dist` unbound here and raises + // UnboundLocalError; this reports the same failure with a usable + // message. + _ => { + return Err(Error::Unsupported { + what: "an unrecognised MF=5 energy distribution law", + }) + } + }; + + data.subsections.push(Subsection { + lf, + p: applicability.table, + distribution, + }); + } + + Ok(data) +} + +/// A `theta`-and-`U` law as an ACE table gives it: LF=7 and LF=9 share a +/// layout, differing only in which variant they build. +/// +/// Returns the tabulated temperature, already in eV, and the restriction +/// energy. +fn ace_theta_and_u(xss: &[f64], idx: usize) -> (Tabulated1D, f64) { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + + // The nuclear temperature is stored in MeV against an energy in MeV, so + // both axes are converted. + let mut theta = Tabulated1D::from_ace(xss, idx, true); + for v in &mut theta.y { + *v *= EV_PER_MEV; + } + + let nr = at(idx) as usize; + let ne = at(idx + 1 + 2 * nr) as usize; + let u = at(idx + 2 + 2 * nr + 2 * ne) * EV_PER_MEV; + (theta, u) +} + +impl EnergyDistribution { + /// LF=7, a Maxwellian fission spectrum, from an ACE table. + pub fn maxwell_from_ace(xss: &[f64], idx: usize) -> EnergyDistribution { + let (theta, u) = ace_theta_and_u(xss, idx); + EnergyDistribution::MaxwellEnergy { u, theta } + } + + /// LF=9, an evaporation spectrum, from an ACE table. + pub fn evaporation_from_ace(xss: &[f64], idx: usize) -> EnergyDistribution { + let (theta, u) = ace_theta_and_u(xss, idx); + EnergyDistribution::Evaporation { u, theta } + } + + /// LF=11, an energy-dependent Watt spectrum, from an ACE table. + pub fn watt_from_ace(xss: &[f64], idx: usize) -> EnergyDistribution { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + + // `a` is an energy, stored in MeV. + let mut a = Tabulated1D::from_ace(xss, idx, true); + for v in &mut a.y { + *v *= EV_PER_MEV; + } + let nr = at(idx) as usize; + let ne = at(idx + 1 + 2 * nr) as usize; + let idx = idx + 2 + 2 * nr + 2 * ne; + + // `b` is an inverse energy, so it converts the other way. + let mut b = Tabulated1D::from_ace(xss, idx, true); + for v in &mut b.y { + *v /= EV_PER_MEV; + } + let nr = at(idx) as usize; + let ne = at(idx + 1 + 2 * nr) as usize; + let idx = idx + 2 + 2 * nr + 2 * ne; + + EnergyDistribution::WattEnergy { + u: at(idx) * EV_PER_MEV, + a, + b, + } + } + + /// ACE laws 3 and 33, inelastic scattering to a discrete level. + pub fn level_inelastic_from_ace(xss: &[f64], idx: usize) -> EnergyDistribution { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + EnergyDistribution::LevelInelastic { + threshold: at(idx) * EV_PER_MEV, + mass_ratio: at(idx + 1), + } + } + + /// ACE law 2, a photon of one energy. + /// + /// Takes the whole table rather than the XSS array: the atomic weight + /// ratio it records comes from the header. + pub fn discrete_photon_from_ace(table: &Table, idx: usize) -> EnergyDistribution { + let at = |i: usize| table.xss.get(i).copied().unwrap_or(0.0); + EnergyDistribution::DiscretePhoton { + primary_flag: at(idx) as i64, + energy: at(idx + 1) * EV_PER_MEV, + atomic_weight_ratio: table.atomic_weight_ratio, + } + } + + /// ACE law 4, an outgoing spectrum tabulated at each incident energy. + /// + /// `idx` is where this law's data begins (`LDIS + LOCC - 1`) and `ldis` + /// the start of the energy distribution block, e.g. JXS(11); the locators + /// inside are relative to the latter. + pub fn continuous_tabular_from_ace( + xss: &[f64], + idx: usize, + ldis: i64, + ) -> Result { + let grid = ace_incident_grid(xss, idx); + + let mut energy_out = Vec::with_capacity(grid.energy.len()); + for &loc in &grid.loc_dist { + let idx = (ldis + loc - 1).max(0) as usize; + energy_out.push(ace_outgoing_energy(xss, idx, 3)?.distribution); + } + + Ok(EnergyDistribution::ContinuousTabular { + breakpoints: grid.breakpoints, + interpolation: grid.interpolation, + energy: grid.energy, + energy_out, + }) + } +} + +/// The incident energy grid shared by ACE laws 4, 44 and 61. +#[derive(Debug, Clone, PartialEq)] +pub struct AceIncidentGrid { + pub breakpoints: Vec, + pub interpolation: Vec, + /// Incident energies in eV. + pub energy: Vec, + /// Where each incident energy's outgoing distribution begins, relative to + /// the start of the energy distribution block. + pub loc_dist: Vec, +} + +/// Read the incident energy grid shared by ACE laws 4, 44 and 61. +pub fn ace_incident_grid(xss: &[f64], idx: usize) -> AceIncidentGrid { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + let slice = |i: usize, n: usize| -> Vec { (0..n).map(|k| at(i + k)).collect() }; + + let n_regions = at(idx) as usize; + let n_energy_in = at(idx + 1 + 2 * n_regions) as usize; + + let mut idx = idx + 1; + let (breakpoints, interpolation) = if n_regions > 0 { + ( + (0..n_regions).map(|i| at(idx + i) as i32).collect(), + (0..n_regions) + .map(|i| at(idx + n_regions + i) as i32) + .collect(), + ) + } else { + // Zero regions means one linear-linear region over the whole grid. + (vec![n_energy_in as i32], vec![2]) + }; + + idx += 2 * n_regions + 1; + let energy: Vec = slice(idx, n_energy_in) + .into_iter() + .map(|e| e * EV_PER_MEV) + .collect(); + + idx += n_energy_in; + let loc_dist = slice(idx, n_energy_in) + .into_iter() + .map(|v| v as i64) + .collect(); + + AceIncidentGrid { + breakpoints, + interpolation, + energy, + loc_dist, + } +} + +/// One tabulated outgoing energy distribution, and the columns it came from. +#[derive(Debug, Clone, PartialEq)] +pub struct AceOutgoingEnergy { + /// The outgoing energy distribution. + pub distribution: Univariate, + /// The stored columns, `n_cols` rows of `n_energy_out`. Row 0 is the + /// outgoing energy, already in eV; row 1 the density, still per MeV; row 2 + /// the CDF. What follows depends on the law. + pub data: Vec>, + /// How many of the points are discrete lines rather than a continuum. + pub n_discrete_lines: usize, +} + +/// Read one tabulated outgoing energy distribution from an ACE table. +/// +/// Laws 4, 44 and 61 store the outgoing energy the same way and differ only in +/// how many columns follow: three (energy, density, CDF) for law 4, five for +/// Kalbach-Mann, four for correlated angle-energy. +pub fn ace_outgoing_energy(xss: &[f64], idx: usize, n_cols: usize) -> Result { + let at = |i: usize| xss.get(i).copied().unwrap_or(0.0); + + // INTT is the interpolation scheme, 1 histogram or 2 linear-linear. When + // discrete lines are present the stored value is 10*n_lines + INTT. + let packed = at(idx) as i64; + let (n_discrete_lines, intt) = (packed.div_euclid(10), packed.rem_euclid(10)); + // Anything else is read as linear-linear, which is what the Python reader + // falls back to after warning. + let interpolation = match intt { + 1 => Interpolation::Histogram, + _ => Interpolation::LinearLinear, + }; + let n_discrete_lines = n_discrete_lines.max(0) as usize; + + let n_energy_out = at(idx + 1) as usize; + let mut data = Vec::with_capacity(n_cols); + for row in 0..n_cols { + data.push( + (0..n_energy_out) + .map(|k| at(idx + 2 + row * n_energy_out + k)) + .collect::>(), + ); + } + if data.len() < 3 { + return Err(Error::BadAceTable { + what: "an outgoing energy distribution needs at least three columns".into(), + }); + } + for v in &mut data[0] { + *v *= EV_PER_MEV; + } + + let split = n_discrete_lines.min(n_energy_out); + let continuous = Tabular::with_cdf( + data[0][split..].to_vec(), + // The density is per MeV where the energy is in eV. + data[1][split..].iter().map(|&v| v / EV_PER_MEV).collect(), + interpolation, + data[2][split..].to_vec(), + ); + + let distribution = if split > 0 { + let mut discrete = Discrete::new(data[0][..split].to_vec(), data[1][..split].to_vec()); + discrete.c = Some(data[2][..split].to_vec()); + if split == n_energy_out { + Univariate::Discrete(discrete) + } else { + let p_discrete = discrete.p.iter().sum::().min(1.0); + Univariate::Mixture(Mixture::new( + vec![p_discrete, 1.0 - p_discrete], + vec![ + Univariate::Discrete(discrete), + Univariate::Tabular(continuous), + ], + )) + } + } else { + Univariate::Tabular(continuous) + }; + + Ok(AceOutgoingEnergy { + distribution, + data, + n_discrete_lines: split, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::material::Material; + + const FIXTURE: &[u8] = include_bytes!("../../../../tests/n-095_Am_244.endf.xz"); + + #[test] + fn reads_the_fission_neutron_spectrum() { + let m = Material::from_str(&crate::testdata::text(FIXTURE)).unwrap(); + let d = m.mf5(18).expect("MF=5 MT=18 is present"); + assert_eq!(d.za, 95244); + assert_eq!(d.subsections.len(), d.nk as usize); + assert!(!d.subsections.is_empty()); + + // The applicability of a single subsection is unity throughout. + let sub = &d.subsections[0]; + assert!(sub.p.y.iter().all(|&v| v == 1.0)); + + // Am244 gives its fission spectrum as a simple Maxwellian. + assert_eq!(sub.lf, 7); + match &sub.distribution { + EnergyDistribution::MaxwellEnergy { u, theta } => { + // U bounds the outgoing energy by 0 <= E' <= E - U, so a + // negative U widens that range rather than narrowing it. This + // evaluation uses -20 MeV. + assert_eq!(*u, -2.0e7); + // Theta is the Maxwellian temperature in eV, constant here. + assert!(!theta.x.is_empty()); + assert!(theta.y.iter().all(|&v| v > 0.0)); + } + other => panic!("unexpected distribution {other:?}"), + } + } +} diff --git a/crates/endf/src/mf/mf6.rs b/crates/endf/src/mf/mf6.rs new file mode 100644 index 0000000..c00f289 --- /dev/null +++ b/crates/endf/src/mf/mf6.rs @@ -0,0 +1,310 @@ +//! MF=6, energy-angle distributions of reaction products. +//! +//! These are the four distribution shapes a transport code has to sample, and +//! the ones an Arrow projection of this data carries columns for. + +use crate::error::Result; +use crate::function::{Tabulated1D, Tabulated2D}; +use crate::records::Reader; + +/// MF=6: the products of one reaction and their distributions. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf6 { + pub za: i64, + pub awr: f64, + /// Particle-production flag. + pub jp: i64, + /// 1 laboratory frame, 2 centre-of-mass. + pub lct: i64, + pub nk: i64, + pub products: Vec, +} + +/// One product, its yield, and its distribution. +#[derive(Debug, Clone, PartialEq)] +pub struct Product { + /// ZA of the product, 1000*Z + A. 0 is a photon, 1 a neutron. + pub zap: i64, + pub awp: f64, + /// Product modifier flag. + pub lip: i64, + /// Which distribution law the product uses. + pub law: i64, + /// Multiplicity as a function of incident energy. + pub yield_: Tabulated1D, + pub distribution: Distribution, +} + +/// The distribution of a product, in whichever law it uses. +#[derive(Debug, Clone, PartialEq)] +pub enum Distribution { + /// LAW<0 (given elsewhere), LAW=0 (none), LAW=3 (isotropic discrete) and + /// LAW=4 (discrete two-body recoil) carry no data of their own. + None, + /// LAW=1. + ContinuumEnergyAngle(ContinuumEnergyAngle), + /// LAW=2. + DiscreteTwoBody(DiscreteTwoBody), + /// LAW=5. + ChargedParticleElastic(ChargedParticleElastic), + /// LAW=6. + NBodyPhaseSpace { apsx: f64, npsx: i64 }, + /// LAW=7. + LaboratoryAngleEnergy(LaboratoryAngleEnergy), +} + +/// LAW=1: continuum energy-angle distribution. +/// +/// `lang` selects the angular representation: 1 Legendre, 2 Kalbach-Mann, +/// 11 to 15 tabulated with the given interpolation. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ContinuumEnergyAngle { + pub lang: i64, + /// Interpolation scheme for secondary energy. + pub lep: i64, + pub nr: i64, + pub ne: i64, + pub e_int: Tabulated2D, + /// Incident energies. + pub energy: Vec, + pub distribution: Vec, +} + +/// The outgoing distribution at one incident energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ContinuumSubsection { + /// Number of discrete outgoing energies leading the list. + pub nd: i64, + /// Number of angular parameters per outgoing energy. + pub na: i64, + pub nw: i64, + /// Number of outgoing energies. + pub nep: i64, + /// Outgoing energies. + pub e_out: Vec, + /// The angular parameters at each outgoing energy: `nep` rows of `na + 1`. + /// The first column is the probability; the rest depend on `lang`. + pub b: Vec>, +} + +/// LAW=2: discrete two-body scattering. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DiscreteTwoBody { + pub nr: i64, + pub ne: i64, + pub e_int: Tabulated2D, + pub energy: Vec, + pub distribution: Vec, +} + +/// The angular distribution at one incident energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DiscreteTwoBodySubsection { + /// 0 Legendre coefficients, 12 or 14 tabulated. + pub lang: i64, + pub nw: i64, + pub nl: i64, + pub a_l: Vec, +} + +/// LAW=5: charged-particle elastic scattering. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ChargedParticleElastic { + pub spi: f64, + /// Identical-particle flag. + pub lidp: i64, + pub ne: i64, + pub e_int: Tabulated2D, + pub distribution: Vec, +} + +/// The distribution at one incident energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ChargedParticleSubsection { + pub energy: f64, + /// 1 nuclear amplitude, 2 nuclear plus interference, 12 to 15 tabulated. + pub ltp: i64, + pub nw: i64, + pub nl: i64, + pub a: Vec, +} + +/// LAW=7: laboratory energy-angle distribution. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct LaboratoryAngleEnergy { + pub ne: i64, + pub e_int: Tabulated2D, + pub distribution: Vec, +} + +/// The distribution at one incident energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct LaboratorySubsection { + pub energy: f64, + pub nrm: i64, + pub nmu: i64, + /// Interpolation across the outgoing cosine. + pub mu_int: Tabulated2D, + pub mu: Vec, +} + +/// The outgoing energy distribution at one cosine. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct AngleEntry { + pub mu: f64, + pub f: Tabulated1D, +} + +/// LAW=1. Public because MF=26 shares this law. +pub fn parse_continuum_energy_angle(reader: &mut Reader) -> Result { + let tab2 = reader.tab2_record()?; + let mut data = ContinuumEnergyAngle { + lang: tab2.cont.l1, + lep: tab2.cont.l2, + nr: tab2.cont.n1, + ne: tab2.cont.n2, + e_int: tab2.table, + ..Default::default() + }; + + for _ in 0..data.ne.max(0) { + let list = reader.list_record()?; + let (nd, na, nw, nep) = (list.cont.l1, list.cont.l2, list.cont.n1, list.cont.n2); + data.energy.push(list.cont.c2); + + // The values are `nep` rows of `na + 2`: an outgoing energy, then the + // probability and `na` angular parameters. + let stride = (na.max(0) as usize) + 2; + let mut sub = ContinuumSubsection { + nd, + na, + nw, + nep, + e_out: Vec::with_capacity(nep.max(0) as usize), + b: Vec::with_capacity(nep.max(0) as usize), + }; + for row in list.values.chunks(stride).take(nep.max(0) as usize) { + sub.e_out.push(row.first().copied().unwrap_or(0.0)); + sub.b.push(row.get(1..).unwrap_or(&[]).to_vec()); + } + data.distribution.push(sub); + } + + Ok(data) +} + +/// LAW=2. Public because MF=26 shares this law. +pub fn parse_discrete_two_body(reader: &mut Reader) -> Result { + let tab2 = reader.tab2_record()?; + let mut data = DiscreteTwoBody { + nr: tab2.cont.n1, + ne: tab2.cont.n2, + e_int: tab2.table, + ..Default::default() + }; + for _ in 0..data.ne.max(0) { + let list = reader.list_record()?; + data.energy.push(list.cont.c2); + data.distribution.push(DiscreteTwoBodySubsection { + lang: list.cont.l1, + nw: list.cont.n1, + nl: list.cont.n2, + a_l: list.values, + }); + } + Ok(data) +} + +fn parse_charged_particle(reader: &mut Reader) -> Result { + let tab2 = reader.tab2_record()?; + let mut data = ChargedParticleElastic { + spi: tab2.cont.c1, + lidp: tab2.cont.l1, + ne: tab2.cont.n2, + e_int: tab2.table, + ..Default::default() + }; + for _ in 0..data.ne.max(0) { + let list = reader.list_record()?; + data.distribution.push(ChargedParticleSubsection { + energy: list.cont.c2, + ltp: list.cont.l1, + nw: list.cont.n1, + nl: list.cont.n2, + a: list.values, + }); + } + Ok(data) +} + +fn parse_laboratory(reader: &mut Reader) -> Result { + let tab2 = reader.tab2_record()?; + let mut data = LaboratoryAngleEnergy { + ne: tab2.cont.n2, + e_int: tab2.table, + ..Default::default() + }; + for _ in 0..data.ne.max(0) { + let tab2 = reader.tab2_record()?; + let mut sub = LaboratorySubsection { + energy: tab2.cont.c2, + nrm: tab2.cont.n1, + nmu: tab2.cont.n2, + mu_int: tab2.table, + mu: Vec::new(), + }; + for _ in 0..sub.nmu.max(0) { + let tab = reader.tab1_record()?; + sub.mu.push(AngleEntry { + mu: tab.c2, + f: tab.table, + }); + } + data.distribution.push(sub); + } + Ok(data) +} + +/// Parse an MF=6 section. +pub fn parse_mf6(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf6 { + za: head.za, + awr: head.awr, + jp: head.l1, + lct: head.l2, + nk: head.n1, + products: Vec::new(), + }; + + for _ in 0..data.nk.max(0) { + let tab = reader.tab1_record()?; + let law = tab.l2; + let distribution = match law { + 1 => Distribution::ContinuumEnergyAngle(parse_continuum_energy_angle(reader)?), + 2 => Distribution::DiscreteTwoBody(parse_discrete_two_body(reader)?), + 5 => Distribution::ChargedParticleElastic(parse_charged_particle(reader)?), + 6 => { + let c = reader.cont_record()?; + Distribution::NBodyPhaseSpace { + apsx: c.c1, + npsx: c.n2, + } + } + 7 => Distribution::LaboratoryAngleEnergy(parse_laboratory(reader)?), + // LAW<0, 0, 3 and 4 carry nothing of their own. + _ => Distribution::None, + }; + + data.products.push(Product { + zap: tab.c1 as i64, + awp: tab.c2, + lip: tab.l1, + law, + yield_: tab.table, + distribution, + }); + } + + Ok(data) +} diff --git a/crates/endf/src/mf/mf7.rs b/crates/endf/src/mf/mf7.rs new file mode 100644 index 0000000..3ae913f --- /dev/null +++ b/crates/endf/src/mf/mf7.rs @@ -0,0 +1,261 @@ +//! MF=7, thermal neutron scattering law data. + +use crate::error::{Error, Result}; +use crate::function::{Tabulated1D, Tabulated2D}; +use crate::records::Reader; + +/// Coherent elastic scattering: the structure factor against energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct CoherentElastic { + pub t: f64, + /// Number of temperatures beyond the first. + pub lt: i64, + pub s: Tabulated1D, + /// The structure factor at each subsequent temperature. These are LIST + /// records sharing the first temperature's energy grid. + pub others: Vec, +} + +/// The structure factor at one of the subsequent temperatures. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct CoherentElasticTemperature { + pub t: f64, + /// Interpolation between this temperature and the previous one. + pub li: i64, + pub s: Vec, +} + +/// Incoherent elastic scattering. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct IncoherentElastic { + /// Bound cross section. + pub sb: f64, + /// Debye-Waller integral against temperature. + pub w: Tabulated1D, +} + +/// MF=7 MT=2: elastic thermal scattering. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf7Mt2 { + pub za: i64, + pub awr: f64, + /// 1 coherent, 2 incoherent, 3 both. + pub lthr: i64, + pub coherent: Option, + pub incoherent: Option, +} + +/// S(alpha, beta) at one beta, over temperature. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ScatteringLaw { + pub t: f64, + pub beta: f64, + pub lt: i64, + pub s: Tabulated1D, + pub others: Vec, +} + +/// S(alpha, beta) at one further temperature. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ScatteringLawTemperature { + pub t: f64, + pub beta: f64, + /// The Python reader stores the outer LT here rather than the LI it reads + /// from the record, so the interpolation flag is lost. Reproduced so the + /// two agree; see + /// . + pub lt: i64, + pub s: Vec, +} + +/// MF=7 MT=4: incoherent inelastic thermal scattering. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf7Mt4 { + pub za: i64, + pub awr: f64, + /// 1 when alpha and beta are given in units of kT at 0.0253 eV. + pub lat: i64, + /// 1 when S is asymmetric in beta. + pub lasym: i64, + /// 1 when S is stored as its natural logarithm. + pub lln: i64, + pub ni: i64, + pub ns: i64, + /// The B parameters describing the principal and secondary atoms. + pub b: Vec, + pub beta_int: Option, + pub nb: i64, + pub beta_data: Vec, + /// Effective temperature for the principal atom and any secondary atom + /// whose analytic-model flag is zero. + pub teff: Vec, +} + +/// One element of a thermal scattering material. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ThermalElement { + pub nas: i64, + pub ni: i64, + pub zai: Vec, + pub lisi: Vec, + pub afi: Vec, + pub awri: Vec, + pub sfi: Vec, +} + +/// MF=7 MT=451: the generalised information file for thermal scattering. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf7Mt451 { + pub za: i64, + pub awr: f64, + pub na: i64, + pub elements: Vec, +} + +fn column(values: &[f64], offset: usize, stride: usize) -> Vec { + values + .iter() + .skip(offset) + .step_by(stride) + .copied() + .collect() +} + +fn parse_coherent(reader: &mut Reader) -> Result { + let tab = reader.tab1_record()?; + let lt = tab.l1; + let mut data = CoherentElastic { + t: tab.c1, + lt, + s: tab.table, + others: Vec::new(), + }; + for _ in 0..lt.max(0) { + let list = reader.list_record()?; + data.others.push(CoherentElasticTemperature { + t: list.cont.c1, + li: list.cont.l1, + s: list.values, + }); + } + Ok(data) +} + +fn parse_incoherent(reader: &mut Reader) -> Result { + let tab = reader.tab1_record()?; + Ok(IncoherentElastic { + sb: tab.c1, + w: tab.table, + }) +} + +/// Parse MF=7 MT=2. +pub fn parse_mf7_mt2(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let lthr = head.l1; + let mut data = Mf7Mt2 { + za: head.za, + awr: head.awr, + lthr, + ..Default::default() + }; + match lthr { + 1 => data.coherent = Some(parse_coherent(reader)?), + 2 => data.incoherent = Some(parse_incoherent(reader)?), + 3 => { + data.coherent = Some(parse_coherent(reader)?); + data.incoherent = Some(parse_incoherent(reader)?); + } + _ => {} + } + Ok(data) +} + +/// Parse MF=7 MT=4. +pub fn parse_mf7_mt4(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf7Mt4 { + za: head.za, + awr: head.awr, + lat: head.l2, + lasym: head.n1, + ..Default::default() + }; + + let list = reader.list_record()?; + data.lln = list.cont.l1; + data.ni = list.cont.n1; + data.ns = list.cont.n2; + data.b = list.values; + + // B(1) is zero when the principal atom uses an analytic law, in which case + // no tabulated S(alpha, beta) follows. + if data.b.first().copied().unwrap_or(0.0) > 0.0 { + let tab2 = reader.tab2_record()?; + data.nb = tab2.cont.n2; + data.beta_int = Some(tab2.table); + for _ in 0..data.nb.max(0) { + let tab = reader.tab1_record()?; + let lt = tab.l1; + let mut law = ScatteringLaw { + t: tab.c1, + beta: tab.c2, + lt, + s: tab.table, + others: Vec::new(), + }; + for _ in 0..lt.max(0) { + let list = reader.list_record()?; + law.others.push(ScatteringLawTemperature { + t: list.cont.c1, + beta: list.cont.c2, + // The record's own LI is read and discarded upstream; the + // outer LT is stored instead. See issue #16. + lt, + s: list.values, + }); + } + data.beta_data.push(law); + } + } + + // The principal atom always has an effective temperature; a secondary atom + // has one when its analytic-model flag B(6*i+1) is zero. + data.teff.push(reader.tab1_record()?.table); + for i in 0..data.ns.max(0) as usize { + let idx = 6 * (i + 1); + let flag = data.b.get(idx).ok_or(Error::Unsupported { + what: "an MF=7 MT=4 section whose B list is shorter than NS implies", + })?; + if *flag == 0.0 { + data.teff.push(reader.tab1_record()?.table); + } + } + + Ok(data) +} + +/// Parse MF=7 MT=451. +pub fn parse_mf7_mt451(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf7Mt451 { + za: head.za, + awr: head.awr, + na: head.l1, + elements: Vec::new(), + }; + for _ in 0..data.na.max(0) { + let list = reader.list_record()?; + let v = &list.values; + data.elements.push(ThermalElement { + nas: list.cont.l1, + ni: list.cont.n2, + zai: column(v, 0, 6), + lisi: column(v, 1, 6), + afi: column(v, 2, 6), + awri: column(v, 3, 6), + sfi: column(v, 4, 6), + }); + } + Ok(data) +} diff --git a/crates/endf/src/mf/mf8.rs b/crates/endf/src/mf/mf8.rs new file mode 100644 index 0000000..8bb00b5 --- /dev/null +++ b/crates/endf/src/mf/mf8.rs @@ -0,0 +1,503 @@ +//! MF=8, radioactive decay, fission product yields and nuclide production. +//! +//! These are what a transmutation network is built from: MT=457 gives decay +//! modes and spectra, MT=454/459 the fission yields, and the general MF=8 +//! sections the radioactive products of a reaction. + +use crate::error::Result; +use crate::function::Tabulated1D; +use crate::records::Reader; + +/// A value with its uncertainty, as MF=8 stores most quantities. +pub type WithUncertainty = (f64, f64); + +/// MF=8 for a reaction: the radioactive nuclides it produces. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf8 { + pub za: i64, + pub awr: f64, + pub lis: i64, + pub liso: i64, + pub ns: i64, + /// 0 when the decay chain is given here, 1 when it is in MT=457. + pub no: i64, + pub subsections: Vec, +} + +/// One radioactive product of the reaction. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ProductionSubsection { + pub zap: f64, + pub elfs: f64, + /// Which file the production cross section is in. + pub lmf: i64, + pub lfs: i64, + /// Number of decay chain entries. `None` when NO=1 and the chain is + /// elsewhere. + pub nd: Option, + pub hl: Vec, + pub rtyp: Vec, + pub zan: Vec, + pub br: Vec, + pub end: Vec, + pub ct: Vec, +} + +/// MF=8 MT=454 or MT=459: fission product yields, independent or cumulative. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf8Mt454 { + pub za: i64, + pub awr: f64, + /// One less than the number of incident energies. + pub le: i64, + pub yields: Vec, +} + +/// The yields at one incident energy. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct FissionYields { + pub energy: f64, + pub nn: i64, + pub nfp: i64, + /// LE+1 for the first energy, the interpolation scheme for the rest. The + /// format overloads the same field, and so does the Python reader, which + /// keys it `LE` on the first entry and `I` on the others. + pub le_or_interpolation: i64, + pub products: Vec, +} + +/// One fission product and its yield. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct FissionProduct { + pub zafp: f64, + /// Isomeric state of the product. + pub fps: f64, + pub y: WithUncertainty, +} + +/// MF=8 MT=457: radioactive decay data. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf8Mt457 { + pub za: i64, + pub awr: f64, + pub lis: i64, + pub liso: i64, + /// 1 when the nuclide is stable, in which case only the spin and parity + /// follow. + pub nst: i64, + pub nsp: i64, + pub spi: f64, + pub par: f64, + /// Half-life in seconds. `None` for a stable nuclide. + pub half_life: Option, + pub nc: i64, + /// Average decay energies by radiation type. + pub ex: Vec, + pub ndk: i64, + pub modes: Vec, + pub spectra: Vec, +} + +/// One decay mode and its branching ratio. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DecayMode { + /// Decay type: 1 beta-, 2 beta+/EC, 3 IT, 4 alpha, and so on. A value like + /// 1.5 means a chain of two modes. + pub rtyp: f64, + /// Isomeric state of the daughter. + pub rfs: f64, + pub q: WithUncertainty, + pub br: WithUncertainty, +} + +/// The spectrum of one radiation type emitted in decay. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Spectrum { + /// Radiation type: 0 gamma, 1 beta-, 2 beta+, 4 alpha, and so on. Stored + /// as written, a float, because the format puts it in a C field. + pub styp: f64, + /// 0 discrete only, 1 continuous only, 2 both. + pub lcon: i64, + pub lcov: i64, + pub ner: i64, + /// Discrete normalisation factor. + pub fd: WithUncertainty, + /// Average decay energy of this radiation type. + pub er_av: WithUncertainty, + /// Continuum normalisation factor. + pub fc: WithUncertainty, + pub discrete: Vec, + pub continuous: Option, + pub continuous_covariance: Option, + pub discrete_covariance: Option, +} + +/// One discrete line. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DiscreteRadiation { + pub er: WithUncertainty, + pub rtyp: f64, + pub type_: f64, + /// Intensity. + pub ri: WithUncertainty, + /// Internal pair formation coefficient, for STYP 0 and 2. + pub ris: Option, + /// Total internal conversion coefficient, STYP 0 only. + pub ricc: Option, + /// K-shell internal conversion coefficient. + pub rick: Option, + /// L-shell internal conversion coefficient. + pub ricl: Option, +} + +/// A continuous spectrum. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ContinuousSpectrum { + pub rtyp: f64, + pub rp: Tabulated1D, +} + +/// Covariance of a continuous spectrum. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ContinuousCovariance { + pub lb: i64, + pub ek: Vec, + pub fk: Vec, +} + +/// Covariance of the discrete lines. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct DiscreteCovariance { + pub ls: i64, + pub lb: i64, + pub ne: i64, + pub nerp: i64, + pub ek: Vec, + /// Packed upper-triangular covariance; the format's packing order is not + /// unpacked here, matching the Python reader. + pub fkk: Vec, +} + +fn pair(values: &[f64], i: usize) -> WithUncertainty { + ( + values.get(i).copied().unwrap_or(0.0), + values.get(i + 1).copied().unwrap_or(0.0), + ) +} + +/// The same, but `None` when the record is too short to hold the pair. +/// +/// MF=8 MT=457 discrete records are written with NT = 6 or NT = 12 depending +/// on whether the internal conversion coefficients were evaluated, and the two +/// lengths appear within a single spectrum. The Python reader slices, so a +/// missing coefficient comes back as an empty tuple rather than as a zero; +/// this keeps that distinction. +fn opt_pair(values: &[f64], i: usize) -> Option { + (values.len() >= i + 2).then(|| pair(values, i)) +} + +fn column(values: &[f64], offset: usize, stride: usize) -> Vec { + values + .iter() + .skip(offset) + .step_by(stride) + .copied() + .collect() +} + +/// Parse a general MF=8 section. +pub fn parse_mf8(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let no = head.n2; + let mut data = Mf8 { + za: head.za, + awr: head.awr, + lis: head.l1, + liso: head.l2, + ns: head.n1, + no, + subsections: Vec::new(), + }; + + for _ in 0..data.ns.max(0) { + let sub = if no == 0 { + let list = reader.list_record()?; + let v = &list.values; + ProductionSubsection { + zap: list.cont.c1, + elfs: list.cont.c2, + lmf: list.cont.l1, + lfs: list.cont.l2, + nd: Some((v.len() / 6) as i64), + hl: column(v, 0, 6), + rtyp: column(v, 1, 6), + zan: column(v, 2, 6), + br: column(v, 3, 6), + end: column(v, 4, 6), + ct: column(v, 5, 6), + } + } else { + let c = reader.cont_record()?; + ProductionSubsection { + zap: c.c1, + elfs: c.c2, + lmf: c.l1, + lfs: c.l2, + ..Default::default() + } + }; + data.subsections.push(sub); + } + + Ok(data) +} + +/// Parse MF=8 MT=454 or MT=459. +pub fn parse_mf8_mt454(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let le = head.l1 - 1; + let mut data = Mf8Mt454 { + za: head.za, + awr: head.awr, + le, + yields: Vec::new(), + }; + + for _ in 0..(le + 1).max(0) { + let list = reader.list_record()?; + let v = &list.values; + let nfp = list.cont.n2; + let mut set = FissionYields { + energy: list.cont.c1, + nn: list.cont.n1, + nfp, + le_or_interpolation: list.cont.l1, + products: Vec::with_capacity(nfp.max(0) as usize), + }; + for j in 0..nfp.max(0) as usize { + set.products.push(FissionProduct { + zafp: v.get(4 * j).copied().unwrap_or(0.0), + fps: v.get(4 * j + 1).copied().unwrap_or(0.0), + y: pair(v, 4 * j + 2), + }); + } + data.yields.push(set); + } + + Ok(data) +} + +/// Parse MF=8 MT=457. +pub fn parse_mf8_mt457(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let mut data = Mf8Mt457 { + za: head.za, + awr: head.awr, + lis: head.l1, + liso: head.l2, + nst: head.n1, + nsp: head.n2, + ..Default::default() + }; + + // A stable nuclide carries only its spin and parity. + if data.nst == 1 { + reader.list_record()?; + let list = reader.list_record()?; + data.spi = list.cont.c1; + data.par = list.cont.c2; + return Ok(data); + } + + // Half-life and the average decay energies. + let list = reader.list_record()?; + data.half_life = Some((list.cont.c1, list.cont.c2)); + data.nc = list.cont.n1 / 2; + data.ex = list + .values + .chunks(2) + .map(|c| (c[0], c.get(1).copied().unwrap_or(0.0))) + .collect(); + + // Spin, parity and the decay modes. + let list = reader.list_record()?; + data.spi = list.cont.c1; + data.par = list.cont.c2; + data.ndk = list.cont.n2; + let v = &list.values; + for i in 0..data.ndk.max(0) as usize { + data.modes.push(DecayMode { + rtyp: v.get(6 * i).copied().unwrap_or(0.0), + rfs: v.get(6 * i + 1).copied().unwrap_or(0.0), + q: pair(v, 6 * i + 2), + br: pair(v, 6 * i + 4), + }); + } + + for _ in 0..data.nsp.max(0) { + let list = reader.list_record()?; + let v = &list.values; + let (styp, lcon, lcov, ner) = (list.cont.c2, list.cont.l1, list.cont.l2, list.cont.n2); + let mut spectrum = Spectrum { + styp, + lcon, + lcov, + ner, + fd: pair(v, 0), + er_av: pair(v, 2), + fc: pair(v, 4), + ..Default::default() + }; + + if lcon != 1 { + for _ in 0..ner.max(0) { + let list = reader.list_record()?; + let v = &list.values; + spectrum.discrete.push(DiscreteRadiation { + er: (list.cont.c1, list.cont.c2), + rtyp: v.first().copied().unwrap_or(0.0), + type_: v.get(1).copied().unwrap_or(0.0), + ri: pair(v, 2), + ris: (styp == 0.0 || styp == 2.0) + .then(|| opt_pair(v, 4)) + .flatten(), + ricc: (styp == 0.0).then(|| opt_pair(v, 6)).flatten(), + rick: (styp == 0.0).then(|| opt_pair(v, 8)).flatten(), + ricl: (styp == 0.0).then(|| opt_pair(v, 10)).flatten(), + }); + } + } + + if lcon != 0 { + let tab = reader.tab1_record()?; + spectrum.continuous = Some(ContinuousSpectrum { + rtyp: tab.c1, + rp: tab.table, + }); + } + + if !matches!(lcov, 0 | 2) && lcon != 0 { + let list = reader.list_record()?; + spectrum.continuous_covariance = Some(ContinuousCovariance { + lb: list.cont.l2, + ek: column(&list.values, 0, 2), + fk: column(&list.values, 1, 2), + }); + } + + if !matches!(lcov, 0 | 1) { + let list = reader.list_record()?; + let nerp = list.cont.n2.max(0) as usize; + spectrum.discrete_covariance = Some(DiscreteCovariance { + ls: list.cont.l1, + lb: list.cont.l2, + ne: list.cont.n1, + nerp: list.cont.n2, + ek: list.values.iter().take(nerp).copied().collect(), + fkk: list.values.iter().skip(nerp).copied().collect(), + }); + } + + data.spectra.push(spectrum); + } + + Ok(data) +} + +/// MF=9 (multiplicities) and MF=10 (production cross sections) for the +/// isomeric states a reaction produces. +/// +/// These are where isomeric branching comes from. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf9Mf10 { + pub za: i64, + pub awr: f64, + pub lis: i64, + pub ns: i64, + /// 9 or 10, which says whether `func` is a multiplicity or a cross section. + pub mf: i64, + pub levels: Vec, +} + +/// One isomeric state of the product. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct IsomerLevel { + pub qm: f64, + pub qi: f64, + /// ZA of the product. + pub izap: i64, + /// Isomeric state number. + pub lfs: i64, + /// The multiplicity for MF=9, the cross section for MF=10. + pub func: Tabulated1D, +} + +/// Parse an MF=9 or MF=10 section. +pub fn parse_mf9_mf10(reader: &mut Reader, mf: i64) -> Result { + let head = reader.head_record()?; + let mut data = Mf9Mf10 { + za: head.za, + awr: head.awr, + lis: head.l1, + ns: head.n1, + mf, + levels: Vec::new(), + }; + for _ in 0..data.ns.max(0) { + let tab = reader.tab1_record()?; + data.levels.push(IsomerLevel { + qm: tab.c1, + qi: tab.c2, + izap: tab.l1, + lfs: tab.l2, + func: tab.table, + }); + } + Ok(data) +} + +#[cfg(test)] +mod tests { + use crate::material::Material; + + const IN115: &[u8] = include_bytes!("../../../../tests/n-049_In-115_trimmed.endf.xz"); + + #[test] + fn reads_isomer_production() { + let m = Material::from_str(&crate::testdata::text(IN115)).unwrap(); + // In-115 (n,gamma) populating the In-116 first isomeric state. This is + // where an isomeric branching ratio comes from. + let mf9 = m.mf9(102).expect("MF=9 MT=102 is present"); + assert_eq!(mf9.mf, 9); + assert_eq!(mf9.levels.len(), mf9.ns as usize); + + let level = &mf9.levels[0]; + assert_eq!(level.izap, 49116, "the product is In-116"); + assert_eq!(level.lfs, 1, "the first isomeric state"); + // MF=9 gives a multiplicity, so it is bounded by one. + assert!(!level.func.x.is_empty()); + assert!(level.func.y.iter().all(|&v| (0.0..=1.0).contains(&v))); + } + + #[test] + fn reads_isomer_production_cross_sections() { + let m = Material::from_str(&crate::testdata::text(IN115)).unwrap(); + // MF=10 carries a cross section for the same kind of product. + let mf10 = m.mf10(16).expect("MF=10 MT=16 is present"); + assert_eq!(mf10.mf, 10); + let level = &mf10.levels[0]; + assert_eq!(level.izap, 49114, "(n,2n) leaves In-114"); + assert!(level.func.y.iter().all(|&v| v >= 0.0)); + } + + #[test] + fn reads_radioactive_production() { + let m = Material::from_str(&crate::testdata::text(IN115)).unwrap(); + let mf8 = m.mf8(102).expect("MF=8 MT=102 is present"); + assert_eq!(mf8.subsections.len(), mf8.ns as usize); + assert!(!mf8.subsections.is_empty()); + // NO=1 means the decay chain lives in MT=457 rather than here. + assert_eq!(mf8.no, 1); + assert_eq!(mf8.subsections[0].nd, None); + } +} diff --git a/crates/endf/src/mf/mod.rs b/crates/endf/src/mf/mod.rs new file mode 100644 index 0000000..70bdd39 --- /dev/null +++ b/crates/endf/src/mf/mod.rs @@ -0,0 +1,24 @@ +//! One module per ENDF file (MF), each turning a section's records into a +//! typed struct. +//! +//! # Porting the rest +//! +//! The Python package covers MF 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, +//! 23, 26, 27, 28, 33, 34 and 40. [`mf3`] is the worked example: a module +//! exposes a struct and a `parse_mfN(&mut Reader) -> Result` function, +//! gains a variant in [`crate::material::Section`], and an arm in that module's +//! dispatch. Sections without a Rust parser stay +//! [`crate::material::Section::Unparsed`] with their text intact, so the two +//! readers can run side by side while the port is checked file by file. + +pub mod atomic; +pub mod covariance; +pub mod mf1; +pub mod mf2; +pub mod mf3; +pub mod mf4; +pub mod mf5; +pub mod mf6; +pub mod mf7; +pub mod mf8; +pub mod photon; diff --git a/crates/endf/src/mf/photon.rs b/crates/endf/src/mf/photon.rs new file mode 100644 index 0000000..a011cd7 --- /dev/null +++ b/crates/endf/src/mf/photon.rs @@ -0,0 +1,323 @@ +//! MF=12 to MF=15, photon production. +//! +//! Grouped into one module because the four files describe one thing between +//! them: how many photons a reaction makes (MF=12), the cross section for +//! making them (MF=13), where they go (MF=14) and with what energy (MF=15). + +use crate::error::Result; +use crate::function::{Tabulated1D, Tabulated2D}; +use crate::records::Reader; + +// ------------------------------------------------------------------------- +// MF=12 +// ------------------------------------------------------------------------- + +/// One discrete photon's multiplicity. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Multiplicity { + /// Photon energy, or the binding energy when LP=2. + pub eg: f64, + /// Energy of the level the photon originates from. + pub es: f64, + /// Primary photon flag. + pub lp: i64, + /// 1 when the photon energy is discrete, 2 when it is a distribution. + pub lf: i64, + pub y: Tabulated1D, +} + +/// One entry in a transition probability array. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Transition { + /// Energy of the level transitioned to. + pub es: f64, + /// Probability of the transition. + pub tp: f64, + /// Conditional photon emission probability. Only present for LG=2. + pub gp: Option, +} + +/// MF=12: photon production multiplicities or transition probabilities. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf12 { + pub za: i64, + pub awr: f64, + /// 1 multiplicities, 2 transition probabilities. + pub lo: i64, + pub nk: i64, + /// LO=1 with more than one photon: the total yield. + pub total_yield: Option, + /// LO=1. + pub multiplicities: Vec, + /// LO=2: 1 simple, 2 complex. + pub lg: Option, + /// LO=2: energy of the highest level. + pub es_ns: f64, + pub lp: i64, + pub nt: i64, + pub transitions: Vec, + /// True when LO was neither 1 nor 2, which the Python reader warns about + /// and otherwise ignores. + pub unrecognised_lo: bool, +} + +/// Parse an MF=12 section. +pub fn parse_mf12(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let (lo, lg, nk) = (head.l1, head.l2, head.n1); + let mut data = Mf12 { + za: head.za, + awr: head.awr, + lo, + nk, + ..Default::default() + }; + + if lo == 1 { + // The total yield is only written when there is more than one photon + // to total. + if nk > 1 { + data.total_yield = Some(reader.tab1_record()?.table); + } + for _ in 0..nk.max(0) { + let tab = reader.tab1_record()?; + data.multiplicities.push(Multiplicity { + eg: tab.c1, + es: tab.c2, + lp: tab.l1, + lf: tab.l2, + y: tab.table, + }); + } + } else if lo == 2 { + data.lg = Some(lg); + let list = reader.list_record()?; + data.es_ns = list.cont.c1; + data.lp = list.cont.l1; + data.nt = list.cont.n2; + let v = &list.values; + let stride = if lg == 2 { 3 } else { 2 }; + for i in 0..data.nt.max(0) as usize { + data.transitions.push(Transition { + es: v.get(stride * i).copied().unwrap_or(0.0), + tp: v.get(stride * i + 1).copied().unwrap_or(0.0), + gp: (lg == 2).then(|| v.get(stride * i + 2).copied().unwrap_or(0.0)), + }); + } + } else { + data.unrecognised_lo = true; + } + + Ok(data) +} + +// ------------------------------------------------------------------------- +// MF=13 +// ------------------------------------------------------------------------- + +/// One discrete photon's production cross section. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct PhotonCrossSection { + pub eg: f64, + pub es: f64, + pub lp: i64, + pub lf: i64, + pub sigma: Tabulated1D, +} + +/// MF=13: photon production cross sections. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf13 { + pub za: i64, + pub awr: f64, + pub nk: i64, + /// Written only when there is more than one photon. + pub sigma_total: Option, + pub photons: Vec, +} + +/// Parse an MF=13 section. +pub fn parse_mf13(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let nk = head.n1; + let mut data = Mf13 { + za: head.za, + awr: head.awr, + nk, + ..Default::default() + }; + if nk > 1 { + data.sigma_total = Some(reader.tab1_record()?.table); + } + for _ in 0..nk.max(0) { + let tab = reader.tab1_record()?; + data.photons.push(PhotonCrossSection { + eg: tab.c1, + es: tab.c2, + lp: tab.l1, + lf: tab.l2, + sigma: tab.table, + }); + } + Ok(data) +} + +// ------------------------------------------------------------------------- +// MF=14 +// ------------------------------------------------------------------------- + +/// The angular distribution of one photon. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct PhotonAngle { + pub eg: f64, + pub es: f64, + /// Set for the anisotropic subsections only; an isotropic one carries + /// nothing beyond its two energies. + pub isotropic: bool, + pub ne: i64, + pub e_int: Option, + /// Incident energies. + pub energy: Vec, + /// LTT=1: the number of Legendre coefficients at each incident energy. + /// Held as floats because the Python reader stores them in a float array. + pub nl: Vec, + /// LTT=1: the Legendre coefficients at each incident energy. + pub a_lk: Vec>, + /// LTT=2: the tabulated distribution at each incident energy. + pub p_k: Vec, +} + +/// MF=14: photon angular distributions. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf14 { + pub za: i64, + pub awr: f64, + /// 1 when every photon is isotropic, in which case nothing follows. + pub li: i64, + pub nk: i64, + pub ltt: Option, + /// Number of isotropic photons, which come first. + pub ni: Option, + pub subsections: Vec, +} + +/// Parse an MF=14 section. +pub fn parse_mf14(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let (li, ltt, nk, ni) = (head.l1, head.l2, head.n1, head.n2); + let mut data = Mf14 { + za: head.za, + awr: head.awr, + li, + nk, + ..Default::default() + }; + + // Every photon isotropic: the section ends here. + if li == 1 { + return Ok(data); + } + data.ltt = Some(ltt); + data.ni = Some(ni); + + for _ in 0..ni.max(0) { + let c = reader.cont_record()?; + data.subsections.push(PhotonAngle { + eg: c.c1, + es: c.c2, + isotropic: true, + ..Default::default() + }); + } + + for _ in ni.max(0)..nk.max(0) { + let tab2 = reader.tab2_record()?; + let ne = tab2.cont.n2; + let mut sub = PhotonAngle { + eg: tab2.cont.c1, + es: tab2.cont.c2, + isotropic: false, + ne, + e_int: Some(tab2.table), + ..Default::default() + }; + if ltt == 1 { + for _ in 0..ne.max(0) { + let list = reader.list_record()?; + sub.energy.push(list.cont.c2); + sub.nl.push(list.cont.n1 as f64); + sub.a_lk.push(list.values); + } + } else if ltt == 2 { + for _ in 0..ne.max(0) { + let tab = reader.tab1_record()?; + sub.energy.push(tab.c2); + sub.p_k.push(tab.table); + } + } + data.subsections.push(sub); + } + + Ok(data) +} + +// ------------------------------------------------------------------------- +// MF=15 +// ------------------------------------------------------------------------- + +/// One partial photon energy distribution. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct PhotonSpectrum { + /// Only LF=1 is defined for MF=15. + pub lf: i64, + /// Fraction of the emission this subsection describes. + pub p: Tabulated1D, + pub e_int: Tabulated2D, + pub ne: i64, + /// Incident energies. + pub energy: Vec, + /// Normalised outgoing spectrum at each incident energy. + pub g: Vec, +} + +/// MF=15: continuous photon energy spectra. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mf15 { + pub za: i64, + pub awr: f64, + pub nc: i64, + pub subsections: Vec, +} + +/// Parse an MF=15 section. +pub fn parse_mf15(reader: &mut Reader) -> Result { + let head = reader.head_record()?; + let nc = head.n1; + let mut data = Mf15 { + za: head.za, + awr: head.awr, + nc, + subsections: Vec::new(), + }; + + for _ in 0..nc.max(0) { + let p = reader.tab1_record()?; + let tab2 = reader.tab2_record()?; + let ne = tab2.cont.n2; + let mut sub = PhotonSpectrum { + lf: p.l2, + p: p.table, + e_int: tab2.table, + ne, + ..Default::default() + }; + for _ in 0..ne.max(0) { + let tab = reader.tab1_record()?; + sub.energy.push(tab.c2); + sub.g.push(tab.table); + } + data.subsections.push(sub); + } + + Ok(data) +} diff --git a/crates/endf/src/njoy.rs b/crates/endf/src/njoy.rs new file mode 100644 index 0000000..e3d9efb --- /dev/null +++ b/crates/endf/src/njoy.rs @@ -0,0 +1,584 @@ +//! Driving NJOY: writing its input deck and running it. +//! +//! NJOY turns an evaluation into the processed forms a transport code reads — +//! a pointwise ENDF file, or an ACE table at a given temperature. It takes its +//! instructions on standard input and refers to files by unit number, so the +//! work here is composing the deck and staging the tapes. + +use std::collections::BTreeMap; +use std::io::Write; +use std::path::{Path, PathBuf}; + +use crate::error::{Error, Result}; +use crate::material::Material; + +/// The library each NLIB value names. +pub const LIBRARY: [(i64, &str); 19] = [ + (0, "ENDF/B"), + (1, "ENDF/A"), + (2, "JEFF"), + (3, "EFF"), + (4, "ENDF/B High Energy"), + (5, "CENDL"), + (6, "JENDL"), + (17, "TENDL"), + (18, "ROSFOND"), + (21, "SG-23"), + (31, "INDL/V"), + (32, "INDL/A"), + (33, "FENDL"), + (34, "IRDF"), + (35, "BROND"), + (36, "INGDB-90"), + (37, "FENDL/A"), + (38, "IAEA/PD"), + (41, "BROND"), +]; + +/// The library an NLIB value names, or `"Unknown"`. +pub fn library_name(nlib: i64) -> &'static str { + LIBRARY + .iter() + .find(|&&(k, _)| k == nlib) + .map_or("Unknown", |&(_, name)| name) +} + +/// Where each NJOY module's output tape should go. +/// +/// `None` means the module is not run at all; `Some(None)` runs it and writes +/// its tape under `output_dir` with the module's own name; `Some(Some(path))` +/// runs it and writes the tape there. +pub type ModuleOutput = Option>; + +/// What to ask NJOY for. +#[derive(Debug, Clone)] +pub struct AceOptions { + /// Temperatures in kelvin. Empty means room temperature alone. + pub temperatures: Vec, + /// Fractional tolerance for reconstruction and broadening. + pub error: f64, + pub pendf: ModuleOutput, + pub broadr: ModuleOutput, + pub heatr: ModuleOutput, + pub gaspr: ModuleOutput, + pub purr: ModuleOutput, + pub acer: ModuleOutput, + /// Where the ACE file goes. Defaults to `output_dir/ace`. + pub ace: Option, + /// Where the xsdir goes. Defaults to sitting beside the ACE file. + pub xsdir: Option, + pub output_dir: PathBuf, + /// Whether ACER thins and smooths the elastic and capture cross sections + /// at low energy. + pub smoothing: bool, + /// The NJOY executable. + pub njoy_exec: String, + /// Where to keep a copy of the input deck, for a person to read. + pub input_filename: Option, +} + +impl Default for AceOptions { + /// Every module on, room temperature, output in the current directory — + /// the same defaults the Python package has. + fn default() -> Self { + AceOptions { + temperatures: Vec::new(), + error: 0.001, + pendf: None, + broadr: Some(None), + heatr: Some(None), + gaspr: Some(None), + purr: Some(None), + acer: Some(None), + ace: None, + xsdir: None, + output_dir: PathBuf::from("."), + smoothing: true, + njoy_exec: "njoy".to_string(), + input_filename: None, + } + } +} + +impl AceOptions { + /// The options for a pointwise ENDF file: every module but `reconr` off. + pub fn pendf_only(pendf: impl Into) -> AceOptions { + AceOptions { + pendf: Some(Some(pendf.into())), + broadr: None, + heatr: None, + gaspr: None, + purr: None, + acer: None, + ..Default::default() + } + } +} + +/// The input deck, and where its tapes come from and go. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Deck { + /// The commands, as NJOY reads them on standard input. + pub commands: String, + /// Input files, by the unit number NJOY calls them. + pub tapein: BTreeMap, + /// Output files, likewise. + pub tapeout: BTreeMap, + /// The temperatures ACER was asked for, in the order it writes them. + pub temperatures: Vec, + /// Whether the target is metastable, which ACER does not record in the + /// ZAID it writes. + pub isomeric_state: i64, +} + +/// Compose the NJOY input deck for an evaluation. +/// +/// Separated from running it so the deck can be inspected, written out or +/// tested without NJOY installed. +pub fn ace_deck(filename: &Path, material: &Material, options: &AceOptions) -> Result { + let metadata = material.mf1_mt451().ok_or(Error::Unsupported { + what: "an evaluation with no MF=1 MT=451 to process", + })?; + let mat = material.mat; + // The Python reader leaves ZSYMAM as the file wrote it, padding and all, + // and NJOY takes it that way. + let zsymam = metadata.zsymam.clone().unwrap_or_default(); + let library = format!( + "{}-{}.{}", + library_name(metadata.nlib), + metadata.nver, + metadata.lrel + ); + + let temperatures = if options.temperatures.is_empty() { + vec![293.6] + } else { + options.temperatures.clone() + }; + let temps = temperatures + .iter() + .map(|t| crate::data::python_float_str(*t)) + .collect::>() + .join(" "); + let error = options.error; + + let out = &options.output_dir; + // `Some(None)` means the module runs and names its own tape. + let named = |module: &ModuleOutput, default: &str| -> Option { + module + .as_ref() + .map(|path| path.clone().unwrap_or_else(|| out.join(default))) + }; + + // NJOY refers to files by unit number, and each module reads the tape the + // one before it wrote, so the numbers thread through in sequence. + let (nendf, npendf) = (20, 21); + let mut deck = Deck { + tapein: BTreeMap::from([(nendf, filename.to_path_buf())]), + temperatures: temperatures.clone(), + isomeric_state: metadata.liso, + ..Default::default() + }; + + if let Some(path) = named(&options.pendf, "pendf") { + deck.tapeout.insert(npendf, path); + } + + deck.commands.push_str(&format!( + " +reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% +{nendf} {npendf} +'{library} PENDF for {zsymam}'/ +{mat} 2/ +{error}/ err +'{library}: {zsymam}'/ +'Processed by NJOY'/ +0/ +" + )); + let mut nlast = npendf; + + if let Some(path) = named(&options.broadr, "broadr") { + let nbroadr = nlast + 1; + deck.tapeout.insert(nbroadr, path); + let num_temp = temperatures.len(); + deck.commands.push_str(&format!( + " +broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {npendf} {nbroadr} +{mat} {num_temp} 0 0 0. / +{error}/ errthn +{temps} +0/ +" + )); + nlast = nbroadr; + } + + if options.heatr.is_some() { + // Two runs: one where photons deposit their energy locally, one where + // they carry it away. + let nheatr_in = nlast; + let nheatr_local = nheatr_in + 1; + let local = match &options.heatr { + Some(Some(path)) => { + let mut name = path.clone().into_os_string(); + name.push("_local"); + PathBuf::from(name) + } + _ => out.join("heatr_local"), + }; + deck.tapeout.insert(nheatr_local, local); + deck.commands.push_str(&format!( + " +heatr / %%%%%%%%%%%%%%%%% Add heating kerma (local photons) %%%%%%%%%%%%%%%%%%%% +{nendf} {nheatr_in} {nheatr_local} / +{mat} 4 0 0 1 / +302 318 402 444 / +" + )); + + let nheatr = nheatr_local + 1; + deck.tapeout + .insert(nheatr, named(&options.heatr, "heatr").expect("heatr is on")); + deck.commands.push_str(&format!( + " +heatr / %%%%%%%%%%%%%%%%%%%%%%%%% Add heating kerma %%%%%%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {nheatr_in} {nheatr} / +{mat} 4 0 0 0 / +302 318 402 444 / +" + )); + nlast = nheatr; + } + + if let Some(path) = named(&options.gaspr, "gaspr") { + let ngaspr_in = nlast; + let ngaspr = ngaspr_in + 1; + deck.tapeout.insert(ngaspr, path); + deck.commands.push_str(&format!( + " +gaspr / %%%%%%%%%%%%%%%%%%%%%%%%% Add gas production %%%%%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {ngaspr_in} {ngaspr} / +" + )); + nlast = ngaspr; + } + + if let Some(path) = named(&options.purr, "purr") { + let npurr_in = nlast; + let npurr = npurr_in + 1; + deck.tapeout.insert(npurr, path); + let num_temp = temperatures.len(); + deck.commands.push_str(&format!( + " +purr / %%%%%%%%%%%%%%%%%%%%%%%% Add probability tables %%%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {npurr_in} {npurr} / +{mat} {num_temp} 1 20 64 / +{temps} +1.e10 +0/ +" + )); + nlast = npurr; + } + + if options.acer.is_some() { + let nacer_in = nlast; + let ismooth = i32::from(options.smoothing); + for (i, &temperature) in temperatures.iter().enumerate() { + // One ACER run per temperature, each writing its own ACE and + // xsdir tape. + let nace = nacer_in + 1 + 2 * i as i32; + let ndir = nace + 1; + let ext = format!("{:02}", i + 1); + let t = crate::data::python_float_str(temperature); + deck.commands.push_str(&format!( + " +acer / %%%%%%%%%%%%%%%%%%%%%%%% Write out in ACE format %%%%%%%%%%%%%%%%%%%%%%%% +{nendf} {nacer_in} 0 {nace} {ndir} +1 0 1 .{ext} / +'{library}: {zsymam} at {t}'/ +{mat} {t} +1 1 {ismooth}/ +/ +" + )); + deck.tapeout + .insert(nace, out.join(format!("ace_{temperature:.1}"))); + deck.tapeout + .insert(ndir, out.join(format!("xsdir_{temperature:.1}"))); + } + } + + deck.commands.push_str("stop\n"); + Ok(deck) +} + +/// Run NJOY with the given deck. +/// +/// The tapes are staged in a temporary directory as `tape20`, `tape21` and so +/// on, since that is how NJOY names them, and the outputs are moved out +/// afterwards. +pub fn run(deck: &Deck, njoy_exec: &str, input_filename: Option<&Path>) -> Result { + if let Some(path) = input_filename { + std::fs::write(path, &deck.commands)?; + } + + let tmpdir = temp_dir()?; + let result = run_in(deck, njoy_exec, &tmpdir); + // The temporary directory goes whether NJOY succeeded or not. + let _ = std::fs::remove_dir_all(&tmpdir); + result +} + +fn run_in(deck: &Deck, njoy_exec: &str, tmpdir: &Path) -> Result { + for (unit, filename) in &deck.tapein { + std::fs::copy(filename, tmpdir.join(format!("tape{unit}")))?; + } + + let mut child = std::process::Command::new(njoy_exec) + .current_dir(tmpdir) + .stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn()?; + child + .stdin + .as_mut() + .ok_or(Error::Unsupported { + what: "an NJOY process with no standard input", + })? + .write_all(deck.commands.as_bytes())?; + + let output = child.wait_with_output()?; + let log = String::from_utf8_lossy(&output.stdout).into_owned(); + if !output.status.success() { + return Err(Error::BadAceTable { + what: format!("NJOY exited with {}: {log}", output.status), + }); + } + + for (unit, filename) in &deck.tapeout { + let written = tmpdir.join(format!("tape{unit}")); + if written.is_file() { + if let Some(parent) = filename.parent() { + std::fs::create_dir_all(parent)?; + } + // Rename fails across filesystems, so fall back to a copy. + if std::fs::rename(&written, filename).is_err() { + std::fs::copy(&written, filename)?; + std::fs::remove_file(&written)?; + } + } + } + Ok(log) +} + +/// Generate an ACE file from an evaluation, running NJOY to do it. +/// +/// The per-temperature ACE tapes are concatenated into one file and one xsdir, +/// as the Python package does. +pub fn make_ace(filename: &Path, material: &Material, options: &AceOptions) -> Result<()> { + if !options.output_dir.is_dir() { + return Err(Error::Unsupported { + what: "an output directory that is not a directory", + }); + } + let deck = ace_deck(filename, material, options)?; + run(&deck, &options.njoy_exec, options.input_filename.as_deref())?; + + if options.acer.is_none() { + return Ok(()); + } + let ace = match (&options.ace, &options.acer) { + (Some(path), _) => path.clone(), + (None, Some(Some(path))) => path.clone(), + _ => options.output_dir.join("ace"), + }; + let xsdir = options.xsdir.clone().unwrap_or_else(|| { + ace.parent() + .unwrap_or(Path::new(".")) + .join("xsdir") + .to_path_buf() + }); + + let mut ace_text = String::new(); + let mut xsdir_text = String::new(); + for &temperature in &deck.temperatures { + let per_temperature = options.output_dir.join(format!("ace_{temperature:.1}")); + let text = std::fs::read_to_string(&per_temperature)?; + ace_text.push_str(&metastable_zaid(&text, deck.isomeric_state)); + xsdir_text.push_str(&std::fs::read_to_string( + options.output_dir.join(format!("xsdir_{temperature:.1}")), + )?); + } + std::fs::write(&ace, ace_text)?; + std::fs::write(&xsdir, xsdir_text)?; + + for &temperature in &deck.temperatures { + let _ = std::fs::remove_file(options.output_dir.join(format!("ace_{temperature:.1}"))); + let _ = std::fs::remove_file(options.output_dir.join(format!("xsdir_{temperature:.1}"))); + } + Ok(()) +} + +/// Mark a metastable target in the ZAID an ACE table opens with. +/// +/// ACER does not record the isomeric state, so 400 is added to the mass +/// number the way MCNP libraries do. A first digit above two would carry, so +/// those are left alone — the same guard the Python package has. +fn metastable_zaid(text: &str, isomeric_state: i64) -> String { + if isomeric_state == 0 { + return text.to_string(); + } + let bytes = text.as_bytes(); + let Some(digit) = bytes.get(3).and_then(|b| (*b as char).to_digit(10)) else { + return text.to_string(); + }; + if digit > 2 { + return text.to_string(); + } + format!("{}{}{}", &text[..3], digit + 4, &text[4..]) +} + +/// A fresh temporary directory. +/// +/// Hand-rolled because the crate has no dependencies: the name comes from the +/// process id and a counter, and `create_dir` fails rather than reuses if the +/// name is somehow taken. +fn temp_dir() -> Result { + use std::sync::atomic::{AtomicU32, Ordering}; + static COUNTER: AtomicU32 = AtomicU32::new(0); + + let base = std::env::temp_dir(); + for _ in 0..64 { + let n = COUNTER.fetch_add(1, Ordering::Relaxed); + let path = base.join(format!("endf-njoy-{}-{n}", std::process::id())); + match std::fs::create_dir(&path) { + Ok(()) => return Ok(path), + Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => continue, + Err(e) => return Err(e.into()), + } + } + Err(Error::Unsupported { + what: "finding an unused temporary directory name", + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + const AM244: &[u8] = include_bytes!("../../../tests/n-095_Am_244.endf.xz"); + /// The deck the Python `make_ace` composes for the same evaluation and the + /// same options, captured with its `run` stubbed out. + const REFERENCE_DECK: &[u8] = include_bytes!("../tests/reference/njoy-deck.txt.xz"); + + fn am244() -> Material { + Material::from_str(&crate::testdata::text(AM244)).unwrap() + } + + #[test] + fn composes_the_same_deck_as_the_python_package() { + let options = AceOptions { + temperatures: vec![293.6, 900.0], + ..Default::default() + }; + let deck = ace_deck(Path::new("tests/n-095_Am_244.endf.xz"), &am244(), &options).unwrap(); + assert_eq!(deck.commands, crate::testdata::text(REFERENCE_DECK)); + } + + #[test] + fn the_tapes_thread_through_in_sequence() { + let options = AceOptions { + temperatures: vec![293.6, 900.0], + ..Default::default() + }; + let deck = ace_deck(Path::new("in.endf"), &am244(), &options).unwrap(); + + // One input, on unit 20. + assert_eq!( + deck.tapein.keys().copied().collect::>(), + [20], + "the evaluation goes in on tape20" + ); + // reconr writes 21 but pendf is off, so 21 is not kept. Then broadr, + // the two heatr runs, gaspr, purr, and an ACE and xsdir per + // temperature. + assert_eq!( + deck.tapeout.keys().copied().collect::>(), + [22, 23, 24, 25, 26, 27, 28, 29, 30] + ); + assert!(deck.tapeout[&27].ends_with("ace_293.6")); + assert!(deck.tapeout[&28].ends_with("xsdir_293.6")); + assert!(deck.tapeout[&29].ends_with("ace_900.0")); + assert_eq!(deck.temperatures, [293.6, 900.0]); + } + + #[test] + fn turning_a_module_off_closes_the_gap_it_leaves() { + let options = AceOptions { + heatr: None, + gaspr: None, + ..Default::default() + }; + let deck = ace_deck(Path::new("in.endf"), &am244(), &options).unwrap(); + assert!(!deck.commands.contains("heatr")); + assert!(!deck.commands.contains("gaspr")); + // purr now reads broadr's tape directly, and the numbering has no hole. + assert!(deck.commands.contains("20 22 23 /")); + assert_eq!( + deck.tapeout.keys().copied().collect::>(), + [22, 23, 24, 25] + ); + } + + #[test] + fn a_pointwise_run_is_reconr_alone() { + let options = AceOptions::pendf_only("out.pendf"); + let deck = ace_deck(Path::new("in.endf"), &am244(), &options).unwrap(); + assert!(deck.commands.contains("reconr")); + for module in ["broadr", "heatr", "gaspr", "purr", "acer"] { + assert!(!deck.commands.contains(module), "{module} should be off"); + } + assert_eq!(deck.tapeout[&21], PathBuf::from("out.pendf")); + assert!(deck.commands.ends_with("stop\n")); + } + + #[test] + fn smoothing_shows_up_in_the_acer_card() { + let on = ace_deck(Path::new("f"), &am244(), &AceOptions::default()).unwrap(); + assert!(on.commands.contains("1 1 1/")); + let off = ace_deck( + Path::new("f"), + &am244(), + &AceOptions { + smoothing: false, + ..Default::default() + }, + ) + .unwrap(); + assert!(off.commands.contains("1 1 0/")); + } + + #[test] + fn a_metastable_target_is_marked_in_the_zaid() { + // ACER writes no isomeric state, so 400 goes onto the mass number. + // The header right-justifies the ZAID in ten columns, so the mass + // number's first digit is the fourth character. + assert_eq!(&metastable_zaid(" 95242.00c rest", 1)[..6], " 95642"); + // The ground state is left alone. + assert_eq!(&metastable_zaid(" 95242.00c rest", 0)[..6], " 95242"); + // A first digit above two would carry, so it is left alone. + assert_eq!(&metastable_zaid(" 95942.00c rest", 1)[..6], " 95942"); + } + + #[test] + fn names_the_libraries_nlib_numbers() { + assert_eq!(library_name(0), "ENDF/B"); + assert_eq!(library_name(2), "JEFF"); + assert_eq!(library_name(17), "TENDL"); + assert_eq!(library_name(99), "Unknown"); + } +} diff --git a/crates/endf/src/photon_data.rs b/crates/endf/src/photon_data.rs new file mode 100644 index 0000000..f9b2d5a --- /dev/null +++ b/crates/endf/src/photon_data.rs @@ -0,0 +1,383 @@ +//! Auxiliary photon data: Compton profiles and bremsstrahlung. +//! +//! None of this is ENDF. The photoatomic sublibrary does not carry Compton +//! profiles, bremsstrahlung cross sections or the density effect correction, +//! so a transport code that needs them takes them from separate tabulations — +//! Biggs, Mendelsohn and Mann (1975); Seltzer and Berger (1986); Sternheimer, +//! Berger and Seltzer (1984). The Python package attaches them to an +//! [`crate::IncidentPhoton`] by atomic number after reading the evaluation, +//! and so does this. +//! +//! Three files, all plain text so that this crate stays dependency-free: +//! +//! * `compton_profiles_biggs1975.txt` and `density_effect_sternheimer1982.txt`, +//! written by `tools/make_photon_aux.py`. The profiles come from the Geant4 +//! G4EMLOW data set, the primary distribution of the Biggs tables; the +//! density effect is still vendored. Each carries a header naming its source. +//! * `BREMX.DAT`, read as-is — it was already whitespace-separated text. +//! +//! They are not embedded in the crate. Together they are about 2.5 MB, which +//! does not belong in every binary that links this, and a consumer reading +//! nuclear data is opening files anyway. + +use std::collections::BTreeMap; +use std::path::Path; + +use crate::data::EV_PER_MEV; +use crate::error::{Error, Result}; +use crate::spline::CubicSpline; + +/// The highest atomic number the tabulations cover. +pub const MAX_Z: i64 = 100; + +/// Compton profiles for one element, per subshell. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ComptonProfile { + /// Electrons in each subshell. + pub num_electrons: Vec, + /// Binding energy of each subshell, in eV. + pub binding_energy: Vec, + /// J(pz) for each subshell, on the shared [`PhotonData::pz`] grid. + pub j: Vec>, +} + +/// Bremsstrahlung and density-effect data for one element. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Bremsstrahlung { + /// Mean excitation energy, in eV. + pub i: f64, + /// Electrons in each subshell. + pub num_electrons: Vec, + /// Ionization energy of each subshell, in eV. + pub ionization_energy: Vec, + /// Scaled differential cross sections in barns, resampled onto + /// [`PhotonData::electron_energy`]: one row per incident electron energy, + /// one column per reduced photon energy. + pub dcs: Vec>, +} + +/// The auxiliary photon data for every element the tabulations cover. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct PhotonData { + /// The projected momentum grid the Compton profiles are given on. + pub pz: Vec, + /// Incident electron kinetic energies the cross sections are resampled + /// onto, in eV: 200 points logarithmically spaced from 1 keV to 1 GeV. + pub electron_energy: Vec, + /// Reduced photon energies, the columns of each `dcs`. + pub photon_energy: Vec, + /// By atomic number. + pub compton: BTreeMap, + /// By atomic number. + pub bremsstrahlung: BTreeMap, +} + +impl PhotonData { + /// Read the three tabulations. + /// + /// One argument per source rather than one per format: the Compton profiles + /// and the density effect come from unrelated measurements and only ever + /// shared a file because they shared an HDF5 container. The crate takes + /// paths and never looks anything up by name, so a consumer is free to call + /// the files whatever suits it. + pub fn from_files( + compton_profiles: impl AsRef, + density_effect: impl AsRef, + bremsstrahlung: impl AsRef, + ) -> Result { + let mut data = PhotonData::default(); + parse_aux_into(&mut data, &std::fs::read_to_string(compton_profiles)?)?; + parse_aux_into(&mut data, &std::fs::read_to_string(density_effect)?)?; + data.add_bremsstrahlung(&std::fs::read_to_string(bremsstrahlung)?)?; + Ok(data) + } +} + +fn bad(what: &'static str) -> Error { + Error::Unsupported { what } +} + +/// Take `n` floats off the front of an iterator. +fn take_floats<'a>( + tokens: &mut impl Iterator, + n: usize, + what: &'static str, +) -> Result> { + let mut out = Vec::with_capacity(n); + for _ in 0..n { + let token = tokens.next().ok_or_else(|| bad(what))?; + out.push(token.parse::().map_err(|_| bad(what))?); + } + Ok(out) +} + +/// Parse one tabulation into `data`. +/// +/// Each file still opens with its own `COMPTON` or `DENSITY` marker, so the same +/// reader takes either and splitting them by source needed no format change. +fn parse_aux_into(data: &mut PhotonData, text: &str) -> Result<()> { + let mut section = ""; + + for line in text.lines() { + let line = line.trim(); + // The generator writes a provenance header; blank lines are harmless. + if line.is_empty() || line.starts_with('#') { + continue; + } + if line == "COMPTON" || line == "DENSITY" { + section = if line == "COMPTON" { + "compton" + } else { + "density" + }; + continue; + } + + let mut tokens = line.split_whitespace(); + let tag = tokens + .next() + .ok_or_else(|| bad("an empty photon data line"))?; + + if tag == "pz" { + let n: usize = tokens + .next() + .and_then(|t| t.parse().ok()) + .ok_or_else(|| bad("the pz count in the photon data"))?; + data.pz = take_floats(&mut tokens, n, "the pz grid in the photon data")?; + continue; + } + if tag != "Z" { + return Err(bad("an unrecognised line in the photon data")); + } + + let z: i64 = tokens + .next() + .and_then(|t| t.parse().ok()) + .ok_or_else(|| bad("an atomic number in the photon data"))?; + let nss: usize = tokens + .next() + .and_then(|t| t.parse().ok()) + .ok_or_else(|| bad("a subshell count in the photon data"))?; + + match section { + "compton" => { + let num_electrons = take_floats(&mut tokens, nss, "Compton num_electrons")?; + let binding_energy = take_floats(&mut tokens, nss, "Compton binding_energy")?; + let flat = take_floats(&mut tokens, nss * data.pz.len(), "Compton J")?; + let j = flat.chunks(data.pz.len()).map(<[f64]>::to_vec).collect(); + data.compton.insert( + z, + ComptonProfile { + num_electrons, + binding_energy, + j, + }, + ); + } + "density" => { + let i = take_floats(&mut tokens, 1, "the mean excitation energy")?[0]; + let num_electrons = take_floats(&mut tokens, nss, "density num_electrons")?; + let ionization_energy = take_floats(&mut tokens, nss, "ionization_energy")?; + data.bremsstrahlung.insert( + z, + Bremsstrahlung { + i, + num_electrons, + ionization_energy, + dcs: Vec::new(), + }, + ); + } + _ => return Err(bad("a photon data line before its section header")), + } + } + Ok(()) +} + +impl PhotonData { + /// Read `BREMX.DAT` and resample its cross sections onto the common grid. + /// + /// The file gives the scaled cross sections on 57 tabulated electron + /// energies. They are interpolated with a not-a-knot cubic spline in log + /// energy — linear in the cross section itself — onto 200 logarithmically + /// spaced points, which is exactly what the Python package does with + /// `scipy.interpolate.CubicSpline`. + fn add_bremsstrahlung(&mut self, text: &str) -> Result<()> { + let tokens: Vec<&str> = text.split_whitespace().collect(); + let number = |i: usize, what: &'static str| -> Result { + tokens + .get(i) + .ok_or_else(|| bad(what))? + .parse::() + .map_err(|_| bad(what)) + }; + + // The counts sit at fixed offsets in the header. + let n = number(37, "the electron energy count in BREMX.DAT")? as usize; + let k = number(38, "the photon energy count in BREMX.DAT")? as usize; + let mut p = 39; + + // 200 points from 1 keV to 1 GeV, matching `np.logspace(3, 9, 200)`. + self.electron_energy = (0..200) + .map(|i| 10f64.powf(3.0 + 6.0 * i as f64 / 199.0)) + .collect(); + let log_energy: Vec = self.electron_energy.iter().map(|e| e.ln()).collect(); + + // Tabulated energies are in MeV; the spline runs in log eV. + let mut logx = Vec::with_capacity(n); + for i in 0..n { + logx.push((number(p + i, "an electron energy in BREMX.DAT")? * EV_PER_MEV).ln()); + } + p += n; + + self.photon_energy = (0..k) + .map(|i| number(p + i, "a photon energy in BREMX.DAT")) + .collect::>()?; + p += k; + + for z in 1..=MAX_Z { + // Row-major, `n` electron energies by `k` photon energies, in + // millibarns. + let mut y = vec![vec![0.0; k]; n]; + for (row, values) in y.iter_mut().enumerate() { + for (col, value) in values.iter_mut().enumerate() { + *value = number(p + row * k + col, "a cross section in BREMX.DAT")? * 1.0e-3; + } + } + p += n * k; + + // One spline per reduced photon energy, down the electron energy + // axis. Built column by column, then transposed into rows so the + // result is indexed the way the Python package indexes it. + let mut dcs = vec![vec![0.0; k]; log_energy.len()]; + let mut column = vec![0.0; n]; + for j in 0..k { + for (i, value) in column.iter_mut().enumerate() { + *value = y[i][j]; + } + let spline = CubicSpline::new(&logx, &column)?; + for (row, &q) in log_energy.iter().enumerate() { + dcs[row][j] = spline.eval(q); + } + } + + self.bremsstrahlung + .get_mut(&z) + .ok_or_else(|| bad("BREMX.DAT covers an element the density data does not"))? + .dcs = dcs; + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::path::PathBuf; + + fn datafiles() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../src/endf/datafiles") + } + + fn load() -> PhotonData { + let d = datafiles(); + PhotonData::from_files( + d.join("compton_profiles_biggs1975.txt"), + d.join("density_effect_sternheimer1982.txt"), + d.join("BREMX.DAT"), + ) + .unwrap() + } + + #[test] + fn reads_every_element() { + let data = load(); + assert_eq!(data.pz.len(), 31); + assert_eq!(data.compton.len(), MAX_Z as usize); + assert_eq!(data.bremsstrahlung.len(), MAX_Z as usize); + assert_eq!(data.photon_energy.len(), 30); + assert_eq!(data.electron_energy.len(), 200); + + // The grid is 1 keV to 1 GeV inclusive. + assert!((data.electron_energy[0] - 1.0e3).abs() < 1e-9); + assert!((data.electron_energy[199] - 1.0e9).abs() < 1.0); + + // Hydrogen has one subshell, uranium 27. + let h = &data.compton[&1]; + assert_eq!(h.num_electrons, [1.0]); + assert_eq!(h.j.len(), 1); + assert_eq!(h.j[0].len(), 31); + assert_eq!(data.compton[&92].num_electrons.len(), 27); + + // Every element's dcs is the full resampled grid. + for z in 1..=MAX_Z { + let b = &data.bremsstrahlung[&z]; + assert_eq!(b.dcs.len(), 200, "Z={z}"); + assert_eq!(b.dcs[0].len(), 30, "Z={z}"); + assert!(b.i > 0.0, "Z={z} should have a mean excitation energy"); + } + } + + /// Attaching the data to an element gives it what the Python reader's + /// `from_endf` attaches at the end of its own read. + #[test] + fn attaches_to_an_incident_photon() { + let data = load(); + let material = crate::Material::from_str(&crate::testdata::text(include_bytes!( + "../../../tests/photoat-001_H_000.endf.xz" + ))) + .unwrap(); + let mut photon = crate::IncidentPhoton::from_endf(&material, None).unwrap(); + + // An ENDF evaluation carries neither, so both are absent until asked + // for -- which is the difference from the Python package, where the + // lookup happens inside `from_endf`. + assert!(photon.compton_profiles.is_none()); + assert!(photon.bremsstrahlung.is_none()); + + photon.add_photon_data(&data); + + let profiles = photon.compton_profiles.as_ref().expect("hydrogen profiles"); + assert_eq!(profiles.num_electrons, [1.0]); + // J comes across as a Tabulated1D against pz, as it does in Python. + assert_eq!(profiles.j.len(), 1); + assert_eq!(profiles.j[0].x, data.pz); + assert_eq!(profiles.j[0].y, data.compton[&1].j[0]); + + let brem = photon.bremsstrahlung.as_ref().expect("hydrogen brem"); + assert_eq!(brem.i, data.bremsstrahlung[&1].i); + assert_eq!(brem.electron_energy.len(), 200); + assert_eq!(brem.dcs.len(), 200); + assert_eq!(brem.dcs[0].len(), 30); + } + + /// Spot values taken from the Python package, which reads the HDF5 files + /// with h5py and resamples with `scipy.interpolate.CubicSpline`. Two + /// different source formats and two different spline implementations + /// agreeing is the point of the check. + #[test] + fn agrees_with_the_python_reader() { + let data = load(); + + // Compton profiles come straight off the file. + assert_eq!(data.pz[0], 0.0); + assert_eq!(data.pz[30], 100.0); + assert_eq!(data.compton[&92].binding_energy[0], 116110.0); + + // The resampled cross sections go through the spline. + let u = &data.bremsstrahlung[&92]; + assert_eq!(u.i, 890.0); + for (row, col, want) in [ + (0usize, 0usize, 0.00046007999999999997), + (0, 29, 0.0010523499999999999), + (100, 15, 0.0038985821050669185), + (199, 29, 0.00147492), + ] { + let got = u.dcs[row][col]; + assert!( + (got - want).abs() <= 1e-12 * want.abs(), + "dcs[{row}][{col}]: got {got}, want {want}" + ); + } + } +} diff --git a/crates/endf/src/product.rs b/crates/endf/src/product.rs new file mode 100644 index 0000000..1c44493 --- /dev/null +++ b/crates/endf/src/product.rs @@ -0,0 +1,102 @@ +//! Secondary particles emitted in a nuclear reaction. + +use crate::angle_energy::AngleEnergy; +use crate::function::{Polynomial, Tabulated1D}; + +/// Whether a particle leaves at once or follows the decay of a precursor. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum EmissionMode { + #[default] + Prompt, + /// Emitted from the decay of a reaction product, as delayed neutrons are. + Delayed, + /// The yield covers prompt and delayed sources together. + Total, +} + +impl EmissionMode { + /// The name the Python package uses, e.g. `"prompt"`. + pub fn name(self) -> &'static str { + match self { + EmissionMode::Prompt => "prompt", + EmissionMode::Delayed => "delayed", + EmissionMode::Total => "total", + } + } +} + +/// A yield, which the format gives either as a polynomial in incident energy +/// or as a tabulation against it. +#[derive(Debug, Clone, PartialEq)] +pub enum Yield { + Polynomial(Polynomial), + Tabulated(Tabulated1D), +} + +impl Default for Yield { + /// One particle per reaction, the constant the Python reader defaults to. + fn default() -> Self { + Yield::Polynomial(Polynomial::new(vec![1.0])) + } +} + +impl Yield { + /// The yield at an incident energy in eV. + pub fn eval(&self, energy: f64) -> f64 { + match self { + Yield::Polynomial(p) => p.eval(energy), + Yield::Tabulated(t) => t.eval(energy), + } + } +} + +/// A secondary particle emitted in a nuclear reaction. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Product { + /// The particle type, `"neutron"` unless said otherwise. + pub name: String, + pub yield_: Yield, + /// Decay rate in inverse seconds. Zero for a prompt particle. + pub decay_rate: f64, + /// The angle and energy of the product. More than one when the emission is + /// split between representations, chosen by `applicability`. + pub distribution: Vec, + /// The probability of sampling each distribution, as a function of + /// incident energy. Empty when there is only one. + pub applicability: Vec, + pub emission_mode: EmissionMode, +} + +impl Product { + /// A prompt particle of the given type, with unit yield. + pub fn new(name: &str) -> Product { + Product { + name: name.to_string(), + ..Default::default() + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_new_product_is_one_prompt_particle() { + let p = Product::new("neutron"); + assert_eq!(p.name, "neutron"); + assert_eq!(p.emission_mode, EmissionMode::Prompt); + assert_eq!(p.decay_rate, 0.0); + assert!(p.distribution.is_empty()); + assert!(p.applicability.is_empty()); + // The default yield is the constant 1, whatever the energy. + assert_eq!(p.yield_.eval(0.0253), 1.0); + assert_eq!(p.yield_.eval(2.0e7), 1.0); + } + + #[test] + fn a_tabulated_yield_is_interpolated() { + let y = Yield::Tabulated(Tabulated1D::new(vec![0.0, 10.0], vec![2.0, 4.0])); + assert_eq!(y.eval(5.0), 3.0); + } +} diff --git a/crates/endf/src/radionuclide_production.rs b/crates/endf/src/radionuclide_production.rs new file mode 100644 index 0000000..2a8724c --- /dev/null +++ b/crates/endf/src/radionuclide_production.rs @@ -0,0 +1,473 @@ +//! Radionuclide production: which nuclides a reaction leaves behind, in which +//! state, and how much of each. +//! +//! MF=8 identifies each radioactive product and MF=9 or MF=10 gives the +//! energy-dependent yield or production cross section. The three are joined +//! here, keyed by reaction, because a consumer wants them together. + +use std::collections::{BTreeMap, BTreeSet}; + +use crate::error::Result; +use crate::function::Tabulated1D; +use crate::material::Material; + +/// Production data for one final state of one reaction. +/// +/// LFS is a level index of the *product* nuclide, not an isomeric-state +/// ordinal. Turning one into the other needs decay data — see +/// [`level_to_isomeric_state`]. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct RadionuclideProduction { + /// `1000*Z + A` of the product nuclide. + pub zap: i64, + /// Level number of the final state; 0 is the ground state. + pub lfs: i64, + /// Mass-difference Q value in eV. + pub qm: f64, + /// Reaction Q value for this state, in eV. + pub qi: f64, + /// Excitation energy of the final state in eV, from MF=8. `None` when the + /// evaluation has no MF=8 subsection for this state. + pub elfs: Option, + /// MF=9 yield, as a multiplier on the reaction cross section. + pub yields: Option, + /// MF=10 production cross section in barns. + pub cross_section: Option, +} + +impl RadionuclideProduction { + /// Excitation energy of the final state in eV. + /// + /// The MF=8 value when the evaluation gave one, and `QM - QI` otherwise — + /// the same quantity read off the Q values. + pub fn excitation_energy(&self) -> f64 { + self.elfs.unwrap_or(self.qm - self.qi) + } +} + +/// Collect the radionuclide production data of a material, by MT. +/// +/// Every reaction with an MF=9 or MF=10 section is included, its final states +/// in the order the evaluation writes them. MF=9 and MF=10 data for the same +/// `(ZAP, LFS)` pair are merged into one entry, and the MF=8 excitation energy +/// attached where there is one. The tabulated functions are returned exactly +/// as evaluated. +pub fn radionuclide_production(material: &Material) -> BTreeMap> { + let mut by_mt: BTreeMap> = BTreeMap::new(); + for &(mf, mt) in material.section_data.keys() { + if mf == 9 || mf == 10 { + by_mt.entry(mt).or_default().insert(mf); + } + } + + let mut result = BTreeMap::new(); + for (mt, files) in by_mt { + // MF=8 links each (ZAP, LFS) pair to an excitation energy. + let mut elfs: BTreeMap<(i64, i64), f64> = BTreeMap::new(); + if let Some(mf8) = material.mf8(mt) { + for sub in &mf8.subsections { + elfs.insert((sub.zap as i64, sub.lfs), sub.elfs); + } + } + + // Insertion order is the evaluation's order, which is what a reader + // expects back, so the states are kept in a vector and located by a + // side map rather than being sorted. + let mut ordered: Vec = Vec::new(); + let mut index: BTreeMap<(i64, i64), usize> = BTreeMap::new(); + for mf in files { + let section = match mf { + 9 => material.mf9(mt), + _ => material.mf10(mt), + }; + let Some(section) = section else { continue }; + for level in §ion.levels { + let key = (level.izap, level.lfs); + let i = *index.entry(key).or_insert_with(|| { + ordered.push(RadionuclideProduction { + zap: key.0, + lfs: key.1, + qm: level.qm, + qi: level.qi, + elfs: elfs.get(&key).copied(), + ..Default::default() + }); + ordered.len() - 1 + }); + if mf == 9 { + ordered[i].yields = Some(level.func.clone()); + } else { + ordered[i].cross_section = Some(level.func.clone()); + } + } + } + result.insert(mt, ordered); + } + result +} + +/// One isomeric state of a nuclide, as decay data describes it. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Isomer { + /// The nuclear level index the evaluation gives this state. + pub lis: i64, + /// Half-life in seconds, where the evaluation gave one. + pub half_life: Option, + /// Excitation energy in eV. `None` for a pure-beta isomer, which has no + /// isomeric transition to measure it by. + pub e_iso: Option, +} + +/// Isomeric states by `(Z, A)`, then by isomeric-state ordinal (LISO). +pub type IsomerTable = BTreeMap<(i64, i64), BTreeMap>; + +/// What one decay file said, before the excitation energies are chained. +#[derive(Debug, Clone, Default)] +struct RawIsomer { + lis: i64, + half_life: Option, + /// Q value of the isomeric-transition decay mode, when there is one. + it_q: Option, + /// The isomeric state that transition leaves behind. + it_rfs: i64, +} + +/// Build a table of isomeric states from decay data evaluations. +/// +/// MF=8 identifies a radioactive product by a nuclear *level* index, not by an +/// isomeric-state ordinal, so relating production data to a named metastable +/// nuclide needs the excitation energies of the isomers — which is what decay +/// data provides. +/// +/// Each isomer's absolute excitation energy is recovered from the Q value of +/// its isomeric-transition decay mode (RTYP = 3), chained through that mode's +/// final isomeric state down to lower isomers. +/// +/// Only the metastable files are needed; ground states are implicit. +pub fn isomer_table(decay_files: I) -> Result +where + I: IntoIterator, + P: AsRef, +{ + let mut materials = Vec::new(); + for filename in decay_files { + materials.push(Material::from_file(filename.as_ref())?); + } + Ok(isomer_table_from_materials(&materials)) +} + +/// The same, from materials already read. +/// +/// This is where the work happens; [`isomer_table`] is the convenience that +/// opens the files first. +pub fn isomer_table_from_materials(materials: &[Material]) -> IsomerTable { + let mut raw: BTreeMap<(i64, i64), BTreeMap> = BTreeMap::new(); + for material in materials { + let Some(section) = material.mf8_mt457() else { + continue; + }; + let (z, a) = (section.za / 1000, section.za % 1000); + + // The first isomeric transition is the one that fixes the energy; a + // second would describe the same level. + let it = section.modes.iter().find(|m| m.rtyp == 3.0); + + raw.entry((z, a)).or_default().insert( + section.liso, + RawIsomer { + lis: section.lis, + half_life: section.half_life.map(|(v, _)| v), + it_q: it.map(|m| m.q.0), + it_rfs: it.map_or(0, |m| m.rfs as i64), + }, + ); + } + + let mut table = IsomerTable::new(); + for (za, isomers) in raw { + // Energies resolved so far, which the chaining reads back. + let mut resolved: BTreeMap = BTreeMap::from([(0, 0.0)]); + let mut out = BTreeMap::new(); + for (&liso, info) in &isomers { + let energy = if liso == 0 { + Some(0.0) + } else { + info.it_q + .map(|q| q + resolved.get(&info.it_rfs).copied().unwrap_or(0.0)) + }; + resolved.insert(liso, energy.unwrap_or(0.0)); + out.insert( + liso, + Isomer { + lis: info.lis, + half_life: info.half_life, + e_iso: energy, + }, + ); + } + table.insert(za, out); + } + table +} + +/// Default tolerance in eV for matching a level energy to an isomer energy. +pub const ISOMER_ENERGY_TOLERANCE: f64 = 3000.0; + +/// Map a production level to an isomeric-state ordinal. +/// +/// The ground state maps to 0. Otherwise the level's excitation energy is +/// matched against the isomer energies in `table`; failing that, the level +/// index is compared against LIS; failing that, a nuclide with exactly one +/// isomer maps to it. A level that resolves to none of these is treated as +/// ground, on the basis that a short-lived level gamma-cascades down. +pub fn level_to_isomeric_state( + z: i64, + a: i64, + lfs: i64, + excitation_energy: Option, + table: &IsomerTable, + tol_ev: f64, +) -> i64 { + let Some(isomers) = table.get(&(z, a)) else { + return 0; + }; + let metastable: Vec<(&i64, &Isomer)> = isomers.iter().filter(|(&liso, _)| liso > 0).collect(); + if metastable.is_empty() { + return 0; + } + // A level below a keV is not a metastable state; nor is the ground state, + // whatever energy it is given. + match excitation_energy { + _ if lfs == 0 => return 0, + None => return 0, + Some(e) if e < 1000.0 => return 0, + Some(_) => {} + } + let excitation_energy = excitation_energy.unwrap_or(0.0); + + // 1. The energy match against the decay isomer energies. + let mut best: Option<(i64, f64)> = None; + for (&liso, isomer) in &metastable { + if let Some(e_iso) = isomer.e_iso { + let residual = (excitation_energy - e_iso).abs(); + match best { + Some((_, r)) if r <= residual => {} + _ => best = Some((liso, residual)), + } + } + } + if let Some((liso, residual)) = best { + if residual <= tol_ev { + return liso; + } + } + + // 2. The level index. + for (&liso, isomer) in &metastable { + if isomer.lis == lfs { + return liso; + } + } + + // 3. A nuclide with one isomer can only mean that one. + if metastable.len() == 1 { + return *metastable[0].0; + } + + // 4. Unresolved, so cascade to ground. + 0 +} + +#[cfg(test)] +mod tests { + use super::*; + + const IN115: &[u8] = include_bytes!("../../../tests/n-049_In-115_trimmed.endf.xz"); + + #[test] + fn joins_mf8_mf9_and_mf10_for_each_reaction() { + let m = Material::from_str(&crate::testdata::text(IN115)).unwrap(); + let production = radionuclide_production(&m); + + // The evaluation gives isomer production for three reactions, each to + // a single excited state. + assert_eq!(production.keys().copied().collect::>(), [4, 16, 102]); + assert!(production.values().all(|states| states.len() == 1)); + + // Inelastic scattering and (n,2n) leave indium behind, and both are + // given as MF=10 production cross sections. + for (mt, zap) in [(4, 49115), (16, 49114)] { + let state = &production[&mt][0]; + assert_eq!((state.zap, state.lfs), (zap, 1)); + assert!(state.cross_section.is_some()); + assert!(state.yields.is_none()); + } + + // Capture is given the other way, as an MF=9 yield on the MF=3 cross + // section. + let state = &production[&102][0]; + assert_eq!((state.zap, state.lfs), (49116, 1)); + assert!(state.yields.is_some()); + assert!(state.cross_section.is_none()); + + // The excitation energy comes from MF=8's ELFS, not from QM - QI. + assert_eq!(state.elfs, Some(127_269.7)); + assert_eq!(state.excitation_energy(), 127_269.7); + } + + #[test] + fn the_excitation_energy_falls_back_to_the_q_values() { + // With no MF=8 subsection the energy is QM - QI, which is the same + // quantity the evaluation would have written as ELFS. + let state = RadionuclideProduction { + qm: 6.0e6, + qi: 5.8e6, + elfs: None, + ..Default::default() + }; + assert_eq!(state.excitation_energy(), 2.0e5); + + let state = RadionuclideProduction { + elfs: Some(1.0e5), + ..state + }; + assert_eq!(state.excitation_energy(), 1.0e5); + } + + /// A two-isomer nuclide, as decay data would leave it: the second isomer + /// transitions to the first, so its energy is the sum of the two Q values. + fn two_isomers() -> IsomerTable { + IsomerTable::from([( + (95, 242), + BTreeMap::from([ + ( + 1, + Isomer { + lis: 1, + half_life: Some(4.4e9), + e_iso: Some(48_600.0), + }, + ), + ( + 2, + Isomer { + lis: 2, + half_life: Some(1.4e4), + e_iso: Some(2_200_000.0), + }, + ), + ]), + )]) + } + + #[test] + fn an_energy_within_tolerance_picks_its_isomer() { + let table = two_isomers(); + let at = |e: f64, lfs: i64| { + level_to_isomeric_state(95, 242, lfs, Some(e), &table, ISOMER_ENERGY_TOLERANCE) + }; + assert_eq!(at(48_600.0, 1), 1); + assert_eq!(at(50_000.0, 1), 1); + assert_eq!(at(2_200_500.0, 2), 2); + } + + #[test] + fn the_ground_state_and_low_levels_are_ground() { + let table = two_isomers(); + let at = |e: Option, lfs: i64| { + level_to_isomeric_state(95, 242, lfs, e, &table, ISOMER_ENERGY_TOLERANCE) + }; + assert_eq!(at(Some(0.0), 0), 0); + // A level index above zero but an energy too low to be metastable. + assert_eq!(at(Some(500.0), 1), 0); + // Nothing known about the energy. + assert_eq!(at(None, 1), 0); + // A nuclide the table has never heard of. + assert_eq!( + level_to_isomeric_state(1, 1, 1, Some(1.0e6), &table, ISOMER_ENERGY_TOLERANCE), + 0 + ); + } + + #[test] + fn a_level_index_resolves_what_energy_cannot() { + let table = two_isomers(); + // Far from either isomer energy, but the level index says which. + assert_eq!( + level_to_isomeric_state(95, 242, 2, Some(9.0e6), &table, ISOMER_ENERGY_TOLERANCE), + 2 + ); + // Neither energy nor index matches, and there are two isomers, so the + // level is taken to cascade to ground. + assert_eq!( + level_to_isomeric_state(95, 242, 7, Some(9.0e6), &table, ISOMER_ENERGY_TOLERANCE), + 0 + ); + } + + #[test] + fn a_nuclide_with_only_a_ground_state_is_ground() { + let table = IsomerTable::from([( + (26, 56), + BTreeMap::from([( + 0, + Isomer { + lis: 0, + half_life: None, + e_iso: Some(0.0), + }, + )]), + )]); + assert_eq!( + level_to_isomeric_state(26, 56, 3, Some(8.0e5), &table, ISOMER_ENERGY_TOLERANCE), + 0 + ); + } + + #[test] + fn reads_the_isomers_of_in116_from_decay_data() { + // The two metastable states of In116, which between them exercise both + // branches: the first decays only by beta-, so it has no isomeric + // transition to measure its energy by, and the second transitions down + // to the first. + const M1: &[u8] = include_bytes!("../../../tests/dec-049_In_116m1.endf.xz"); + const M2: &[u8] = include_bytes!("../../../tests/dec-049_In_116m2.endf.xz"); + let materials = + [M1, M2].map(|raw| Material::from_str(&crate::testdata::text(raw)).unwrap()); + let table = isomer_table_from_materials(&materials); + + let in116 = &table[&(49, 116)]; + assert_eq!(in116.keys().copied().collect::>(), [1, 2]); + + assert_eq!(in116[&1].lis, 1); + assert_eq!(in116[&1].half_life, Some(3257.4)); + // Pure beta-, so the energy is unknown rather than zero. + assert_eq!(in116[&1].e_iso, None); + + assert_eq!(in116[&2].lis, 4); + assert_eq!(in116[&2].half_life, Some(2.18)); + // Its isomeric transition goes to state 1, whose energy is unknown and + // so contributes nothing; the Q value stands alone. + assert_eq!(in116[&2].e_iso, Some(162_393.0)); + } + + #[test] + fn a_nuclide_with_one_isomer_resolves_to_it() { + let table = IsomerTable::from([( + (49, 116), + BTreeMap::from([( + 1, + Isomer { + lis: 1, + half_life: Some(3.3e3), + e_iso: None, + }, + )]), + )]); + // No energy to match and no index to match, but only one candidate. + assert_eq!( + level_to_isomeric_state(49, 116, 4, Some(9.0e5), &table, ISOMER_ENERGY_TOLERANCE), + 1 + ); + } +} diff --git a/crates/endf/src/reaction.rs b/crates/endf/src/reaction.rs new file mode 100644 index 0000000..52d1cad --- /dev/null +++ b/crates/endf/src/reaction.rs @@ -0,0 +1,1331 @@ +//! Reactions: a cross section, its Q values, and what comes out of them. +//! +//! An ENDF evaluation scatters one reaction across several files — MF=3 has +//! the cross section, MF=4/5/6 the distributions of what is emitted, MF=8/9/10 +//! the radioactive products. [`Reaction`] is those gathered into one place. + +use std::collections::BTreeMap; +use std::sync::OnceLock; + +use crate::ace::Table; +use crate::angle_energy::{AngleEnergy, UncorrelatedAngleEnergy}; +use crate::data::{gnds_name, temperature_str, ATOMIC_SYMBOL, EV_PER_MEV}; +use crate::error::{Error, Result}; +use crate::function::{Polynomial, Tabulated1D}; +use crate::material::Material; +use crate::mf::mf1::Nu; +use crate::mf::mf4::{AngleAtEnergy, AngleDistribution}; +use crate::mf::mf5::EnergyDistribution; +use crate::product::{EmissionMode, Product, Yield}; +use crate::univariate::Uniform; + +/// The MT numbers that mean fission. +pub const FISSION_MTS: [i32; 5] = [18, 19, 20, 21, 38]; + +/// The reactions whose names the format states outright. +/// +/// The level reactions are not here: their names follow from the MT number by +/// the rules in [`LEVEL_FAMILIES`]. +const REACTION_NAME_BASE: [(i32, &str); 111] = [ + (1, "(n,total)"), + (2, "(n,elastic)"), + (3, "(n,nonelastic)"), + (4, "(n,level)"), + (5, "(n,misc)"), + (11, "(n,2nd)"), + (16, "(n,2n)"), + (17, "(n,3n)"), + (18, "(n,fission)"), + (19, "(n,f)"), + (20, "(n,nf)"), + (21, "(n,2nf)"), + (22, "(n,na)"), + (23, "(n,n3a)"), + (24, "(n,2na)"), + (25, "(n,3na)"), + (27, "(n,absorption)"), + (28, "(n,np)"), + (29, "(n,n2a)"), + (30, "(n,2n2a)"), + (32, "(n,nd)"), + (33, "(n,nt)"), + (34, "(n,n3He)"), + (35, "(n,nd2a)"), + (36, "(n,nt2a)"), + (37, "(n,4n)"), + (38, "(n,3nf)"), + (41, "(n,2np)"), + (42, "(n,3np)"), + (44, "(n,n2p)"), + (45, "(n,npa)"), + (91, "(n,nc)"), + (101, "(n,disappear)"), + (102, "(n,gamma)"), + (103, "(n,p)"), + (104, "(n,d)"), + (105, "(n,t)"), + (106, "(n,3He)"), + (107, "(n,a)"), + (108, "(n,2a)"), + (109, "(n,3a)"), + (111, "(n,2p)"), + (112, "(n,pa)"), + (113, "(n,t2a)"), + (114, "(n,d2a)"), + (115, "(n,pd)"), + (116, "(n,pt)"), + (117, "(n,da)"), + (152, "(n,5n)"), + (153, "(n,6n)"), + (154, "(n,2nt)"), + (155, "(n,ta)"), + (156, "(n,4np)"), + (157, "(n,3nd)"), + (158, "(n,nda)"), + (159, "(n,2npa)"), + (160, "(n,7n)"), + (161, "(n,8n)"), + (162, "(n,5np)"), + (163, "(n,6np)"), + (164, "(n,7np)"), + (165, "(n,4na)"), + (166, "(n,5na)"), + (167, "(n,6na)"), + (168, "(n,7na)"), + (169, "(n,4nd)"), + (170, "(n,5nd)"), + (171, "(n,6nd)"), + (172, "(n,3nt)"), + (173, "(n,4nt)"), + (174, "(n,5nt)"), + (175, "(n,6nt)"), + (176, "(n,2n3He)"), + (177, "(n,3n3He)"), + (178, "(n,4n3He)"), + (179, "(n,3n2p)"), + (180, "(n,3n2a)"), + (181, "(n,3npa)"), + (182, "(n,dt)"), + (183, "(n,npd)"), + (184, "(n,npt)"), + (185, "(n,ndt)"), + (186, "(n,np3He)"), + (187, "(n,nd3He)"), + (188, "(n,nt3He)"), + (189, "(n,nta)"), + (190, "(n,2n2p)"), + (191, "(n,p3He)"), + (192, "(n,d3He)"), + (193, "(n,3Hea)"), + (194, "(n,4n2p)"), + (195, "(n,4n2a)"), + (196, "(n,4npa)"), + (197, "(n,3p)"), + (198, "(n,n3p)"), + (199, "(n,3n2pa)"), + (200, "(n,5n2p)"), + (203, "(n,Xp)"), + (204, "(n,Xd)"), + (205, "(n,Xt)"), + (206, "(n,X3He)"), + (207, "(n,Xa)"), + (301, "heating"), + (444, "damage-energy"), + (649, "(n,pc)"), + (699, "(n,dc)"), + (749, "(n,tc)"), + (799, "(n,3Hec)"), + (849, "(n,ac)"), + (891, "(n,2nc)"), + (901, "heating-local"), +]; + +/// The runs of MT numbers that count the excited level of the residual, as +/// `(first, last + 1, emitted particle, offset)`. +/// +/// MT=51 is the first inelastic level and is named `(n,n1)`, so the name is +/// the particle followed by `MT - offset`. +const LEVEL_FAMILIES: [(i32, i32, &str, i32); 7] = [ + (51, 91, "n", 50), + (600, 649, "p", 600), + (650, 699, "d", 650), + (700, 749, "t", 700), + (750, 799, "3He", 750), + (800, 849, "a", 800), + (875, 891, "2n", 875), +]; + +/// The names by which a reaction may be asked for besides its own. +const REACTION_ALIASES: [(&str, i32); 5] = [ + ("total", 1), + ("elastic", 2), + ("fission", 18), + ("absorption", 27), + ("capture", 102), +]; + +/// The name of a reaction, e.g. `"(n,2n)"` for MT=16 or `"(n,n3)"` for MT=53. +/// +/// `None` for an MT the format does not name, which includes every MT a +/// particular evaluation may have invented. +pub fn reaction_name(mt: i32) -> Option { + for &(first, end, particle, offset) in &LEVEL_FAMILIES { + if (first..end).contains(&mt) { + return Some(format!("(n,{particle}{})", mt - offset)); + } + } + REACTION_NAME_BASE + .iter() + .find(|&&(m, _)| m == mt) + .map(|&(_, name)| name.to_string()) +} + +/// Every name a reaction goes by, to its MT. Built once, on first use. +fn reaction_mt_table() -> &'static BTreeMap { + static TABLE: OnceLock> = OnceLock::new(); + TABLE.get_or_init(|| { + let mut map = BTreeMap::new(); + for &(mt, name) in &REACTION_NAME_BASE { + map.insert(name.to_string(), mt); + } + for &(first, end, particle, offset) in &LEVEL_FAMILIES { + for mt in first..end { + map.insert(format!("(n,{particle}{})", mt - offset), mt); + } + } + for &(name, mt) in &REACTION_ALIASES { + map.insert(name.to_string(), mt); + } + map + }) +} + +/// The MT of a named reaction, by its own name or by an alias. +pub fn reaction_mt(name: &str) -> Option { + reaction_mt_table().get(name).copied() +} + +/// One reaction channel of a nuclide. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Reaction { + pub mt: i32, + /// The cross section in barns, by temperature. The key is the temperature + /// as [`crate::data::temperature_str`] writes it — `"0K"` for an + /// unbroadened ENDF evaluation, `"294K"` for a processed table. + pub xs: BTreeMap, + pub products: Vec, + /// Products the evaluation gives but which duplicate others, such as the + /// total fission neutron where prompt and delayed are both present. + /// + /// The Python reader computes these and then drops them, with a TODO + /// saying they should be stored somewhere. They are stored here: nothing + /// else changes, and a consumer that wants the total nu-bar of a fission + /// evaluation would otherwise have to read MF=1 MT=452 itself. + pub derived_products: Vec, + /// Q value of the reaction in eV. + pub q_reaction: f64, + /// Mass-difference Q value in eV. + pub q_massdiff: f64, + /// True when the cross section is the sum of others rather than evaluated. + pub redundant: bool, + /// Whether the secondary distributions are in the centre-of-mass frame. + pub center_of_mass: bool, +} + +impl Reaction { + /// An empty reaction with the given MT. + pub fn new(mt: i32) -> Reaction { + Reaction { + mt, + center_of_mass: true, + ..Default::default() + } + } + + /// The reaction's name, where the format gives it one. + pub fn name(&self) -> Option { + reaction_name(self.mt) + } + + /// Gather one reaction from an ENDF material. + /// + /// The MF=3 section must exist; everything else is taken where present. + pub fn from_endf(mt: i32, material: &Material) -> Result { + let mf3 = material.mf3(mt).ok_or(Error::Unsupported { + what: "a reaction with no MF=3 cross section", + })?; + let q_massdiff = mf3.qm; + let q_reaction = mf3.qi; + + let is_fission = FISSION_MTS.contains(&mt); + + // Fission neutron yields and the delayed spectra come from MF=1. + let (mut products, derived_products) = if is_fission { + fission_products_endf(material)? + } else { + (Vec::new(), Vec::new()) + }; + + if let Some(mf6) = material.mf6(mt) { + for product in mf6_products(mf6) { + // Fission neutrons already came from MF=1; MF=6 only adds + // their distributions. The emptiness check is the one place + // this differs from the Python reader, which indexes + // unconditionally and raises IndexError for a fission + // evaluation with no MF=1 nu-bar at all. + if is_fission && product.name == "neutron" && !products.is_empty() { + products[0].applicability = product.applicability; + products[0].distribution = product.distribution; + } else { + products.push(product); + } + } + } else if material.mf4(mt).is_some() || material.mf5(mt).is_some() { + let mut neutron = Product::new("neutron"); + + if let Some(mf5) = material.mf5(mt) { + // MT=455's energy distribution is read with the delayed + // neutrons instead, in `fission_products_endf`. + for sub in &mf5.subsections { + neutron.applicability.push(sub.p.clone()); + neutron + .distribution + .push(AngleEnergy::Uncorrelated(UncorrelatedAngleEnergy { + angle: None, + energy: Some(sub.distribution.clone()), + })); + } + } else if mt == 2 { + // Elastic scattering: the outgoing energy follows from the + // kinematics, so no distribution is given. + neutron + .distribution + .push(AngleEnergy::Uncorrelated(UncorrelatedAngleEnergy::default())); + } else if (51..91).contains(&mt) { + // Level inelastic scattering, likewise analytic. What is + // needed is the threshold and the mass ratio. + let a = material + .mf1_mt451() + .map(|m| m.awr) + .ok_or(Error::Unsupported { + what: "level inelastic scattering without MF=1 MT=451", + })?; + neutron + .distribution + .push(AngleEnergy::Uncorrelated(UncorrelatedAngleEnergy { + angle: None, + energy: Some(EnergyDistribution::LevelInelastic { + threshold: (a + 1.0) / a * q_reaction.abs(), + mass_ratio: (a / (a + 1.0)).powi(2), + }), + })); + } + + if let Some(mf4) = material.mf4(mt) { + let angle = AngleDistribution::from_mf4(mf4); + for dist in &mut neutron.distribution { + if let AngleEnergy::Uncorrelated(u) = dist { + u.angle = Some(angle.clone()); + } + } + } + + if is_fission && material.mf5(mt).is_some() && !products.is_empty() { + products[0].applicability = neutron.applicability; + products[0].distribution = neutron.distribution; + } else { + products.push(neutron); + } + } + + if material.mf8(mt).is_some() { + for act in activation_products(material, mt, &mf3.sigma) { + // A product MF=6 already gave keeps its distribution; only the + // yield is replaced. + match products.iter_mut().find(|p| p.name == act.name) { + Some(existing) => existing.yield_ = act.yield_, + None => products.push(act), + } + } + } + + Ok(Reaction { + mt, + xs: BTreeMap::from([("0K".to_string(), mf3.sigma.clone())]), + products, + derived_products, + q_reaction, + q_massdiff, + redundant: false, + center_of_mass: true, + }) + } +} + +/// The name of the particle a ZAP identifies. +fn product_name(za: i64) -> String { + match za { + 0 => "photon".to_string(), + 1 => "neutron".to_string(), + 1000 => "electron".to_string(), + _ => gnds_name((za / 1000) as u32, (za % 1000) as u32, 0), + } +} + +/// The products MF=6 lists, with their yields. +/// +/// The distributions are not read here, matching the Python reader, which +/// leaves that to a consumer that needs them. +fn mf6_products(mf6: &crate::mf::mf6::Mf6) -> Vec { + mf6.products + .iter() + .map(|data| Product { + name: product_name(data.zap), + yield_: Yield::Tabulated(data.yield_.clone()), + ..Default::default() + }) + .collect() +} + +/// A nu-bar as a product yield. +fn nu_yield(nu: &Nu) -> Option { + match nu { + Nu::Polynomial(c) => Some(Yield::Polynomial(Polynomial::new(c.clone()))), + Nu::Tabulated(t) => Some(Yield::Tabulated(t.clone())), + Nu::Absent => None, + } +} + +/// The fission neutrons of an evaluation: prompt, total and delayed. +/// +/// Returns the products and the derived ones — the total neutron is derived +/// when prompt is also given, since it is then the sum of what is already +/// there. +fn fission_products_endf(material: &Material) -> Result<(Vec, Vec)> { + let mut products: Vec = Vec::new(); + let mut derived_products: Vec = Vec::new(); + + let prompt = material.mf1_mt452(456); + if let Some(yield_) = prompt.and_then(|d| nu_yield(&d.nu)) { + products.push(Product { + name: "neutron".to_string(), + yield_, + ..Default::default() + }); + } + let has_prompt = prompt.is_some(); + + if let Some(total) = material.mf1_mt452(452) { + if let Some(yield_) = nu_yield(&total.nu) { + let neutron = Product { + name: "neutron".to_string(), + yield_, + emission_mode: EmissionMode::Total, + ..Default::default() + }; + if has_prompt { + derived_products.push(neutron); + } else { + products.push(neutron); + } + } + } + + let Some(delayed) = material.mf1_mt455() else { + return Ok((products, derived_products)); + }; + if delayed.ldg != 0 { + return Err(Error::Unsupported { + what: "delayed neutrons with energy-dependent group constants", + }); + } + + let decay_constants = delayed.lambda.clone(); + for &constant in &decay_constants { + products.push(Product { + name: "neutron".to_string(), + decay_rate: constant, + emission_mode: EmissionMode::Delayed, + ..Default::default() + }); + } + + // The delayed yield in MT=455 is the total across all precursor groups; + // each group's share comes from the applicability in MF=5. The Python + // reader writes the total onto the last six products, so this does too. + if let Some(yield_) = nu_yield(&delayed.nu) { + let start = products.len().saturating_sub(6); + for neutron in &mut products[start..] { + neutron.yield_ = yield_.clone(); + } + } + + let Some(mf5) = material.mf5(455) else { + return Ok((products, derived_products)); + }; + let nk = mf5.nk as usize; + if nk > 1 && decay_constants.len() == 1 { + // One precursor group listed but several spectra: the spectra are + // what actually separates the groups, so the product is duplicated. + let template = products[1].clone(); + for _ in 0..nk - 1 { + products.push(template.clone()); + } + } else if nk != decay_constants.len() { + return Err(Error::Mismatched { + what: "the number of delayed neutron spectra and precursors", + }); + } + + for (i, sub) in mf5.subsections.iter().enumerate() { + let neutron = &mut products[1 + i]; + let applicability = &sub.p; + + // The group's yield is the total yield times the applicability of its + // spectrum. + neutron.yield_ = match &neutron.yield_ { + Yield::Tabulated(t) => { + if applicability.y.iter().all(|&v| v == applicability.y[0]) { + let mut t = t.clone(); + for v in &mut t.y { + *v *= applicability.y[0]; + } + Yield::Tabulated(t) + } else { + // Neither grid contains the other, so the product is taken + // on their union, cut where one of them runs out. + let max_energy = + t.x[t.x.len() - 1].min(applicability.x[applicability.x.len() - 1]); + let mut energy: Vec = + t.x.iter().chain(&applicability.x).copied().collect(); + energy.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + energy.dedup(); + energy.retain(|&e| e <= max_energy); + let group: Vec = energy + .iter() + .map(|&e| t.eval(e) * applicability.eval(e)) + .collect(); + Yield::Tabulated(Tabulated1D::new(energy, group)) + } + } + Yield::Polynomial(p) => { + if p.coefficients.len() == 1 { + let mut t = applicability.clone(); + for v in &mut t.y { + *v *= p.coefficients[0]; + } + Yield::Tabulated(t) + } else if applicability.y.iter().all(|&v| v == applicability.y[0]) { + let mut p = p.clone(); + p.coefficients[0] *= applicability.y[0]; + Yield::Polynomial(p) + } else { + return Err(Error::Unsupported { + what: "an energy-dependent delayed yield and group probability together", + }); + } + } + }; + + neutron + .distribution + .push(AngleEnergy::Uncorrelated(UncorrelatedAngleEnergy { + angle: None, + energy: Some(sub.distribution.clone()), + })); + } + + Ok((products, derived_products)) +} + +/// The radioactive products of a reaction, from MF=9 and MF=10. +/// +/// MF=9 gives a yield directly; MF=10 gives a production cross section, which +/// becomes a yield once divided by the reaction's own. +fn activation_products(material: &Material, mt: i32, xs: &Tabulated1D) -> Vec { + let Some(mf8) = material.mf8(mt) else { + return Vec::new(); + }; + // MF=8 says which of the two files carries the data. + let present = |lmf: i64| mf8.subsections.iter().any(|s| s.lmf == lmf); + + let mut products = Vec::new(); + for mf in [9, 10] { + if !present(mf) { + continue; + } + let section = match mf { + 9 => material.mf9(mt), + _ => material.mf10(mt), + }; + let Some(section) = section else { continue }; + + for level in §ion.levels { + let (z, a) = (level.izap / 1000, level.izap % 1000); + let symbol = ATOMIC_SYMBOL.get(z as usize).copied().unwrap_or(""); + // The excited state, not the isomeric state: see + // `crate::radionuclide_production` for the difference. + let name = if level.lfs > 0 { + format!("{symbol}{a}_e{}", level.lfs) + } else { + format!("{symbol}{a}") + }; + + let yield_ = if mf == 9 { + Yield::Tabulated(level.func.clone()) + } else { + // Both cross sections onto their union grid, then the ratio + // wherever the reaction actually happens. + let mut energy: Vec = level.func.x.iter().chain(&xs.x).copied().collect(); + energy.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + energy.dedup(); + let y: Vec = energy + .iter() + .map(|&e| { + let neutron = xs.eval(e); + if neutron > 0.0 { + level.func.eval(e) / neutron + } else { + 0.0 + } + }) + .collect(); + Yield::Tabulated(Tabulated1D::new(energy, y)) + }; + + products.push(Product { + name, + yield_, + ..Default::default() + }); + } + } + products +} + +impl Reaction { + /// Read one reaction from an ACE table. + /// + /// `i_reaction` indexes the table's reaction list; index 0 is elastic + /// scattering, which the format stores apart from the rest. + pub fn from_ace(table: &Table, i_reaction: i64) -> Result { + let xss = &table.xss; + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| xss.get(i).copied()) + .unwrap_or(0.0) + }; + let slice = |i: i64, n: usize| -> Vec { (0..n as i64).map(|k| at(i + k)).collect() }; + + // The nuclide's own energy grid, which the cross sections index into. + let n_grid = table.nxs[3].max(0) as usize; + let grid: Vec = slice(table.jxs[1], n_grid) + .into_iter() + .map(|e| e * EV_PER_MEV) + .collect(); + + // `Table::temperature` is in kelvin; the raw kT in the file is in MeV. + let temperature = temperature_str(table.temperature()); + + let mut rx; + // Which product the angular distribution belongs to, once one is read. + let mut neutron: Option = None; + + if i_reaction > 0 { + let mt = at(table.jxs[3] + i_reaction - 1) as i32; + rx = Reaction::new(mt); + rx.q_reaction = at(table.jxs[4] + i_reaction - 1) * EV_PER_MEV; + + // The cross section, which starts at a threshold rather than at + // the bottom of the grid. + let loc = at(table.jxs[6] + i_reaction - 1) as i64; + // The stored index is one-based into the nuclide energy grid. + let threshold_idx = (at(table.jxs[7] + loc - 1) as i64 - 1).max(0) as usize; + let n_energy = at(table.jxs[7] + loc).max(0.0) as usize; + let energy = grid + .get(threshold_idx..(threshold_idx + n_energy).min(grid.len())) + .unwrap_or_default() + .to_vec(); + let mut sigma = slice(table.jxs[7] + loc + 1, n_energy); + + // Damage energy production is stored in MeV. + if mt == 444 { + for v in &mut sigma { + *v *= EV_PER_MEV; + } + } + // Processed files occasionally carry a small negative cross + // section, which is a processing artefact rather than physics. + // The Python reader warns and zeroes; this zeroes. + for v in &mut sigma { + if *v < 0.0 { + *v = 0.0; + } + } + let mut tabulated = Tabulated1D::new(energy, sigma); + tabulated.threshold_idx = Some(threshold_idx); + rx.xs.insert(temperature.clone(), tabulated); + + // TY is the multiplicity, and its sign records the frame. + let ty = at(table.jxs[5] + i_reaction - 1) as i64; + rx.center_of_mass = ty < 0; + + if i_reaction < table.nxs[5] + 1 { + if ty != 19 { + let yield_ = if ty.abs() > 100 { + // An energy-dependent yield, stored in DLW. + Yield::Tabulated(Tabulated1D::from_ace( + xss, + (table.jxs[11] + ty.abs() - 101).max(0) as usize, + true, + )) + } else { + Yield::Polynomial(Polynomial::new(vec![ty.abs() as f64])) + }; + rx.products.push(Product { + name: "neutron".to_string(), + yield_, + ..Default::default() + }); + neutron = Some(rx.products.len() - 1); + } else { + // TY = 19 means fission, whose neutrons come from the NU + // block rather than from a multiplicity. + let (products, derived) = fission_products_ace(table)?; + rx.products = products; + rx.derived_products = derived; + neutron = rx.products.iter().position(|p| { + matches!(p.emission_mode, EmissionMode::Prompt | EmissionMode::Total) + }); + if neutron.is_none() { + return Err(Error::BadAceTable { + what: "a fission reaction with no prompt or total neutron".into(), + }); + } + } + + // DLW is a linked list: each entry's first word points at the + // next distribution for this reaction. + let i = neutron.expect("set on both branches above"); + let mut lnw = at(table.jxs[10] + i_reaction - 1) as i64; + while lnw > 0 { + rx.products[i].applicability.push(Tabulated1D::from_ace( + xss, + (table.jxs[11] + lnw + 2).max(0) as usize, + true, + )); + let dist = + AngleEnergy::from_ace(table, table.jxs[11], lnw, Some(rx.q_reaction))?; + rx.products[i].distribution.push(dist); + lnw = at(table.jxs[11] + lnw - 1) as i64; + } + } + } else { + // Elastic scattering, whose cross section is the fourth column of + // the main energy block. + rx = Reaction::new(2); + let mut elastic = slice(table.jxs[1] + 3 * n_grid as i64, n_grid); + for v in &mut elastic { + if *v < 0.0 { + *v = 0.0; + } + } + let mut tabulated = Tabulated1D::new(grid.clone(), elastic); + tabulated.threshold_idx = Some(0); + rx.xs.insert(temperature.clone(), tabulated); + + // No energy distribution is given: it follows from the kinematics. + rx.products.push(Product { + name: "neutron".to_string(), + distribution: vec![AngleEnergy::Uncorrelated(UncorrelatedAngleEnergy::default())], + ..Default::default() + }); + neutron = Some(0); + } + + // The angular distribution, for the uncorrelated laws. A negative + // locator means the angle is bound up with the energy in DLW instead, + // which is why this only ever writes onto an uncorrelated + // distribution. + if i_reaction < table.nxs[5] + 1 { + let loc = at(table.jxs[8] + i_reaction) as i64; + let angle = match loc { + l if l < 0 => None, + 0 => Some(isotropic_angle(0.0, grid.last().copied().unwrap_or(0.0))), + l => Some(AngleDistribution::from_ace(table, table.jxs[9], l)?), + }; + if let (Some(angle), Some(i)) = (angle, neutron) { + for dist in &mut rx.products[i].distribution { + if let AngleEnergy::Uncorrelated(u) = dist { + u.angle = Some(angle.clone()); + } + } + } + } + + rx.products.extend(photon_products_ace(table, &rx)?); + Ok(rx) + } +} + +/// An isotropic angular distribution spanning an energy range. +fn isotropic_angle(energy_low: f64, energy_high: f64) -> AngleDistribution { + let mu = AngleAtEnergy::Isotropic(Uniform::new(-1.0, 1.0)); + AngleDistribution { + energy: vec![energy_low, energy_high], + mu: vec![mu.clone(), mu], + } +} + +/// A nu-bar in an ACE NU block, in whichever of the two forms it uses. +fn read_nu_ace(table: &Table, idx: i64) -> Yield { + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| table.xss.get(i).copied()) + .unwrap_or(0.0) + }; + if at(idx) as i64 == 1 { + let nc = at(idx + 1) as usize; + // The coefficients are per MeV of incident energy, so the term of + // degree i converts by that power. + let coefficients = (0..nc) + .map(|i| at(idx + 2 + i as i64) * EV_PER_MEV.powi(-(i as i32))) + .collect(); + Yield::Polynomial(Polynomial::new(coefficients)) + } else { + Yield::Tabulated(Tabulated1D::from_ace( + &table.xss, + (idx + 1).max(0) as usize, + true, + )) + } +} + +/// The fission neutrons of an ACE table: prompt, total and delayed. +fn fission_products_ace(table: &Table) -> Result<(Vec, Vec)> { + let xss = &table.xss; + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| xss.get(i).copied()) + .unwrap_or(0.0) + }; + + let mut products: Vec = Vec::new(); + let mut derived_products: Vec = Vec::new(); + + // No NU block at all. + if table.jxs[2] == 0 { + return Ok((products, derived_products)); + } + + let first = at(table.jxs[2]); + if first > 0.0 { + // One of prompt and total is given, and which it is depends on + // whether the delayed block exists. + products.push(Product { + name: "neutron".to_string(), + emission_mode: if table.jxs[24] > 0 { + EmissionMode::Prompt + } else { + EmissionMode::Total + }, + yield_: read_nu_ace(table, table.jxs[2]), + ..Default::default() + }); + } else if first < 0.0 { + // Both are given, one after the other. + products.push(Product { + name: "neutron".to_string(), + emission_mode: EmissionMode::Prompt, + yield_: read_nu_ace(table, table.jxs[2] + 1), + ..Default::default() + }); + derived_products.push(Product { + name: "neutron".to_string(), + emission_mode: EmissionMode::Total, + yield_: read_nu_ace(table, table.jxs[2] + first.abs() as i64 + 1), + ..Default::default() + }); + } + + if table.jxs[24] <= 0 { + return Ok((products, derived_products)); + } + + let yield_delayed = Tabulated1D::from_ace(xss, (table.jxs[24] + 1).max(0) as usize, true); + let mut idx = table.jxs[25]; + let n_group = table.nxs[8].max(0); + let mut total_group_probability = 0.0; + + for group in 0..n_group { + // Decay constants are stored in inverse shakes. + let decay_rate = at(idx) * 1.0e8; + let probability = Tabulated1D::from_ace(xss, (idx + 1).max(0) as usize, true); + + let yield_ = if probability.y.iter().all(|&v| v == probability.y[0]) { + let mut y = yield_delayed.clone(); + let share = probability.y[0]; + for v in &mut y.y { + *v *= share; + } + total_group_probability += share; + y + } else { + // Neither grid contains the other, so the product is taken on + // their union, cut where one of them runs out. + let max_energy = yield_delayed.x[yield_delayed.x.len() - 1] + .min(probability.x[probability.x.len() - 1]); + let mut energy: Vec = yield_delayed + .x + .iter() + .chain(&probability.x) + .copied() + .collect(); + energy.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + energy.dedup(); + energy.retain(|&e| e <= max_energy); + let y: Vec = energy + .iter() + .map(|&e| yield_delayed.eval(e) * probability.eval(e)) + .collect(); + Tabulated1D::new(energy, y) + }; + + // Step past this group's probability record. + let nr = at(idx + 1) as i64; + let ne = at(idx + 2 + 2 * nr) as i64; + idx += 3 + 2 * nr + 2 * ne; + + let location_start = at(table.jxs[26] + group) as i64; + // No Q value is passed: the Python reader passes no reaction here + // either, so law 66 would fail in both. It does not arise — a delayed + // neutron spectrum is never N-body phase space. + let distribution = AngleEnergy::from_ace(table, table.jxs[27], location_start, None)?; + + products.push(Product { + name: "neutron".to_string(), + emission_mode: EmissionMode::Delayed, + decay_rate, + yield_: Yield::Tabulated(yield_), + distribution: vec![distribution], + ..Default::default() + }); + } + + // The group probabilities in an ACE file do not sum to exactly one, so the + // delayed yields are renormalised against what they do sum to. + if total_group_probability > 0.0 { + for product in products.iter_mut().skip(1) { + if let Yield::Tabulated(y) = &mut product.yield_ { + for v in &mut y.y { + *v /= total_group_probability; + } + } + } + } + + Ok((products, derived_products)) +} + +/// The photons a reaction produces, from the ACE photon production blocks. +pub(crate) fn photon_products_ace(table: &Table, rx: &Reaction) -> Result> { + let xss = &table.xss; + let at = |i: i64| -> f64 { + usize::try_from(i) + .ok() + .and_then(|i| xss.get(i).copied()) + .unwrap_or(0.0) + }; + let slice = |i: i64, n: usize| -> Vec { (0..n as i64).map(|k| at(i + k)).collect() }; + + let n_photon_reactions = table.nxs[6].max(0); + let mut photons = Vec::new(); + for i in 0..n_photon_reactions { + // The photon MT encodes the neutron reaction it belongs to. + let photon_mt = at(table.jxs[13] + i) as i64; + if (photon_mt / 1000) as i32 != rx.mt { + continue; + } + + // Either a yield or a production cross section, depending on which + // ENDF file the processing took it from. + let loca = at(table.jxs[14] + i) as i64; + let idx = table.jxs[15] + loca - 1; + let mftype = at(idx) as i64; + let idx = idx + 1; + + let yield_ = match mftype { + 12 | 16 => Tabulated1D::from_ace(xss, (idx + 1).max(0) as usize, true), + 13 => { + // A production cross section, which becomes a yield once + // divided by the reaction's own. + let threshold_idx = at(idx) as i64 - 1; + let n_energy = at(idx + 1) as usize; + let energy: Vec = slice(table.jxs[1] + threshold_idx, n_energy) + .into_iter() + .map(|e| e * EV_PER_MEV) + .collect(); + let production = slice(idx + 2, n_energy); + let neutron_xs = rx.xs.values().next().ok_or(Error::BadAceTable { + what: "a photon production cross section with no reaction to divide by".into(), + })?; + let y: Vec = energy + .iter() + .zip(&production) + .map(|(&e, &p)| { + let n = neutron_xs.eval(e); + if n > 0.0 { + p / n + } else { + 0.0 + } + }) + .collect(); + Tabulated1D::new(energy, y) + } + _ => { + return Err(Error::BadAceTable { + what: format!("photon production MFTYPE {mftype}, expected 12, 13 or 16"), + }) + } + }; + + let location_start = at(table.jxs[18] + i) as i64; + // As with the delayed spectra, no Q value: photon production is never + // given as N-body phase space, and the Python reader passes none. + let mut distribution = AngleEnergy::from_ace(table, table.jxs[19], location_start, None)?; + + // The angular distribution, which is separate for photons. + let loc = at(table.jxs[16] + i) as i64; + let angle = if loc == 0 { + // Nothing given, so isotropic in the laboratory frame across the + // range the yield covers. + isotropic_angle( + yield_.x.first().copied().unwrap_or(0.0), + yield_.x.last().copied().unwrap_or(0.0), + ) + } else { + AngleDistribution::from_ace(table, table.jxs[17], loc)? + }; + match &mut distribution { + AngleEnergy::Uncorrelated(u) => u.angle = Some(angle), + _ => { + return Err(Error::BadAceTable { + what: "a photon distribution that is not uncorrelated".into(), + }) + } + } + + photons.push(Product { + name: "photon".to_string(), + yield_: Yield::Tabulated(yield_), + distribution: vec![distribution], + ..Default::default() + }); + } + Ok(photons) +} + +#[cfg(test)] +mod tests { + use super::*; + + const AM244: &[u8] = include_bytes!("../../../tests/n-095_Am_244.endf.xz"); + const IN115: &[u8] = include_bytes!("../../../tests/n-049_In-115_trimmed.endf.xz"); + + #[test] + fn names_the_reactions_the_format_names() { + assert_eq!(reaction_name(2).as_deref(), Some("(n,elastic)")); + assert_eq!(reaction_name(16).as_deref(), Some("(n,2n)")); + assert_eq!(reaction_name(102).as_deref(), Some("(n,gamma)")); + assert_eq!(reaction_name(444).as_deref(), Some("damage-energy")); + // An MT the format does not assign. + assert_eq!(reaction_name(999), None); + } + + #[test] + fn names_the_level_reactions_by_their_level() { + // The first inelastic level is MT=51 and is named for level 1. + assert_eq!(reaction_name(51).as_deref(), Some("(n,n1)")); + assert_eq!(reaction_name(90).as_deref(), Some("(n,n40)")); + // MT=91 ends the run and is the continuum, not level 41. + assert_eq!(reaction_name(91).as_deref(), Some("(n,nc)")); + assert_eq!(reaction_name(600).as_deref(), Some("(n,p0)")); + assert_eq!(reaction_name(648).as_deref(), Some("(n,p48)")); + assert_eq!(reaction_name(649).as_deref(), Some("(n,pc)")); + assert_eq!(reaction_name(750).as_deref(), Some("(n,3He0)")); + assert_eq!(reaction_name(875).as_deref(), Some("(n,2n0)")); + assert_eq!(reaction_name(890).as_deref(), Some("(n,2n15)")); + assert_eq!(reaction_name(891).as_deref(), Some("(n,2nc)")); + } + + #[test] + fn looks_up_reactions_by_name_and_by_alias() { + assert_eq!(reaction_mt("(n,elastic)"), Some(2)); + assert_eq!(reaction_mt("(n,n3)"), Some(53)); + // The aliases the package adds on top of the format's own names. + assert_eq!(reaction_mt("total"), Some(1)); + assert_eq!(reaction_mt("elastic"), Some(2)); + assert_eq!(reaction_mt("fission"), Some(18)); + assert_eq!(reaction_mt("absorption"), Some(27)); + assert_eq!(reaction_mt("capture"), Some(102)); + assert_eq!(reaction_mt("(n,nonsense)"), None); + } + + #[test] + fn every_name_round_trips_to_its_own_mt() { + for mt in 0..1200 { + if let Some(name) = reaction_name(mt) { + assert_eq!(reaction_mt(&name), Some(mt), "{name} came back wrong"); + } + } + } + + #[test] + fn gathers_a_fission_reaction_from_its_files() { + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + let rx = Reaction::from_endf(18, &m).unwrap(); + assert_eq!(rx.name().as_deref(), Some("(n,fission)")); + assert_eq!(rx.xs.keys().collect::>(), ["0K"]); + + // Prompt neutrons from MT=456, then one per delayed precursor group. + assert_eq!(rx.products[0].emission_mode, EmissionMode::Prompt); + let delayed: Vec<&Product> = rx + .products + .iter() + .filter(|p| p.emission_mode == EmissionMode::Delayed) + .collect(); + assert_eq!(delayed.len(), m.mf1_mt455().unwrap().lambda.len()); + assert!(delayed.iter().all(|p| p.decay_rate > 0.0)); + // This evaluation gives no MF=5 MT=455, so the groups have decay + // constants and a shared yield but no spectra of their own. + assert!(m.mf5(455).is_none()); + assert!(delayed.iter().all(|p| p.distribution.is_empty())); + // The prompt neutron's spectrum comes from MF=5 MT=18. + assert_eq!(rx.products[0].distribution.len(), 1); + assert_eq!(rx.products[0].applicability.len(), 1); + + // The total neutron is derived: prompt and delayed are both given, so + // it adds nothing a consumer cannot sum for itself. + assert_eq!(rx.derived_products.len(), 1); + assert_eq!(rx.derived_products[0].emission_mode, EmissionMode::Total); + } + + #[test] + fn each_delayed_group_gets_its_own_spectrum_and_share_of_the_yield() { + const U235: &[u8] = include_bytes!("../../../tests/n-092_U_235_trimmed.endf.xz"); + let m = Material::from_str(&crate::testdata::text(U235)).unwrap(); + let rx = Reaction::from_endf(18, &m).unwrap(); + + let lambda = &m.mf1_mt455().unwrap().lambda; + let delayed: Vec<&Product> = rx + .products + .iter() + .filter(|p| p.emission_mode == EmissionMode::Delayed) + .collect(); + assert_eq!(delayed.len(), lambda.len()); + assert_eq!( + delayed.iter().map(|p| p.decay_rate).collect::>(), + *lambda + ); + + // MF=5 MT=455 gives one spectrum per group, and each group's yield is + // the total delayed yield scaled by that spectrum's applicability. + let mf5 = m.mf5(455).unwrap(); + assert_eq!(mf5.subsections.len(), delayed.len()); + let total = match &m.mf1_mt455().unwrap().nu { + Nu::Tabulated(t) => t.clone(), + _ => panic!("this evaluation tabulates its delayed yield"), + }; + for (product, sub) in delayed.iter().zip(&mf5.subsections) { + assert_eq!(product.distribution.len(), 1); + let Yield::Tabulated(y) = &product.yield_ else { + panic!("a scaled tabulated yield stays tabulated"); + }; + // The applicability is a constant here, so the group yield is the + // total times that constant at every energy. + let share = sub.p.y[0]; + assert!(sub.p.y.iter().all(|&v| v == share)); + assert_eq!(y.x, total.x); + for (got, want) in y.y.iter().zip(&total.y) { + assert_eq!(*got, want * share); + } + } + + // The shares are a partition of the delayed neutrons. + let sum: f64 = mf5.subsections.iter().map(|s| s.p.y[0]).sum(); + assert!((sum - 1.0).abs() < 1e-6, "the group shares sum to {sum}"); + } + + #[test] + fn level_inelastic_scattering_gets_its_kinematics() { + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + let rx = Reaction::from_endf(51, &m).unwrap(); + assert_eq!(rx.name().as_deref(), Some("(n,n1)")); + + let dist = &rx.products[0].distribution[0]; + let AngleEnergy::Uncorrelated(u) = dist else { + panic!("level inelastic scattering is uncorrelated"); + }; + // MF=4 gives the angle; the energy follows from the Q value. + assert!(u.angle.is_some()); + let Some(EnergyDistribution::LevelInelastic { + threshold, + mass_ratio, + }) = u.energy + else { + panic!("the energy should be the level kinematics"); + }; + let a = m.mf1_mt451().unwrap().awr; + assert_eq!(threshold, (a + 1.0) / a * rx.q_reaction.abs()); + assert_eq!(mass_ratio, (a / (a + 1.0)).powi(2)); + } + + #[test] + fn an_mf10_production_cross_section_becomes_a_yield() { + let m = Material::from_str(&crate::testdata::text(IN115)).unwrap(); + let rx = Reaction::from_endf(4, &m).unwrap(); + + // In115 inelastic leaves In115 in its first excited state. + let product = rx + .products + .iter() + .find(|p| p.name == "In115_e1") + .expect("the activation product is named for its excited state"); + let Yield::Tabulated(y) = &product.yield_ else { + panic!("an MF=10 yield is tabulated"); + }; + + // The yield is the ratio of the two cross sections, so at any energy + // where the reaction happens it reproduces the production one. + let production = &m.mf10(4).unwrap().levels[0].func; + let xs = &m.mf3(4).unwrap().sigma; + for &e in &[1.0e6, 5.0e6, 1.0e7, 1.9e7] { + let want = production.eval(e); + let got = y.eval(e) * xs.eval(e); + assert!( + (got - want).abs() <= 1e-9 * want.abs().max(1e-30), + "at {e} eV: {got} != {want}" + ); + } + // Below the threshold the reaction cross section is zero, and the + // yield is set to zero rather than left as a division by it. + assert_eq!(y.y[0], 0.0); + } + + #[test] + fn a_reaction_with_no_cross_section_is_refused() { + let m = Material::from_str(&crate::testdata::text(AM244)).unwrap(); + assert!(Reaction::from_endf(999, &m).is_err()); + } +} + +#[cfg(test)] +mod ace_tests { + use super::*; + use crate::ace; + + fn li6() -> ace::Table { + crate::testdata::ace_tables(crate::testdata::LI6_ACE).remove(0) + } + + #[test] + fn elastic_scattering_is_index_zero() { + let t = li6(); + let rx = Reaction::from_ace(&t, 0).unwrap(); + assert_eq!(rx.mt, 2); + assert_eq!(rx.name().as_deref(), Some("(n,elastic)")); + + // Its cross section spans the whole grid, unlike a threshold reaction. + let xs = rx.xs.values().next().unwrap(); + assert_eq!(xs.x.len(), t.nxs[3] as usize); + assert!(xs.y.iter().all(|&v| v >= 0.0)); + // The temperature keys the table, and it is the file's own. + assert_eq!( + rx.xs.keys().next().unwrap(), + &crate::data::temperature_str(t.temperature()) + ); + + // One neutron, with an angular distribution but no energy one: the + // outgoing energy follows from the kinematics. + assert_eq!(rx.products.len(), 1); + let AngleEnergy::Uncorrelated(u) = &rx.products[0].distribution[0] else { + panic!("elastic scattering is uncorrelated"); + }; + assert!(u.angle.is_some()); + assert!(u.energy.is_none()); + } + + #[test] + fn a_threshold_reaction_starts_where_it_opens() { + let t = li6(); + // Index 2 is MT=51, the first inelastic level. + let rx = Reaction::from_ace(&t, 2).unwrap(); + assert_eq!(rx.mt, 51); + assert!(rx.q_reaction < 0.0, "an inelastic level costs energy"); + + let xs = rx.xs.values().next().unwrap(); + assert!(xs.x.len() < t.nxs[3] as usize); + // It opens above the threshold the Q value implies. + assert!(xs.x[0] > rx.q_reaction.abs()); + } + + #[test] + fn a_constant_multiplicity_becomes_a_polynomial_yield() { + let t = li6(); + let rx = Reaction::from_ace(&t, 2).unwrap(); + let neutron = rx.products.iter().find(|p| p.name == "neutron").unwrap(); + // TY = 1 for a level reaction: one neutron out, whatever the energy. + assert_eq!( + neutron.yield_, + Yield::Polynomial(Polynomial::new(vec![1.0])) + ); + assert_eq!(neutron.yield_.eval(1.0e6), 1.0); + } + + #[test] + fn every_reaction_in_the_table_reads() { + let t = li6(); + let mts: Vec = (0..=t.nxs[4]) + .map(|i| Reaction::from_ace(&t, i).unwrap().mt) + .collect(); + // Elastic first, then the reactions MTR lists, in its order. + assert_eq!(mts[0], 2); + assert_eq!( + mts[1..], + (1..=t.nxs[4]) + .map(|i| t.xss[(t.jxs[3] + i - 1) as usize] as i32) + .collect::>() + ); + // Li6 has no fission, so nothing is a derived product. + assert!((0..=t.nxs[4]).all(|i| Reaction::from_ace(&t, i) + .unwrap() + .derived_products + .is_empty())); + } + + #[test] + fn photon_production_is_attached_to_the_reaction_that_makes_it() { + let t = li6(); + let mut photons = 0; + for i in 0..=t.nxs[4] { + let rx = Reaction::from_ace(&t, i).unwrap(); + for photon in rx.products.iter().filter(|p| p.name == "photon") { + photons += 1; + // A photon always carries a distribution, and the angle is + // filled in even when the file gives none. + let AngleEnergy::Uncorrelated(u) = &photon.distribution[0] else { + panic!("photon production is uncorrelated"); + }; + assert!(u.angle.is_some()); + assert!(u.energy.is_some()); + } + } + // NXS(6) counts the photon production reactions, and each belongs to + // exactly one neutron reaction. + assert_eq!(photons, t.nxs[6] as usize); + } +} diff --git a/crates/endf/src/records.rs b/crates/endf/src/records.rs new file mode 100644 index 0000000..d1d3e43 --- /dev/null +++ b/crates/endf/src/records.rs @@ -0,0 +1,532 @@ +//! The ENDF-6 record primitives: TEXT, CONT, HEAD, LIST, TAB1, TAB2 and INTG. +//! +//! ENDF-6 is a fixed-width line format. Every record is built from 11-character +//! fields, and the last 14 columns of each line carry the MAT/MF/MT control +//! fields that [`crate::material`] uses to split a file into sections. + +use crate::error::{Error, Result}; +use crate::function::{Tabulated1D, Tabulated2D}; + +/// Extract a fixed-width field, tolerating lines shorter than the format +/// requires. +/// +/// Evaluators do trim trailing blanks, so a CONT record's last field is +/// routinely missing from the line entirely. Python slicing yields `""` there +/// and [`int_endf`] reads that as zero; this keeps that behaviour rather than +/// panicking on the range. +#[inline] +pub fn field(line: &str, start: usize, end: usize) -> &str { + let len = line.len(); + let start = start.min(len); + let end = end.min(len); + if start >= end { + return ""; + } + // `get` returns None rather than panicking if a non-ASCII byte means the + // range is not on a char boundary. + line.get(start..end).unwrap_or("") +} + +/// Convert an ENDF floating point field to `f64`. +/// +/// ENDF-6 uses an "e-less" exponential notation, e.g. `-1.23481+10`, which the +/// usual float parsers reject. Whitespace anywhere in the field is ignored, an +/// all-blank field is zero, and `e`, `E`, `d` and `D` are all accepted as the +/// exponent marker. Only the first 11 characters are read, matching the width +/// of an ENDF field. +pub fn float_endf(s: &str) -> f64 { + let bytes = s.as_bytes(); + let n = bytes.len().min(11); + + // 11 characters, plus at most one inserted `e`, plus room to spare. + let mut buf = [0u8; 13]; + let mut j = 0usize; + let mut found_significand = false; + let mut found_exponent = false; + + for &c in &bytes[..n] { + if c == b' ' { + continue; + } + if found_significand { + if !found_exponent { + if c == b'+' || c == b'-' { + // A sign after the significand with no marker in between is + // the e-less exponent: supply the `e` ourselves. + buf[j] = b'e'; + j += 1; + found_exponent = true; + } else if matches!(c, b'e' | b'E' | b'd' | b'D') { + buf[j] = b'e'; + j += 1; + found_exponent = true; + continue; + } + } + } else if c == b'.' || c.is_ascii_digit() { + found_significand = true; + } + buf[j] = c; + j += 1; + } + + let Ok(text) = std::str::from_utf8(&buf[..j]) else { + return 0.0; + }; + // C's atof takes the longest parseable prefix and yields zero when there is + // none; Rust's parse is all-or-nothing, so walk the end back to match. + if let Ok(v) = text.parse::() { + return v; + } + for end in (1..text.len()).rev() { + if let Ok(v) = text[..end].parse::() { + return v; + } + } + 0.0 +} + +/// Convert an ENDF integer field to `i64`. +/// +/// The format allows an integer to be written as an all-blank field, which +/// means zero. +pub fn int_endf(s: &str) -> i64 { + let t = s.trim(); + if t.is_empty() { + return 0; + } + t.parse::().unwrap_or(0) +} + +/// The six fields of a CONT record. +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Cont { + pub c1: f64, + pub c2: f64, + pub l1: i64, + pub l2: i64, + pub n1: i64, + pub n2: i64, +} + +/// A HEAD record: a CONT whose first two fields are ZA and AWR. +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Head { + pub za: i64, + pub awr: f64, + pub l1: i64, + pub l2: i64, + pub n1: i64, + pub n2: i64, +} + +/// A LIST record: a CONT header followed by `n1` floating point values. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct ListRecord { + pub cont: Cont, + pub values: Vec, +} + +/// A TAB1 record: four header fields plus the tabulated function itself. +#[derive(Debug, Clone, PartialEq)] +pub struct Tab1 { + pub c1: f64, + pub c2: f64, + pub l1: i64, + pub l2: i64, + pub table: Tabulated1D, +} + +/// A TAB2 record: a CONT header plus the interpolation rules for the +/// subrecords that follow it. +#[derive(Debug, Clone, PartialEq)] +pub struct Tab2 { + pub cont: Cont, + pub table: Tabulated2D, +} + +/// A square matrix, used for the correlation matrix an INTG record encodes. +#[derive(Debug, Clone, PartialEq)] +pub struct Matrix { + n: usize, + data: Vec, +} + +impl Matrix { + /// The `n` by `n` identity matrix. + pub fn identity(n: usize) -> Self { + let mut m = Matrix { + n, + data: vec![0.0; n * n], + }; + for i in 0..n { + m.data[i * n + i] = 1.0; + } + m + } + + pub fn order(&self) -> usize { + self.n + } + + pub fn get(&self, i: usize, j: usize) -> f64 { + self.data[i * self.n + j] + } + + pub fn set(&mut self, i: usize, j: usize, v: f64) { + self.data[i * self.n + j] = v; + } + + /// Row-major values. + pub fn as_slice(&self) -> &[f64] { + &self.data + } + + /// Reflect the lower triangle onto the upper, leaving the diagonal alone. + fn symmetrize(&mut self) { + for i in 0..self.n { + for j in 0..i { + let v = self.get(i, j) + self.get(j, i); + self.set(i, j, v); + self.set(j, i, v); + } + } + } +} + +/// A cursor over the lines of one ENDF section. +/// +/// Records are read in sequence, mirroring how the format is defined: each +/// `*_record` call consumes as many lines as that record occupies. +pub struct Reader<'a> { + lines: Vec<&'a str>, + pos: usize, +} + +impl<'a> Reader<'a> { + pub fn new(text: &'a str) -> Self { + Reader { + lines: text.lines().collect(), + pos: 0, + } + } + + /// Lines not yet consumed. + pub fn remaining(&self) -> usize { + self.lines.len().saturating_sub(self.pos) + } + + pub fn is_empty(&self) -> bool { + self.remaining() == 0 + } + + fn next_line(&mut self, expected: &'static str) -> Result<&'a str> { + let line = self + .lines + .get(self.pos) + .copied() + .ok_or(Error::UnexpectedEof { expected })?; + self.pos += 1; + Ok(line) + } + + /// Skip `n` lines without interpreting them. + /// + /// Used for records the format defines but nothing reads, such as MF=4's + /// obsolete energy transformation matrix. + pub fn skip_lines(&mut self, n: usize) -> Result<()> { + for _ in 0..n { + self.next_line("lines to skip")?; + } + Ok(()) + } + + /// A TEXT record: the 66 columns before the control fields. + pub fn text_record(&mut self) -> Result<&'a str> { + let line = self.next_line("a TEXT record")?; + Ok(field(line, 0, 66)) + } + + pub fn cont_record(&mut self) -> Result { + let line = self.next_line("a CONT record")?; + Ok(Cont { + c1: float_endf(field(line, 0, 11)), + c2: float_endf(field(line, 11, 22)), + l1: int_endf(field(line, 22, 33)), + l2: int_endf(field(line, 33, 44)), + n1: int_endf(field(line, 44, 55)), + n2: int_endf(field(line, 55, 66)), + }) + } + + /// Read the next CONT record without consuming it. + /// + /// The format sometimes puts the flag that says how to read a record + /// inside the record itself — MF=33's LB is the case here — so the reader + /// has to look before it leaps. The Python reader does the same with + /// `tell` and `seek`. + pub fn peek_cont_record(&mut self) -> Result { + let mark = self.pos; + let cont = self.cont_record(); + self.pos = mark; + cont + } + + pub fn head_record(&mut self) -> Result { + let c = self.cont_record()?; + Ok(Head { + // ZA is written as a float but is conceptually an integer. + za: c.c1 as i64, + awr: c.c2, + l1: c.l1, + l2: c.l2, + n1: c.n1, + n2: c.n2, + }) + } + + pub fn list_record(&mut self) -> Result { + let cont = self.cont_record()?; + let npl = cont.n1.max(0) as usize; + let mut values = Vec::with_capacity(npl); + for _ in 0..npl.div_ceil(6) { + let line = self.next_line("the values of a LIST record")?; + let n = (npl - values.len()).min(6); + for j in 0..n { + values.push(float_endf(field(line, 11 * j, 11 * (j + 1)))); + } + } + Ok(ListRecord { cont, values }) + } + + /// Read the `(NBT, INT)` interpolation pairs shared by TAB1 and TAB2. + fn interpolation_pairs(&mut self, n_regions: usize) -> Result<(Vec, Vec)> { + let mut breakpoints = Vec::with_capacity(n_regions); + let mut interpolation = Vec::with_capacity(n_regions); + for _ in 0..n_regions.div_ceil(3) { + let line = self.next_line("the interpolation regions of a TAB record")?; + let n = (n_regions - breakpoints.len()).min(3); + for j in 0..n { + let o = 22 * j; + breakpoints.push(int_endf(field(line, o, o + 11)) as i32); + interpolation.push(int_endf(field(line, o + 11, o + 22)) as i32); + } + } + Ok((breakpoints, interpolation)) + } + + pub fn tab1_record(&mut self) -> Result { + let line = self.next_line("a TAB1 record")?; + let c1 = float_endf(field(line, 0, 11)); + let c2 = float_endf(field(line, 11, 22)); + let l1 = int_endf(field(line, 22, 33)); + let l2 = int_endf(field(line, 33, 44)); + let n_regions = int_endf(field(line, 44, 55)).max(0) as usize; + let n_pairs = int_endf(field(line, 55, 66)).max(0) as usize; + + let (breakpoints, interpolation) = self.interpolation_pairs(n_regions)?; + + let mut x = Vec::with_capacity(n_pairs); + let mut y = Vec::with_capacity(n_pairs); + for _ in 0..n_pairs.div_ceil(3) { + let line = self.next_line("the (x, y) pairs of a TAB1 record")?; + let n = (n_pairs - x.len()).min(3); + for j in 0..n { + let o = 22 * j; + x.push(float_endf(field(line, o, o + 11))); + y.push(float_endf(field(line, o + 11, o + 22))); + } + } + + Ok(Tab1 { + c1, + c2, + l1, + l2, + table: Tabulated1D::with_regions(x, y, breakpoints, interpolation), + }) + } + + pub fn tab2_record(&mut self) -> Result { + let cont = self.cont_record()?; + let n_regions = cont.n1.max(0) as usize; + let (breakpoints, interpolation) = self.interpolation_pairs(n_regions)?; + Ok(Tab2 { + cont, + table: Tabulated2D { + breakpoints, + interpolation, + }, + }) + } + + /// An INTG record: a correlation matrix in the format's compact integer + /// encoding. + pub fn intg_record(&mut self) -> Result { + let items = self.cont_record()?; + let ndigit = items.l1; + let npar = items.l2.max(0) as usize; + let nlines = items.n1.max(0) as usize; + + let nrow: usize = match ndigit { + 2 => 18, + 3 => 12, + 4 => 11, + 5 => 9, + 6 => 8, + _ => return Err(Error::BadNdigit { ndigit }), + }; + let width = (ndigit + 1) as usize; + let factor = 10f64.powi(ndigit as i32); + + let mut corr = Matrix::identity(npar); + for _ in 0..nlines { + let line = self.next_line("the rows of an INTG record")?; + let ii = int_endf(field(line, 0, 5)) - 1; + let jj = int_endf(field(line, 5, 10)) - 1; + if ii < 0 || jj < 0 || ii as usize >= npar { + continue; + } + for j in 0..nrow { + if jj + j as i64 >= ii { + break; + } + let o = 11 + width * j; + let element = int_endf(field(line, o, o + width)); + // NOTE: the column written to is `jj`, not `jj + j`. This + // mirrors endf-python's reader exactly, including what looks + // like an upstream indexing bug, so the two agree while the + // port is validated against it. Revisit against ENDF-102 §33 + // before this crate is the only reader. + let (i, k) = (ii as usize, jj as usize); + if element > 0 { + corr.set(i, k, (element as f64 + 0.5) / factor); + } else if element < 0 { + corr.set(i, k, (element as f64 - 0.5) / factor); + } + } + } + corr.symmetrize(); + Ok(corr) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // Ported one-for-one from tests/test_records.py so the two readers are + // held to the same cases. + + fn approx(a: f64, b: f64) { + assert!((a - b).abs() <= 1e-6 * b.abs().max(1.0), "{a} != {b}"); + } + + #[test] + fn float_sign() { + approx(float_endf("+3.2146"), 3.2146); + approx(float_endf("-2.225002+6"), -2.225002e6); + } + + #[test] + fn float_no_leading_digit() { + approx(float_endf(".12345"), 0.12345); + } + + #[test] + fn float_double_digit_exponent() { + approx(float_endf("6.022+23"), 6.022e23); + approx(float_endf("6.022-23"), 6.022e-23); + } + + #[test] + fn float_whitespace() { + approx(float_endf(" +1.01+ 2"), 101.0); + approx(float_endf(" -1.01- 2"), -0.0101); + approx(float_endf("+ 2 . 3+ 1"), 23.0); + approx(float_endf("-7 .8 -1"), -0.78); + } + + // 3.14 here is test data for the exponent marker, not an approximation of pi. + #[test] + #[allow(clippy::approx_constant)] + fn float_e_exponent() { + approx(float_endf("3.14e0"), 3.14); + approx(float_endf("3.14E0"), 3.14); + approx(float_endf("3.14e-1"), 0.314); + } + + #[test] + #[allow(clippy::approx_constant)] + fn float_d_exponent() { + approx(float_endf("3.14d0"), 3.14); + approx(float_endf("3.14D0"), 3.14); + approx(float_endf("3.14d-1"), 0.314); + } + + #[test] + fn float_only_leading_digit() { + approx(float_endf("1+2"), 100.0); + approx(float_endf("-1+2"), -100.0); + approx(float_endf("1.+2"), 100.0); + approx(float_endf("-1.+2"), -100.0); + } + + #[test] + fn float_empty() { + assert_eq!(float_endf(" "), 0.0); + assert_eq!(float_endf(""), 0.0); + } + + #[test] + fn float_buffer_size() { + // Only the first 11 characters are part of the field. + approx(float_endf("9.876540000000000"), 9.87654); + } + + #[test] + fn int_blank_is_zero() { + assert_eq!(int_endf(" "), 0); + assert_eq!(int_endf(" 145"), 145); + assert_eq!(int_endf(" -1"), -1); + } + + #[test] + fn field_tolerates_short_lines() { + assert_eq!(field("abc", 0, 11), "abc"); + assert_eq!(field("abc", 5, 11), ""); + } + + #[test] + fn reads_a_head_record() { + let text = " 9.524400+4 2.419680+2 0 1 0 29552 1451\n"; + let mut r = Reader::new(text); + let head = r.head_record().unwrap(); + assert_eq!(head.za, 95244); + approx(head.awr, 241.968); + assert_eq!(head.l2, 1); + assert_eq!(head.n2, 2); + assert!(r.is_empty()); + } + + #[test] + fn reads_a_tab1_record() { + let text = concat!( + " 0.000000+0 0.000000+0 0 0 1 3\n", + " 3 2\n", + " 1.000000+0 2.000000+0 3.000000+0 4.000000+0 5.000000+0 6.000000+0\n", + ); + let mut r = Reader::new(text); + let tab = r.tab1_record().unwrap(); + assert_eq!(tab.table.x, vec![1.0, 3.0, 5.0]); + assert_eq!(tab.table.y, vec![2.0, 4.0, 6.0]); + assert_eq!(tab.table.breakpoints, vec![3]); + assert_eq!(tab.table.interpolation, vec![2]); + } + + #[test] + fn running_off_the_end_is_an_error() { + let mut r = Reader::new(""); + assert!(r.cont_record().is_err()); + } +} diff --git a/crates/endf/src/spline.rs b/crates/endf/src/spline.rs new file mode 100644 index 0000000..54f89bb --- /dev/null +++ b/crates/endf/src/spline.rs @@ -0,0 +1,283 @@ +//! Not-a-knot cubic spline interpolation. +//! +//! The bremsstrahlung cross sections in `BREMX.DAT` are tabulated on 57 +//! electron energies and resampled onto a 200-point grid before use. The +//! Python package does that with `scipy.interpolate.CubicSpline`, whose +//! default boundary condition is **not-a-knot** — the first two segments at +//! each end are forced to be the same cubic. Natural or clamped boundaries +//! would give visibly different values near the ends of the grid, so the +//! condition matters and is not a detail. +//! +//! This is a direct transcription of what SciPy does, so the two agree to +//! within a few units in the last place. Verified against SciPy over the whole +//! of `BREMX.DAT` — 100 elements by 30 reduced photon energies by 200 sampled +//! energies — where the worst relative difference is 4.3e-16. +//! +//! Only what the photon data needs: one dependent variable, strictly +//! increasing abscissae, and evaluation that extrapolates with the end cubics +//! rather than clamping, as SciPy's does. + +use crate::error::{Error, Result}; + +/// A cubic spline through a set of points, as piecewise polynomial +/// coefficients. +/// +/// Segment `i` covers `x[i]..x[i + 1]` and is evaluated in the local +/// coordinate `x - x[i]`, highest order first, matching SciPy's `PPoly`. +#[derive(Debug, Clone, PartialEq)] +pub struct CubicSpline { + x: Vec, + /// `[c3, c2, c1, c0]` per segment: `c3*d^3 + c2*d^2 + c1*d + c0`. + coefficients: Vec<[f64; 4]>, +} + +impl CubicSpline { + /// Fit a not-a-knot cubic spline through `(x, y)`. + /// + /// `x` must be strictly increasing and the two slices the same length, + /// with at least two points. + pub fn new(x: &[f64], y: &[f64]) -> Result { + if x.len() != y.len() { + return Err(Error::Mismatched { + what: "the abscissae and ordinates of a cubic spline", + }); + } + if x.len() < 2 { + return Err(Error::Unsupported { + what: "a cubic spline through fewer than two points", + }); + } + if x.windows(2).any(|w| w[1] <= w[0]) { + return Err(Error::Unsupported { + what: "a cubic spline whose abscissae are not strictly increasing", + }); + } + + let n = x.len(); + let dx: Vec = x.windows(2).map(|w| w[1] - w[0]).collect(); + let slope: Vec = y + .windows(2) + .zip(&dx) + .map(|(w, d)| (w[1] - w[0]) / d) + .collect(); + + // The first derivative at each point. Everything else follows. + let s = match n { + // A single segment is the straight line through its two points; + // there is no room for a cubic. + 2 => vec![slope[0], slope[0]], + // Not-a-knot with three points means one parabola through all + // three, which is a 3x3 system rather than a banded one. + 3 => solve_three(&dx, &slope), + _ => solve_banded(x, &dx, &slope), + }; + + // SciPy's coefficients, in the same order, so the arithmetic below + // reproduces its rounding as well as its result. + let mut coefficients = Vec::with_capacity(n - 1); + for i in 0..n - 1 { + let t = (s[i] + s[i + 1] - 2.0 * slope[i]) / dx[i]; + coefficients.push([t / dx[i], (slope[i] - s[i]) / dx[i] - t, s[i], y[i]]); + } + Ok(CubicSpline { + x: x.to_vec(), + coefficients, + }) + } + + /// Evaluate at one point. + /// + /// Outside the fitted range the nearest end segment's cubic is continued, + /// which is what SciPy does by default. That is deliberate: clamping to + /// the end value would be a different function. + pub fn eval(&self, x: f64) -> f64 { + let i = self.segment(x); + let d = x - self.x[i]; + let [c3, c2, c1, c0] = self.coefficients[i]; + ((c3 * d + c2) * d + c1) * d + c0 + } + + /// Evaluate at every point of a grid. + pub fn eval_all(&self, xs: &[f64]) -> Vec { + xs.iter().map(|&x| self.eval(x)).collect() + } + + /// The segment whose cubic applies at `x`. + fn segment(&self, x: f64) -> usize { + // The last index whose abscissa does not exceed `x`, clamped to a real + // segment so that both tails extrapolate. + match self.x.partition_point(|&xi| xi <= x) { + 0 => 0, + i => (i - 1).min(self.coefficients.len() - 1), + } + } +} + +/// The three-point case: one parabola through all three points. +fn solve_three(dx: &[f64], slope: &[f64]) -> Vec { + // s0 + s1 = 2*slope0 + // dx1*s0 + 2*(dx0+dx1)*s1 + dx0*s2 = 3*(dx0*slope1 + dx1*slope0) + // s1 + s2 = 2*slope1 + // + // Substituting the outer two into the middle leaves one unknown. + let (d0, d1) = (dx[0], dx[1]); + let (m0, m1) = (slope[0], slope[1]); + let rhs = 3.0 * (d0 * m1 + d1 * m0) - d1 * 2.0 * m0 - d0 * 2.0 * m1; + let s1 = rhs / (2.0 * (d0 + d1) - d1 - d0); + vec![2.0 * m0 - s1, s1, 2.0 * m1 - s1] +} + +/// The general case: a tridiagonal system solved by the Thomas algorithm. +/// +/// SciPy uses LAPACK's banded solver, which pivots; this does not. The two +/// agree to the last bit or two on the data this crate reads, because the +/// interior rows are strictly diagonally dominant and only the two not-a-knot +/// boundary rows are not. +fn solve_banded(x: &[f64], dx: &[f64], slope: &[f64]) -> Vec { + let n = x.len(); + let mut lower = vec![0.0; n]; + let mut diagonal = vec![0.0; n]; + let mut upper = vec![0.0; n]; + let mut rhs = vec![0.0; n]; + + for i in 1..n - 1 { + diagonal[i] = 2.0 * (dx[i - 1] + dx[i]); + upper[i] = dx[i - 1]; + lower[i] = dx[i]; + rhs[i] = 3.0 * (dx[i] * slope[i - 1] + dx[i - 1] * slope[i]); + } + + // Not-a-knot at the low end: the third derivative is continuous across + // the second point, which makes the first two segments one cubic. + let d = x[2] - x[0]; + diagonal[0] = dx[1]; + upper[0] = d; + rhs[0] = ((dx[0] + 2.0 * d) * dx[1] * slope[0] + dx[0] * dx[0] * slope[1]) / d; + + // And the same at the high end. + let d = x[n - 1] - x[n - 3]; + diagonal[n - 1] = dx[n - 3]; + lower[n - 1] = d; + rhs[n - 1] = (dx[n - 2] * dx[n - 2] * slope[n - 3] + + (2.0 * d + dx[n - 2]) * dx[n - 3] * slope[n - 2]) + / d; + + // Thomas: forward sweep, then back substitution. + let mut c = vec![0.0; n]; + let mut e = vec![0.0; n]; + c[0] = upper[0] / diagonal[0]; + e[0] = rhs[0] / diagonal[0]; + for i in 1..n { + let m = diagonal[i] - lower[i] * c[i - 1]; + if i < n - 1 { + c[i] = upper[i] / m; + } + e[i] = (rhs[i] - lower[i] * e[i - 1]) / m; + } + let mut s = vec![0.0; n]; + s[n - 1] = e[n - 1]; + for i in (0..n - 1).rev() { + s[i] = e[i] - c[i] * s[i + 1]; + } + s +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Reference values from `scipy.interpolate.CubicSpline`, which is what + /// the Python package uses. Generated with, and reproducible by: + /// + /// ```text + /// from scipy.interpolate import CubicSpline + /// CubicSpline([0.0, 0.5, 2.0, 3.0], [1.0, 2.5, 0.5, 3.0])(q) + /// ``` + #[test] + fn matches_scipy_on_a_four_point_fit() { + let x = [0.0, 0.5, 2.0, 3.0]; + let y = [1.0, 2.5, 0.5, 3.0]; + let spline = CubicSpline::new(&x, &y).unwrap(); + + // Including two points outside the range, since SciPy extrapolates + // with the end cubics rather than clamping. + let q = [-0.5, 0.0, 0.25, 0.5, 1.25, 2.0, 2.5, 3.0, 3.5]; + let expected = [ + -3.125, 1.0, 2.0203125, 2.5, 1.8515625, 0.5, 0.75, 3.0, 8.175, + ]; + for (&qi, &want) in q.iter().zip(&expected) { + let got = spline.eval(qi); + assert!( + (got - want).abs() <= 1e-12 * want.abs().max(1.0), + "at x={qi}: got {got}, want {want}" + ); + } + } + + /// The knots are reproduced exactly: a spline interpolates. + #[test] + fn passes_through_every_point() { + let x = [1.0, 2.0, 4.0, 8.0, 16.0, 32.0]; + let y = [0.5, 1.5, 1.0, 3.0, 2.0, 2.5]; + let spline = CubicSpline::new(&x, &y).unwrap(); + for (&xi, &yi) in x.iter().zip(&y) { + assert_eq!( + spline.eval(xi), + yi, + "the spline must pass through ({xi}, {yi})" + ); + } + } + + /// A cubic is reproduced exactly, which not-a-knot guarantees and the + /// natural boundary condition does not — so this fails if the boundary + /// rows are wrong. + #[test] + fn reproduces_a_cubic_exactly() { + let f = |x: f64| 2.0 * x * x * x - 3.0 * x * x + x - 5.0; + let x: Vec = (0..8).map(|i| i as f64 * 0.37).collect(); + let y: Vec = x.iter().map(|&xi| f(xi)).collect(); + let spline = CubicSpline::new(&x, &y).unwrap(); + + for i in 0..60 { + let q = -0.4 + i as f64 * 0.05; + let (got, want) = (spline.eval(q), f(q)); + assert!( + (got - want).abs() <= 1e-10 * want.abs().max(1.0), + "at x={q}: got {got}, want {want}" + ); + } + } + + #[test] + fn two_points_give_the_line_through_them() { + let spline = CubicSpline::new(&[0.0, 2.0], &[1.0, 5.0]).unwrap(); + assert_eq!(spline.eval(0.0), 1.0); + assert_eq!(spline.eval(1.0), 3.0); + assert_eq!(spline.eval(2.0), 5.0); + // Extrapolation continues the line. + assert_eq!(spline.eval(3.0), 7.0); + } + + /// Three points with not-a-knot are one parabola, which is exact. + #[test] + fn three_points_give_the_parabola_through_them() { + let f = |x: f64| 1.5 * x * x - 2.0 * x + 0.25; + let x = [0.0, 1.0, 3.0]; + let y = [f(x[0]), f(x[1]), f(x[2])]; + let spline = CubicSpline::new(&x, &y).unwrap(); + for i in 0..20 { + let q = -1.0 + i as f64 * 0.3; + assert!((spline.eval(q) - f(q)).abs() < 1e-12, "at x={q}"); + } + } + + #[test] + fn bad_input_is_refused() { + assert!(CubicSpline::new(&[0.0, 1.0], &[1.0]).is_err()); + assert!(CubicSpline::new(&[0.0], &[1.0]).is_err()); + // Not strictly increasing. + assert!(CubicSpline::new(&[0.0, 1.0, 1.0], &[1.0, 2.0, 3.0]).is_err()); + assert!(CubicSpline::new(&[0.0, 2.0, 1.0], &[1.0, 2.0, 3.0]).is_err()); + } +} diff --git a/crates/endf/src/testdata.rs b/crates/endf/src/testdata.rs new file mode 100644 index 0000000..fd8dd10 --- /dev/null +++ b/crates/endf/src/testdata.rs @@ -0,0 +1,24 @@ +//! Reading the compressed fixtures, for the unit tests. +//! +//! The fixtures in `tests/` are stored xz-compressed: an evaluation is highly +//! repetitive and compresses about six to one, and the ACE table alone is +//! 1.8 MB uncompressed. They are embedded with `include_bytes!` as before and +//! decompressed on first use, so a test still needs no working directory. +//! +//! Compiled only for tests, so the decompressor is a dev-dependency and no +//! consumer of this crate pays for it. + +/// Decompress an embedded fixture to the text the readers take. +pub fn text(compressed: &[u8]) -> String { + let mut out = Vec::new(); + lzma_rs::xz_decompress(&mut { compressed }, &mut out).expect("fixture is valid xz"); + String::from_utf8(out).expect("fixture is valid UTF-8") +} + +/// The ACE tables of an embedded fixture. +pub fn ace_tables(compressed: &[u8]) -> Vec { + crate::ace::tables_from_str(&text(compressed), None).expect("fixture parses") +} + +/// The Li6 ACE table, which several modules test against. +pub const LI6_ACE: &[u8] = include_bytes!("../../../tests/Li6.ace.xz"); diff --git a/crates/endf/src/univariate.rs b/crates/endf/src/univariate.rs new file mode 100644 index 0000000..e04bb6e --- /dev/null +++ b/crates/endf/src/univariate.rs @@ -0,0 +1,560 @@ +//! Univariate probability distributions. +//! +//! The primitives the distribution readers are built from: a set of discrete +//! values with probabilities, a tabulated density, a uniform range, and a +//! weighted mixture of any of those. +//! +//! XML serialisation is deliberately absent. The Python module reads and writes +//! these as OpenMC XML elements; adding that here would mean an XML dependency +//! in a crate that has none, for a format the Arrow path never touches. + +use crate::error::{Error, Result}; + +/// How a [`Tabular`] density is interpolated between its points. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum Interpolation { + Histogram, + #[default] + LinearLinear, + LinearLog, + LogLinear, + LogLog, +} + +impl Interpolation { + /// The name the Python package uses, e.g. `"linear-linear"`. + pub fn name(self) -> &'static str { + match self { + Interpolation::Histogram => "histogram", + Interpolation::LinearLinear => "linear-linear", + Interpolation::LinearLog => "linear-log", + Interpolation::LogLinear => "log-linear", + Interpolation::LogLog => "log-log", + } + } + + pub fn from_name(name: &str) -> Result { + Ok(match name { + "histogram" => Interpolation::Histogram, + "linear-linear" => Interpolation::LinearLinear, + "linear-log" => Interpolation::LinearLog, + "log-linear" => Interpolation::LogLinear, + "log-log" => Interpolation::LogLog, + _ => { + return Err(Error::BadInterpolation { + name: name.to_string(), + }) + } + }) + } + + /// The ENDF interpolation code, as TAB1 records number them. + pub fn from_endf_code(code: i32) -> Result { + Ok(match code { + 1 => Interpolation::Histogram, + 2 => Interpolation::LinearLinear, + 3 => Interpolation::LinearLog, + 4 => Interpolation::LogLinear, + 5 => Interpolation::LogLog, + _ => { + return Err(Error::BadInterpolation { + name: code.to_string(), + }) + } + }) + } +} + +/// `(exp(x) - 1) / x`, without the cancellation that spoils it near zero. +fn exprel(x: f64) -> f64 { + if x.abs() < 1e-16 { + 1.0 + } else { + x.exp_m1() / x + } +} + +/// A distribution over a finite set of values. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Discrete { + pub x: Vec, + pub p: Vec, + /// The cumulative distribution as the source file gave it. + /// + /// ACE tables store a CDF next to the density; it is kept verbatim rather + /// than recomputed so the values round-trip exactly. [`Self::cdf`] is the + /// computed equivalent, and the two need not agree bit for bit. `None` + /// when the source format supplied no CDF. + pub c: Option>, +} + +impl Discrete { + pub fn new(x: Vec, p: Vec) -> Discrete { + Discrete { x, p, c: None } + } + + pub fn len(&self) -> usize { + self.x.len() + } + + pub fn is_empty(&self) -> bool { + self.x.is_empty() + } + + /// The cumulative distribution, opening with a zero, so it is one longer + /// than `p`. + pub fn cdf(&self) -> Vec { + let mut out = Vec::with_capacity(self.p.len() + 1); + out.push(0.0); + let mut running = 0.0; + for &v in &self.p { + running += v; + out.push(running); + } + out + } + + pub fn integral(&self) -> f64 { + self.p.iter().sum() + } + + pub fn normalize(&mut self) { + let total: f64 = self.p.iter().sum(); + for v in &mut self.p { + *v /= total; + } + } + + /// Combine several discrete distributions, weighting each by a probability. + /// + /// A value appearing in more than one becomes a single entry whose + /// probability is the weighted sum. The result is sorted by value. + pub fn merge(dists: &[Discrete], probs: &[f64]) -> Result { + if dists.len() != probs.len() { + return Err(Error::Mismatched { + what: "number of distributions and probabilities", + }); + } + // Values are floats, so they are collected by bit pattern rather than + // through a hash map, and sorted afterwards. + let mut merged: Vec<(f64, f64)> = Vec::new(); + for (dist, &weight) in dists.iter().zip(probs) { + for (&x, &p) in dist.x.iter().zip(&dist.p) { + match merged.iter_mut().find(|(v, _)| *v == x) { + Some((_, total)) => *total += p * weight, + None => merged.push((x, p * weight)), + } + } + } + merged.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap_or(std::cmp::Ordering::Equal)); + Ok(Discrete { + x: merged.iter().map(|&(v, _)| v).collect(), + p: merged.iter().map(|&(_, p)| p).collect(), + c: None, + }) + } +} + +/// A tabulated probability density. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Tabular { + pub x: Vec, + pub p: Vec, + pub interpolation: Interpolation, + /// The cumulative distribution as the source file gave it; see + /// [`Discrete::c`]. + pub c: Option>, +} + +impl Tabular { + pub fn new(x: Vec, p: Vec, interpolation: Interpolation) -> Tabular { + Tabular { + x, + p, + interpolation, + c: None, + } + } + + /// The same, with the CDF the source file supplied alongside the density. + pub fn with_cdf( + x: Vec, + p: Vec, + interpolation: Interpolation, + c: Vec, + ) -> Tabular { + Tabular { + x, + p, + interpolation, + c: Some(c), + } + } + + pub fn len(&self) -> usize { + self.p.len() + } + + pub fn is_empty(&self) -> bool { + self.p.is_empty() + } + + /// The cumulative distribution at each tabulated point. + /// + /// Integrated analytically per interpolation law rather than numerically, + /// so the result is exact for the density the table describes. + pub fn cdf(&self) -> Vec { + let n = self.x.len(); + let mut c = vec![0.0; n]; + if n < 2 { + return c; + } + let (x, p) = (&self.x, &self.p); + + for i in 0..n - 1 { + let dx = x[i + 1] - x[i]; + // The logs are subtracted rather than taken of a ratio. The two + // are equal in exact arithmetic and not in floating point, and the + // Python does it this way — `np.diff(np.log(x))`, not + // `np.log(x[1:] / x[:-1])` — so matching it keeps the two readers + // bit-identical rather than merely close. + let dlog_x = || x[i + 1].ln() - x[i].ln(); + c[i + 1] = match self.interpolation { + Interpolation::Histogram => p[i] * dx, + Interpolation::LinearLinear => 0.5 * (p[i] + p[i + 1]) * dx, + Interpolation::LinearLog => { + let dlog = dlog_x(); + let m = (p[i + 1] - p[i]) / dlog; + p[i] * dx + m * (x[i + 1] * (dlog - 1.0) + x[i]) + } + Interpolation::LogLinear => { + let m = (p[i + 1].ln() - p[i].ln()) / dx; + p[i] * dx * exprel(m * dx) + } + Interpolation::LogLog => { + let dlog = dlog_x(); + let m = ((x[i + 1] * p[i + 1]).ln() - (x[i] * p[i]).ln()) / dlog; + x[i] * p[i] * dlog * exprel(m * dlog) + } + }; + } + + // Accumulate in place, as the Python does with cumsum. + for i in 1..n { + c[i] += c[i - 1]; + } + c + } + + pub fn integral(&self) -> f64 { + self.cdf().last().copied().unwrap_or(0.0) + } + + pub fn normalize(&mut self) { + let max = self + .cdf() + .into_iter() + .fold(f64::NEG_INFINITY, |a, b| if b > a { b } else { a }); + for v in &mut self.p { + *v /= max; + } + } +} + +/// A uniform distribution over `[a, b]`. +#[derive(Debug, Clone, PartialEq)] +pub struct Uniform { + pub a: f64, + pub b: f64, +} + +impl Default for Uniform { + fn default() -> Self { + Uniform { a: 0.0, b: 1.0 } + } +} + +impl Uniform { + pub fn new(a: f64, b: f64) -> Uniform { + Uniform { a, b } + } + + /// The same distribution written as a two-point tabulation. + pub fn to_tabular(&self) -> Tabular { + let p = 1.0 / (self.b - self.a); + Tabular::with_cdf( + vec![self.a, self.b], + vec![p, p], + Interpolation::Histogram, + vec![0.0, 1.0], + ) + } + + pub fn cdf(&self) -> Vec { + vec![0.0, 1.0] + } + + pub fn integral(&self) -> f64 { + 1.0 + } +} + +/// Any one of the univariate distributions. +#[derive(Debug, Clone, PartialEq)] +pub enum Univariate { + Discrete(Discrete), + Tabular(Tabular), + Uniform(Uniform), + Mixture(Mixture), +} + +impl Univariate { + pub fn integral(&self) -> f64 { + match self { + Univariate::Discrete(d) => d.integral(), + Univariate::Tabular(t) => t.integral(), + Univariate::Uniform(u) => u.integral(), + Univariate::Mixture(m) => m.integral(), + } + } + + pub fn len(&self) -> usize { + match self { + Univariate::Discrete(d) => d.len(), + Univariate::Tabular(t) => t.len(), + Univariate::Uniform(_) => 2, + Univariate::Mixture(m) => m.distribution.iter().map(|d| d.len()).sum(), + } + } + + pub fn is_empty(&self) -> bool { + self.len() == 0 + } +} + +/// A weighted mixture of other distributions. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Mixture { + pub probability: Vec, + pub distribution: Vec, +} + +impl Mixture { + pub fn new(probability: Vec, distribution: Vec) -> Mixture { + Mixture { + probability, + distribution, + } + } + + /// A mixture has no single tabulated CDF; take each component's instead. + pub fn integral(&self) -> f64 { + self.probability + .iter() + .zip(&self.distribution) + .map(|(&p, d)| p * d.integral()) + .sum() + } + + pub fn normalize(&mut self) { + let total: f64 = self.probability.iter().sum(); + for v in &mut self.probability { + *v /= total; + } + } +} + +/// Combine distributions, each weighted by a probability or an intensity. +/// +/// Several [`Discrete`] distributions merge into one; the rest go into a +/// [`Mixture`]. A `Mixture` in the input is flattened first, so the result is +/// never nested. +/// +/// [`Uniform`] is not accepted: the Python reader type-checks it out, and +/// nothing produces one here. It is folded into a [`Tabular`] by +/// [`Uniform::to_tabular`] if a caller needs it combined. +pub fn combine_distributions(dists: &[Univariate], probs: &[f64]) -> Result { + if dists.len() != probs.len() { + return Err(Error::Mismatched { + what: "number of distributions and probabilities", + }); + } + + // Flatten any mixture, scaling its components by its own weight. + let mut flat: Vec<(f64, &Univariate)> = Vec::new(); + for (dist, &prob) in dists.iter().zip(probs) { + match dist { + Univariate::Mixture(m) => { + for (&p, d) in m.probability.iter().zip(&m.distribution) { + flat.push((prob * p, d)); + } + } + _ => flat.push((prob, dist)), + } + } + + let mut discrete: Vec = Vec::new(); + let mut discrete_probs: Vec = Vec::new(); + let mut continuous: Vec = Vec::new(); + let mut continuous_probs: Vec = Vec::new(); + for (prob, dist) in flat { + match dist { + Univariate::Discrete(d) => { + discrete.push(d.clone()); + discrete_probs.push(prob); + } + Univariate::Tabular(_) => { + continuous.push(dist.clone()); + continuous_probs.push(prob); + } + other => { + return Err(Error::Unsupported { + what: match other { + Univariate::Uniform(_) => "combining a uniform distribution", + _ => "combining a nested mixture", + }, + }) + } + } + } + + if !discrete.is_empty() { + let merged = Univariate::Discrete(Discrete::merge(&discrete, &discrete_probs)?); + if continuous.is_empty() { + return Ok(merged); + } + // The merged discrete distribution already carries its weights, so it + // enters the mixture with a probability of one. + continuous_probs.push(1.0); + continuous.push(merged); + return Ok(Univariate::Mixture(Mixture::new( + continuous_probs, + continuous, + ))); + } + + if continuous.len() == 1 { + let Univariate::Tabular(t) = &continuous[0] else { + unreachable!("only tabular distributions reach here"); + }; + let mut scaled = t.clone(); + for v in &mut scaled.p { + *v *= continuous_probs[0]; + } + return Ok(Univariate::Tabular(scaled)); + } + + Ok(Univariate::Mixture(Mixture::new( + continuous_probs, + continuous, + ))) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn discrete_accumulates_and_normalises() { + let mut d = Discrete::new(vec![1.0, 2.0, 3.0], vec![1.0, 2.0, 1.0]); + assert_eq!(d.cdf(), vec![0.0, 1.0, 3.0, 4.0]); + assert_eq!(d.integral(), 4.0); + d.normalize(); + assert_eq!(d.p, vec![0.25, 0.5, 0.25]); + assert_eq!(d.integral(), 1.0); + } + + #[test] + fn discrete_merge_combines_shared_values() { + let a = Discrete::new(vec![1.0, 2.0], vec![0.5, 0.5]); + let b = Discrete::new(vec![2.0, 3.0], vec![1.0, 1.0]); + // Weighted by 1.0 and 2.0: the shared value 2.0 gets 0.5 + 2.0. + let m = Discrete::merge(&[a, b], &[1.0, 2.0]).unwrap(); + assert_eq!(m.x, vec![1.0, 2.0, 3.0]); + assert_eq!(m.p, vec![0.5, 2.5, 2.0]); + } + + #[test] + fn merge_rejects_mismatched_lengths() { + let a = Discrete::new(vec![1.0], vec![1.0]); + assert!(Discrete::merge(&[a], &[1.0, 2.0]).is_err()); + } + + #[test] + fn tabular_integrates_each_law_exactly() { + // A flat density of 0.5 over [0, 2] integrates to 1 under histogram + // and linear-linear alike. + let x = vec![0.0, 1.0, 2.0]; + let p = vec![0.5, 0.5, 0.5]; + for law in [Interpolation::Histogram, Interpolation::LinearLinear] { + let t = Tabular::new(x.clone(), p.clone(), law); + assert!((t.integral() - 1.0).abs() < 1e-12, "{}", law.name()); + } + + // A straight line from 0 to 2 over [0, 2] has area 2 under + // linear-linear, which the trapezoid rule gets exactly. + let t = Tabular::new( + vec![0.0, 1.0, 2.0], + vec![0.0, 1.0, 2.0], + Interpolation::LinearLinear, + ); + assert!((t.integral() - 2.0).abs() < 1e-12); + assert_eq!(t.cdf(), vec![0.0, 0.5, 2.0]); + } + + #[test] + fn tabular_normalises_to_unit_area() { + let mut t = Tabular::new( + vec![0.0, 1.0, 2.0], + vec![1.0, 1.0, 1.0], + Interpolation::LinearLinear, + ); + t.normalize(); + assert!((t.integral() - 1.0).abs() < 1e-12); + } + + #[test] + fn exprel_is_stable_at_zero() { + // The naive (exp(x)-1)/x is 0/0 here; the limit is 1. + assert_eq!(exprel(0.0), 1.0); + assert!((exprel(1e-20) - 1.0).abs() < 1e-15); + // And agrees with the naive form away from zero. + assert!((exprel(2.0) - (2.0f64.exp() - 1.0) / 2.0).abs() < 1e-12); + } + + #[test] + fn uniform_becomes_a_flat_table() { + let u = Uniform::new(-1.0, 1.0); + let t = u.to_tabular(); + assert_eq!(t.x, vec![-1.0, 1.0]); + assert_eq!(t.p, vec![0.5, 0.5]); + assert_eq!(u.integral(), 1.0); + } + + #[test] + fn mixture_weights_its_components() { + let a = Univariate::Discrete(Discrete::new(vec![1.0], vec![1.0])); + let b = Univariate::Discrete(Discrete::new(vec![2.0], vec![3.0])); + let mut m = Mixture::new(vec![0.25, 0.75], vec![a, b]); + assert_eq!(m.integral(), 0.25 * 1.0 + 0.75 * 3.0); + m.normalize(); + assert_eq!(m.probability, vec![0.25, 0.75]); + } + + #[test] + fn interpolation_names_and_endf_codes_agree() { + for (code, name) in [ + (1, "histogram"), + (2, "linear-linear"), + (3, "linear-log"), + (4, "log-linear"), + (5, "log-log"), + ] { + let by_code = Interpolation::from_endf_code(code).unwrap(); + assert_eq!(by_code.name(), name); + assert_eq!(Interpolation::from_name(name).unwrap(), by_code); + } + assert!(Interpolation::from_endf_code(9).is_err()); + assert!(Interpolation::from_name("bilinear").is_err()); + } +} diff --git a/crates/endf/src/urr.rs b/crates/endf/src/urr.rs new file mode 100644 index 0000000..ae5aac7 --- /dev/null +++ b/crates/endf/src/urr.rs @@ -0,0 +1,138 @@ +//! Unresolved resonance region probability tables. +//! +//! In the unresolved region the individual resonances are not resolved, so the +//! cross section is described statistically: at each energy a set of +//! equiprobable bands is given and one is sampled. +//! +//! Read from an ACE table rather than from ENDF. The ENDF form is MF=2 with +//! LRU=2, which [`crate::mf::mf2`] handles; this is the processed form NJOY +//! writes, and the one a transport code samples. + +use crate::ace::Table; +use crate::data::EV_PER_MEV; + +/// Which quantity each row of a probability table holds. +/// +/// The second axis of [`ProbabilityTables::table`] is indexed by these. +pub const BAND_QUANTITIES: [&str; 6] = [ + "cumulative probability", + "total", + "elastic", + "fission", + "capture", + "heating", +]; + +/// Probability tables for the unresolved resonance region. +#[derive(Debug, Clone, PartialEq)] +pub struct ProbabilityTables { + /// Energies in eV at which tables exist. + pub energy: Vec, + /// The tables, flattened from `(n_energy, 6, n_band)` in C order. + /// + /// Kept flat with an explicit shape because that is how the converted data + /// stores it, and reshaping twice helps nobody. + pub table: Vec, + /// `[n_energy, 6, n_band]`. + pub shape: [usize; 3], + /// 2 for lin-lin, 5 for log-log. + pub interpolation: i64, + /// Below zero, the inelastic cross section is zero across the unresolved + /// range. Above zero, the MT whose cross section to use there. + pub inelastic_flag: i64, + /// The same, for the other absorption cross section. + pub absorption_flag: i64, + /// Whether the values are cross sections (false) or factors multiplying + /// the smooth background (true). + pub multiply_smooth: bool, +} + +impl ProbabilityTables { + /// Number of energies at which tables are given. + pub fn n_energy(&self) -> usize { + self.shape[0] + } + + /// Number of equiprobable bands. + pub fn n_band(&self) -> usize { + self.shape[2] + } + + /// One value, by energy index, quantity index and band index. + pub fn get(&self, energy: usize, quantity: usize, band: usize) -> Option { + let [_, n_q, n_b] = self.shape; + if energy >= self.shape[0] || quantity >= n_q || band >= n_b { + return None; + } + self.table + .get((energy * n_q + quantity) * n_b + band) + .copied() + } + + /// Read the probability tables from an ACE table. + /// + /// `None` when the table has no unresolved region, which is the usual case + /// for a light nuclide. + pub fn from_ace(table: &Table) -> Option { + // JXS(23) locates the URR block, and is zero when there is none. + let start = *table.jxs.get(23)?; + if start <= 0 { + return None; + } + let xss = &table.xss; + let at = |i: i64| -> Option { xss.get(usize::try_from(i).ok()?).copied() }; + + let n_energy = at(start)? as usize; + let n_band = at(start + 1)? as usize; + let interpolation = at(start + 2)? as i64; + let inelastic_flag = at(start + 3)? as i64; + let absorption_flag = at(start + 4)? as i64; + let multiply_smooth = at(start + 5)? as i64 == 1; + + let mut idx = start + 6; + // The file stores energies in MeV. + let mut energy = Vec::with_capacity(n_energy); + for i in 0..n_energy { + energy.push(at(idx + i as i64)? * EV_PER_MEV); + } + idx += n_energy as i64; + + let count = n_energy * 6 * n_band; + let mut values = Vec::with_capacity(count); + for i in 0..count { + values.push(at(idx + i as i64)?); + } + + // Row 5 of each energy's block is the heating number, also in MeV. + for e in 0..n_energy { + for b in 0..n_band { + let i = (e * 6 + 5) * n_band + b; + values[i] *= EV_PER_MEV; + } + } + + Some(ProbabilityTables { + energy, + table: values, + shape: [n_energy, 6, n_band], + interpolation, + inelastic_flag, + absorption_flag, + multiply_smooth, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_light_nuclide_has_no_unresolved_region() { + // Li6 has no URR: JXS(23) is zero, and the reader says so rather than + // reading whatever happens to sit at index zero. + let tables = crate::testdata::ace_tables(crate::testdata::LI6_ACE); + assert_eq!(tables[0].jxs[23], 0); + assert!(ProbabilityTables::from_ace(&tables[0]).is_none()); + } +} diff --git a/crates/endf/tests/golden.rs b/crates/endf/tests/golden.rs new file mode 100644 index 0000000..add6135 --- /dev/null +++ b/crates/endf/tests/golden.rs @@ -0,0 +1,2485 @@ +//! Hold the Rust reader to what the Python reader produces. +//! +//! Every file in `tests/golden/` is a reference dump written by +//! `tools/dump_golden.py`. This test finds each one, reads the ENDF file it +//! names, builds the same `path -> value` map from its own parse, and compares +//! the two maps whole. +//! +//! Comparing maps rather than walking records is what makes this scale to the +//! whole package: a field that is renamed, dropped or added shows up as a path +//! on one side and not the other, without the test needing to know what the +//! field was for. +//! +//! Values are compared exactly. The dump records the shortest round-tripping +//! decimal and both readers parse decimals with correct rounding, so any +//! difference is a real one. The single exception is `…/evaly`, the sampled +//! interpolation, where the two languages evaluate the same expression through +//! their own `ln` and `exp`. + +use std::collections::{BTreeMap, BTreeSet}; +use std::path::{Path, PathBuf}; + +use endf::ace; +use endf::mf::atomic::ElectroAtomicDistribution; +use endf::mf::covariance::Mf33Subsection; +use endf::mf::mf1::{FissionEnergyRelease, Nu, FISSION_ENERGY_COMPONENTS}; +use endf::mf::mf2::{ResonanceParameters, UnresolvedParameters}; +use endf::mf::mf4::{AngleAtEnergy, AngleDistribution}; +use endf::mf::mf5::EnergyDistribution; +use endf::mf::mf6::Distribution as Mf6Distribution; +use endf::univariate::Univariate; +use endf::AngleEnergy; +use endf::{materials_from_str, Material, Section, Tabulated1D, Tabulated2D}; + +/// Read a file, decompressing it when the name says it is compressed. +/// +/// Both the fixtures and the golden dumps are stored xz-compressed: an +/// evaluation is highly repetitive and compresses about six to one, and the +/// dumps about seven. `lzma-rs` is a dev-dependency, so nothing that uses the +/// crate pays for it. +fn read_text(path: &Path) -> String { + let raw = std::fs::read(path).unwrap_or_else(|e| panic!("reading {}: {e}", path.display())); + if path.extension().is_some_and(|e| e == "xz") { + let mut out = Vec::new(); + lzma_rs::xz_decompress(&mut raw.as_slice(), &mut out) + .unwrap_or_else(|e| panic!("decompressing {}: {e}", path.display())); + return String::from_utf8(out) + .unwrap_or_else(|e| panic!("{} is not UTF-8: {e}", path.display())); + } + String::from_utf8(raw).unwrap_or_else(|e| panic!("{} is not UTF-8: {e}", path.display())) +} + +/// Whether a path names a fixture of the given format, `.xz` or not. +fn has_kind(path: &Path, kind: &str) -> bool { + let name = path.file_name().unwrap_or_default().to_string_lossy(); + let name = name.strip_suffix(".xz").unwrap_or(&name); + std::path::Path::new(name) + .extension() + .is_some_and(|e| e == kind) +} + +/// Mirrors `MAX_SAMPLES` in `tools/dump_golden.py`. +const MAX_SAMPLES: usize = 24; + +/// Relative tolerance for sampled interpolation. Everything else is exact. +const EVAL_TOL: f64 = 1e-12; + +#[derive(Debug, Clone, PartialEq)] +enum Value { + Floats(Vec), + Ints(Vec), + Text(String), +} + +impl Value { + fn kind(&self) -> &'static str { + match self { + Value::Floats(_) => "F", + Value::Ints(_) => "I", + Value::Text(_) => "T", + } + } +} + +#[derive(Default)] +struct Dump { + map: BTreeMap, +} + +impl Dump { + fn put(&mut self, path: String, value: Value) { + if let Some(old) = self.map.insert(path.clone(), value) { + panic!("the Rust dump wrote {path} twice (previously {old:?})"); + } + } + + fn floats(&mut self, path: String, values: Vec) { + self.put(path, Value::Floats(values)); + } + + fn float(&mut self, path: String, value: f64) { + self.put(path, Value::Floats(vec![value])); + } + + fn ints(&mut self, path: String, values: Vec) { + self.put(path, Value::Ints(values)); + } + + fn int(&mut self, path: String, value: i64) { + self.put(path, Value::Ints(vec![value])); + } + + fn text(&mut self, path: String, value: &str) { + self.put(path, Value::Text(value.to_string())); + } + + fn tab1(&mut self, path: &str, t: &Tabulated1D) { + self.floats(format!("{path}/x"), t.x.clone()); + self.floats(format!("{path}/y"), t.y.clone()); + self.ints( + format!("{path}/bp"), + t.breakpoints.iter().map(|&v| v as i64).collect(), + ); + self.ints( + format!("{path}/int"), + t.interpolation.iter().map(|&v| v as i64).collect(), + ); + let points = sample_points(t); + if !points.is_empty() { + let values = points.iter().map(|&p| t.eval(p)).collect(); + self.floats(format!("{path}/evalx"), points); + self.floats(format!("{path}/evaly"), values); + } + } + + fn tab2(&mut self, path: &str, t: &Tabulated2D) { + self.ints( + format!("{path}/bp"), + t.breakpoints.iter().map(|&v| v as i64).collect(), + ); + self.ints( + format!("{path}/int"), + t.interpolation.iter().map(|&v| v as i64).collect(), + ); + } +} + +/// Mirrors `sample_points` in `tools/dump_golden.py`, index for index. The +/// arithmetic is the same in both languages, so the abscissae come out +/// bit-identical and only the ordinates need a tolerance. +fn sample_points(t: &Tabulated1D) -> Vec { + let x = &t.x; + if x.len() < 2 { + return x.clone(); + } + let n_bins = x.len() - 1; + + let mut wanted: BTreeSet = BTreeSet::new(); + for &b in &t.breakpoints { + for i in [b as i64 - 2, b as i64 - 1] { + if i >= 0 && (i as usize) < n_bins { + wanted.insert(i as usize); + } + } + } + let step = (n_bins / MAX_SAMPLES).max(1); + wanted.extend((0..n_bins).step_by(step)); + + let mut points = Vec::with_capacity(wanted.len() + 4); + points.push(x[0] * 0.5); + points.push(x[0]); + points.extend(wanted.iter().map(|&i| 0.5 * (x[i] + x[i + 1]))); + points.push(x[x.len() - 1]); + points.push(x[x.len() - 1] * 2.0); + points +} + +// -------------------------------------------------------------------------- +// One dumper per ENDF file, mirroring tools/dump_golden.py. +// -------------------------------------------------------------------------- + +fn dump_nu(d: &mut Dump, path: &str, nu: &Nu) { + match nu { + Nu::Polynomial(c) => d.floats(format!("{path}/poly"), c.clone()), + Nu::Tabulated(t) => d.tab1(&format!("{path}/tab"), t), + Nu::Absent => {} + } +} + +fn dump_mf2_parameters(d: &mut Dump, rp: &str, p: &ResonanceParameters) { + match p { + ResonanceParameters::ScatteringRadius { spi, ap, nls } => { + d.float(format!("{rp}/SPI"), *spi); + d.float(format!("{rp}/AP"), *ap); + d.int(format!("{rp}/NLS"), *nls); + } + ResonanceParameters::BreitWigner(b) => { + if let Some(ape) = &b.ape { + d.tab1(&format!("{rp}/APE"), ape); + } + d.float(format!("{rp}/SPI"), b.spi); + d.float(format!("{rp}/AP"), b.ap); + d.int(format!("{rp}/NLS"), b.nls); + for (i, s) in b.sections.iter().enumerate() { + let sp = format!("{rp}/sections/{i}"); + d.float(format!("{sp}/AWRI"), s.awri); + d.float(format!("{sp}/QX"), s.qx); + d.int(format!("{sp}/L"), s.l); + d.int(format!("{sp}/LRX"), s.lrx); + d.int(format!("{sp}/NRS"), s.nrs); + d.floats(format!("{sp}/ER"), s.er.clone()); + d.floats(format!("{sp}/AJ"), s.aj.clone()); + d.floats(format!("{sp}/GT"), s.gt.clone()); + d.floats(format!("{sp}/GN"), s.gn.clone()); + d.floats(format!("{sp}/GG"), s.gg.clone()); + d.floats(format!("{sp}/GF"), s.gf.clone()); + } + } + ResonanceParameters::ReichMoore(r) => { + if let Some(ape) = &r.ape { + d.tab1(&format!("{rp}/APE"), ape); + } + d.float(format!("{rp}/SPI"), r.spi); + d.float(format!("{rp}/AP"), r.ap); + d.int(format!("{rp}/LAD"), r.lad); + d.int(format!("{rp}/NLS"), r.nls); + d.int(format!("{rp}/NLSC"), r.nlsc); + for (i, s) in r.sections.iter().enumerate() { + let sp = format!("{rp}/sections/{i}"); + d.float(format!("{sp}/AWRI"), s.awri); + d.float(format!("{sp}/APL"), s.apl); + d.int(format!("{sp}/L"), s.l); + d.int(format!("{sp}/NRS"), s.nrs); + d.floats(format!("{sp}/ER"), s.er.clone()); + d.floats(format!("{sp}/AJ"), s.aj.clone()); + d.floats(format!("{sp}/GN"), s.gn.clone()); + d.floats(format!("{sp}/GG"), s.gg.clone()); + d.floats(format!("{sp}/GFA"), s.gfa.clone()); + d.floats(format!("{sp}/GFB"), s.gfb.clone()); + } + } + ResonanceParameters::RMatrixLimited(r) => { + d.int(format!("{rp}/IFG"), r.ifg); + d.int(format!("{rp}/KRM"), r.krm); + d.int(format!("{rp}/NJS"), r.njs); + d.int(format!("{rp}/KRL"), r.krl); + d.int(format!("{rp}/NPP"), r.npp); + let pp = &r.particle_pairs; + for (key, values) in [ + ("MA", &pp.ma), + ("MB", &pp.mb), + ("ZA", &pp.za), + ("ZB", &pp.zb), + ("IA", &pp.ia), + ("IB", &pp.ib), + ("Q", &pp.q), + ("PNT", &pp.pnt), + ("SHF", &pp.shf), + ("MT", &pp.mt), + ("PA", &pp.pa), + ("PB", &pp.pb), + ] { + d.floats(format!("{rp}/particle_pairs/{key}"), values.clone()); + } + for (i, g) in r.spin_groups.iter().enumerate() { + let gp = format!("{rp}/spin_groups/{i}"); + d.float(format!("{gp}/AJ"), g.aj); + d.float(format!("{gp}/PJ"), g.pj); + d.int(format!("{gp}/KBK"), g.kbk); + d.int(format!("{gp}/KPS"), g.kps); + d.int(format!("{gp}/NCH"), g.nch); + d.int(format!("{gp}/NRS"), g.nrs); + d.int(format!("{gp}/NX"), g.nx); + let ch = &g.channels; + for (key, values) in [ + ("PPI", &ch.ppi), + ("L", &ch.l), + ("SCH", &ch.sch), + ("BND", &ch.bnd), + ("APE", &ch.ape), + ("APT", &ch.apt), + ] { + d.floats(format!("{gp}/channels/{key}"), values.clone()); + } + d.floats(format!("{gp}/ER"), g.er.clone()); + for (c, row) in g.gam.iter().enumerate() { + d.floats(format!("{gp}/GAM/{c}"), row.clone()); + } + for (key, value) in [("LCH", g.lch), ("LBK", g.lbk), ("LPS", g.lps)] { + if let Some(v) = value { + d.int(format!("{gp}/{key}"), v); + } + } + for (key, value) in [("ED", g.ed), ("EU", g.eu)] { + if let Some(v) = value { + d.float(format!("{gp}/{key}"), v); + } + } + for (key, table) in [ + ("RBR", &g.rbr), + ("RBI", &g.rbi), + ("PSR", &g.psr), + ("PSI", &g.psi), + ] { + if let Some(t) = table { + d.tab1(&format!("{gp}/{key}"), t); + } + } + } + } + ResonanceParameters::Unresolved(u) => { + if let Some(ape) = &u.ape { + d.tab1(&format!("{rp}/APE"), ape); + } + d.float(format!("{rp}/SPI"), u.spi); + d.float(format!("{rp}/AP"), u.ap); + d.int(format!("{rp}/LSSF"), u.lssf); + d.int(format!("{rp}/NLS"), u.nls); + if let Some(ne) = u.ne { + d.int(format!("{rp}/NE"), ne); + d.floats(format!("{rp}/ES"), u.es.clone()); + } + for (i, r) in u.ranges.iter().enumerate() { + let up = format!("{rp}/ranges/{i}"); + d.float(format!("{up}/AWRI"), r.awri); + d.int(format!("{up}/L"), r.l); + d.int(format!("{up}/NJS"), r.njs); + if !r.d.is_empty() { + d.floats(format!("{up}/D"), r.d.clone()); + d.floats(format!("{up}/AJ"), r.aj.clone()); + d.floats(format!("{up}/AMUN"), r.amun.clone()); + d.floats(format!("{up}/GNO"), r.gno.clone()); + d.floats(format!("{up}/GG"), r.gg.clone()); + } + for (j, p) in r.parameters.iter().enumerate() { + let pp = format!("{up}/parameters/{j}"); + match p { + UnresolvedParameters::CaseB { + muf, + d: dd, + aj, + amun, + gn0, + gg, + gf, + } => { + d.int(format!("{pp}/MUF"), *muf); + d.float(format!("{pp}/D"), *dd); + d.float(format!("{pp}/AJ"), *aj); + d.float(format!("{pp}/AMUN"), *amun); + d.float(format!("{pp}/GN0"), *gn0); + d.float(format!("{pp}/GG"), *gg); + d.floats(format!("{pp}/GF"), gf.clone()); + } + UnresolvedParameters::CaseC { + aj, + interpolation, + ne, + amux, + amun, + amuf, + e, + d: dd, + gx, + gn0, + gg, + gf, + } => { + d.float(format!("{pp}/AJ"), *aj); + d.int(format!("{pp}/INT"), *interpolation); + d.int(format!("{pp}/NE"), *ne); + d.float(format!("{pp}/AMUX"), *amux); + d.float(format!("{pp}/AMUN"), *amun); + d.float(format!("{pp}/AMUF"), *amuf); + d.floats(format!("{pp}/E"), e.clone()); + d.floats(format!("{pp}/D"), dd.clone()); + d.floats(format!("{pp}/GX"), gx.clone()); + d.floats(format!("{pp}/GN0"), gn0.clone()); + d.floats(format!("{pp}/GG"), gg.clone()); + d.floats(format!("{pp}/GF"), gf.clone()); + } + } + } + } + } + ResonanceParameters::Absent => {} + } +} + +fn dump_mf6_distribution(d: &mut Dump, dp: &str, dist: &Mf6Distribution) { + match dist { + Mf6Distribution::None => {} + Mf6Distribution::ContinuumEnergyAngle(c) => { + d.int(format!("{dp}/LANG"), c.lang); + d.int(format!("{dp}/LEP"), c.lep); + d.int(format!("{dp}/NR"), c.nr); + d.int(format!("{dp}/NE"), c.ne); + d.tab2(&format!("{dp}/E_int"), &c.e_int); + d.floats(format!("{dp}/E"), c.energy.clone()); + for (j, s) in c.distribution.iter().enumerate() { + let sp = format!("{dp}/distribution/{j}"); + d.int(format!("{sp}/ND"), s.nd); + d.int(format!("{sp}/NA"), s.na); + d.int(format!("{sp}/NW"), s.nw); + d.int(format!("{sp}/NEP"), s.nep); + d.floats(format!("{sp}/Eout"), s.e_out.clone()); + for (r, row) in s.b.iter().enumerate() { + d.floats(format!("{sp}/b/{r}"), row.clone()); + } + } + } + Mf6Distribution::DiscreteTwoBody(t) => { + d.int(format!("{dp}/NR"), t.nr); + d.int(format!("{dp}/NE"), t.ne); + d.tab2(&format!("{dp}/E_int"), &t.e_int); + d.floats(format!("{dp}/E"), t.energy.clone()); + for (j, s) in t.distribution.iter().enumerate() { + let sp = format!("{dp}/distribution/{j}"); + d.int(format!("{sp}/LANG"), s.lang); + d.int(format!("{sp}/NW"), s.nw); + d.int(format!("{sp}/NL"), s.nl); + d.floats(format!("{sp}/A_l"), s.a_l.clone()); + } + } + Mf6Distribution::ChargedParticleElastic(c) => { + d.float(format!("{dp}/SPI"), c.spi); + d.int(format!("{dp}/LIDP"), c.lidp); + d.int(format!("{dp}/NE"), c.ne); + d.tab2(&format!("{dp}/E_int"), &c.e_int); + for (j, s) in c.distribution.iter().enumerate() { + let sp = format!("{dp}/distribution/{j}"); + d.float(format!("{sp}/E"), s.energy); + d.int(format!("{sp}/LTP"), s.ltp); + d.int(format!("{sp}/NW"), s.nw); + d.int(format!("{sp}/NL"), s.nl); + d.floats(format!("{sp}/A"), s.a.clone()); + } + } + Mf6Distribution::NBodyPhaseSpace { apsx, npsx } => { + d.float(format!("{dp}/APSX"), *apsx); + d.int(format!("{dp}/NPSX"), *npsx); + } + Mf6Distribution::LaboratoryAngleEnergy(l) => { + d.int(format!("{dp}/NE"), l.ne); + d.tab2(&format!("{dp}/E_int"), &l.e_int); + for (j, s) in l.distribution.iter().enumerate() { + let sp = format!("{dp}/distribution/{j}"); + d.float(format!("{sp}/E"), s.energy); + d.int(format!("{sp}/NRM"), s.nrm); + d.int(format!("{sp}/NMU"), s.nmu); + d.tab2(&format!("{sp}/mu_int"), &s.mu_int); + for (k, entry) in s.mu.iter().enumerate() { + d.float(format!("{sp}/mu/{k}/mu"), entry.mu); + d.tab1(&format!("{sp}/mu/{k}/f"), &entry.f); + } + } + } + } +} + +/// One MF=33 subsection. Shared with MF=40, which reuses the format. +fn dump_mf33_subsection(d: &mut Dump, sp: &str, sub: &Mf33Subsection) { + d.float(format!("{sp}/XMF1"), sub.xmf1); + d.float(format!("{sp}/XLFS1"), sub.xlfs1); + for (key, value) in [ + ("MAT1", sub.mat1), + ("MT1", sub.mt1), + ("NC", sub.nc), + ("NI", sub.ni), + ] { + d.int(format!("{sp}/{key}"), value); + } + for (i, nc) in sub.nc_subsections.iter().enumerate() { + let np = format!("{sp}/nc/{i}"); + d.int(format!("{np}/LTY"), nc.lty); + d.float(format!("{np}/E1"), nc.e1); + d.float(format!("{np}/E2"), nc.e2); + if nc.lty == 0 { + d.int(format!("{np}/NCI"), nc.nci); + d.floats(format!("{np}/CI"), nc.ci.clone()); + d.floats(format!("{np}/XMTI"), nc.xmti.clone()); + } else { + d.int(format!("{np}/MATS"), nc.mats); + d.int(format!("{np}/MTS"), nc.mts); + d.int(format!("{np}/NEI"), nc.nei); + d.float(format!("{np}/XMFS"), nc.xmfs); + d.float(format!("{np}/XLFSS"), nc.xlfss); + d.floats(format!("{np}/EI"), nc.ei.clone()); + d.floats(format!("{np}/WEI"), nc.wei.clone()); + } + } + for (i, ni) in sub.ni_subsections.iter().enumerate() { + let ip = format!("{sp}/ni/{i}"); + d.int(format!("{ip}/LB"), ni.lb); + d.int(format!("{ip}/NT"), ni.nt); + match ni.lb { + 0..=4 => { + d.int(format!("{ip}/LT"), ni.lt); + d.int(format!("{ip}/NP"), ni.np); + d.floats(format!("{ip}/Ek"), ni.ek.clone()); + d.floats(format!("{ip}/Fk"), ni.fk.clone()); + d.floats(format!("{ip}/El"), ni.el.clone()); + d.floats(format!("{ip}/Fl"), ni.fl.clone()); + } + 5 => { + d.int(format!("{ip}/LS"), ni.ls); + d.int(format!("{ip}/NE"), ni.ne); + d.floats(format!("{ip}/Ek"), ni.ek.clone()); + d.floats(format!("{ip}/Fkk"), ni.fkk.clone()); + } + 6 => { + d.int(format!("{ip}/NER"), ni.ner); + d.int(format!("{ip}/NEC"), ni.nec); + d.floats(format!("{ip}/ER"), ni.er.clone()); + d.floats(format!("{ip}/EC"), ni.ec.clone()); + d.floats(format!("{ip}/Fkl"), ni.fkl.clone()); + } + _ => { + d.int(format!("{ip}/LT"), ni.lt); + d.int(format!("{ip}/NP"), ni.np); + d.floats(format!("{ip}/Ek"), ni.ek.clone()); + d.floats(format!("{ip}/Fk"), ni.fk.clone()); + } + } + } +} + +/// Mirrors `dump_angle_distribution` in `tools/dump_golden.py`. +fn dump_angle_distribution(d: &mut Dump, path: &str, dist: &AngleDistribution) { + d.floats(format!("{path}/energy"), dist.energy.clone()); + d.int(format!("{path}/n_mu"), dist.mu.len() as i64); + for (i, mu) in dist.mu.iter().enumerate() { + let p = format!("{path}/mu/{i}"); + match mu { + AngleAtEnergy::Legendre(l) => { + d.text(format!("{p}/kind"), "legendre"); + d.floats(format!("{p}/coef"), l.coefficients.clone()); + } + AngleAtEnergy::Tabulated(f) => { + d.text(format!("{p}/kind"), "tabulated"); + d.tab1(&format!("{p}/f"), f); + } + AngleAtEnergy::Tabular(t) => { + dump_univariate(d, &p, &Univariate::Tabular(t.clone())); + } + AngleAtEnergy::Isotropic(u) => { + dump_univariate(d, &p, &Univariate::Uniform(u.clone())); + } + } + } +} + +/// Mirrors `dump_reactions` in `tools/dump_golden.py`. +fn dump_reactions(d: &mut Dump, path: &str, material: &Material) { + let mts: Vec = material + .section_data + .keys() + .filter(|&&(mf, _)| mf == 3) + .map(|&(_, mt)| mt) + .collect(); + d.ints( + format!("{path}/mts"), + mts.iter().map(|&mt| mt as i64).collect(), + ); + for mt in mts { + let rx = endf::Reaction::from_endf(mt, material).unwrap(); + dump_reaction(d, &format!("{path}/{mt}"), &rx); + } +} + +/// Mirrors `dump_reaction` in `tools/dump_golden.py`. +fn dump_reaction(d: &mut Dump, path: &str, rx: &endf::Reaction) { + d.int(format!("{path}/MT"), rx.mt as i64); + d.float(format!("{path}/q_reaction"), rx.q_reaction); + d.float(format!("{path}/q_massdiff"), rx.q_massdiff); + d.int(format!("{path}/redundant"), i64::from(rx.redundant)); + d.int( + format!("{path}/center_of_mass"), + i64::from(rx.center_of_mass), + ); + for (temperature, xs) in &rx.xs { + d.tab1(&format!("{path}/xs/{temperature}"), xs); + } + for (kind, products) in [ + ("products", &rx.products), + ("derived_products", &rx.derived_products), + ] { + d.int(format!("{path}/n_{kind}"), products.len() as i64); + for (i, product) in products.iter().enumerate() { + dump_product(d, &format!("{path}/{kind}/{i}"), product); + } + } +} + +/// Mirrors `dump_product` in `tools/dump_golden.py`. +fn dump_product(d: &mut Dump, path: &str, product: &endf::Product) { + d.text(format!("{path}/name"), &product.name); + d.text( + format!("{path}/emission_mode"), + product.emission_mode.name(), + ); + d.float(format!("{path}/decay_rate"), product.decay_rate); + match &product.yield_ { + endf::Yield::Tabulated(t) => { + d.text(format!("{path}/yield/kind"), "tabulated"); + d.tab1(&format!("{path}/yield/f"), t); + } + endf::Yield::Polynomial(p) => { + d.text(format!("{path}/yield/kind"), "polynomial"); + d.floats(format!("{path}/yield/coef"), p.coefficients.clone()); + } + } + for (i, applicability) in product.applicability.iter().enumerate() { + d.tab1(&format!("{path}/applicability/{i}"), applicability); + } + d.int( + format!("{path}/n_distribution"), + product.distribution.len() as i64, + ); + for (i, dist) in product.distribution.iter().enumerate() { + dump_angle_energy(d, &format!("{path}/distribution/{i}"), dist); + } +} + +/// Mirrors `dump_radionuclide_production` in `tools/dump_golden.py`. +fn dump_radionuclide_production(d: &mut Dump, path: &str, material: &Material) { + let production = endf::radionuclide_production(material); + d.ints( + format!("{path}/mts"), + production.keys().map(|&mt| mt as i64).collect(), + ); + for (mt, states) in &production { + for (i, state) in states.iter().enumerate() { + let sp = format!("{path}/{mt}/{i}"); + d.int(format!("{sp}/ZAP"), state.zap); + d.int(format!("{sp}/LFS"), state.lfs); + d.float(format!("{sp}/QM"), state.qm); + d.float(format!("{sp}/QI"), state.qi); + if let Some(elfs) = state.elfs { + d.float(format!("{sp}/ELFS"), elfs); + } + d.float(format!("{sp}/excitation_energy"), state.excitation_energy()); + if let Some(y) = &state.yields { + d.tab1(&format!("{sp}/yields"), y); + } + if let Some(xs) = &state.cross_section { + d.tab1(&format!("{sp}/cross_section"), xs); + } + } + } +} + +/// Mirrors `dump_univariate` in `tools/dump_golden.py`. +fn dump_univariate(d: &mut Dump, p: &str, u: &Univariate) { + let c = match u { + Univariate::Discrete(t) => { + d.text(format!("{p}/kind"), "discrete"); + d.floats(format!("{p}/x"), t.x.clone()); + d.floats(format!("{p}/p"), t.p.clone()); + d.floats(format!("{p}/cdf"), t.cdf()); + &t.c + } + Univariate::Tabular(t) => { + d.text(format!("{p}/kind"), "tabular"); + d.text(format!("{p}/interpolation"), t.interpolation.name()); + d.floats(format!("{p}/x"), t.x.clone()); + d.floats(format!("{p}/p"), t.p.clone()); + d.floats(format!("{p}/cdf"), t.cdf()); + &t.c + } + Univariate::Uniform(t) => { + d.text(format!("{p}/kind"), "uniform"); + d.float(format!("{p}/a"), t.a); + d.float(format!("{p}/b"), t.b); + &None + } + Univariate::Mixture(m) => { + d.text(format!("{p}/kind"), "mixture"); + d.floats(format!("{p}/probability"), m.probability.clone()); + for (j, sub) in m.distribution.iter().enumerate() { + dump_univariate(d, &format!("{p}/distribution/{j}"), sub); + } + &None + } + }; + // The CDF as the file gave it, where there was one. + if let Some(c) = c { + d.floats(format!("{p}/c"), c.clone()); + } +} + +/// Mirrors `dump_energy_distribution` in `tools/dump_golden.py`. +fn dump_energy_distribution(d: &mut Dump, p: &str, dist: &EnergyDistribution) { + match dist { + EnergyDistribution::ArbitraryTabulated { energy, g, .. } => { + d.text(format!("{p}/kind"), "arbitrary-tabulated"); + d.floats(format!("{p}/E"), energy.clone()); + for (j, t) in g.iter().enumerate() { + d.tab1(&format!("{p}/g/{j}"), t); + } + } + EnergyDistribution::GeneralEvaporation { u, theta, g } => { + d.text(format!("{p}/kind"), "general-evaporation"); + d.float(format!("{p}/U"), *u); + d.tab1(&format!("{p}/theta"), theta); + d.tab1(&format!("{p}/g"), g); + } + EnergyDistribution::MaxwellEnergy { u, theta } => { + d.text(format!("{p}/kind"), "maxwell"); + d.float(format!("{p}/U"), *u); + d.tab1(&format!("{p}/theta"), theta); + } + EnergyDistribution::Evaporation { u, theta } => { + d.text(format!("{p}/kind"), "evaporation"); + d.float(format!("{p}/U"), *u); + d.tab1(&format!("{p}/theta"), theta); + } + EnergyDistribution::WattEnergy { u, a, b } => { + d.text(format!("{p}/kind"), "watt"); + d.float(format!("{p}/U"), *u); + d.tab1(&format!("{p}/a"), a); + d.tab1(&format!("{p}/b"), b); + } + EnergyDistribution::MadlandNix { efl, efh, t_m } => { + d.text(format!("{p}/kind"), "madland-nix"); + d.float(format!("{p}/EFL"), *efl); + d.float(format!("{p}/EFH"), *efh); + d.tab1(&format!("{p}/T_M"), t_m); + } + EnergyDistribution::LevelInelastic { + threshold, + mass_ratio, + } => { + d.text(format!("{p}/kind"), "level-inelastic"); + d.float(format!("{p}/threshold"), *threshold); + d.float(format!("{p}/mass_ratio"), *mass_ratio); + } + EnergyDistribution::DiscretePhoton { + primary_flag, + energy, + atomic_weight_ratio, + } => { + d.text(format!("{p}/kind"), "discrete-photon"); + d.int(format!("{p}/primary_flag"), *primary_flag); + d.float(format!("{p}/energy"), *energy); + d.float(format!("{p}/atomic_weight_ratio"), *atomic_weight_ratio); + } + EnergyDistribution::ContinuousTabular { + breakpoints, + interpolation, + energy, + energy_out, + } => { + d.text(format!("{p}/kind"), "continuous-tabular"); + d.ints( + format!("{p}/bp"), + breakpoints.iter().map(|&v| v as i64).collect(), + ); + d.ints( + format!("{p}/int"), + interpolation.iter().map(|&v| v as i64).collect(), + ); + d.floats(format!("{p}/E"), energy.clone()); + for (j, eout) in energy_out.iter().enumerate() { + dump_univariate(d, &format!("{p}/energy_out/{j}"), eout); + } + } + } +} + +/// Mirrors `dump_angle_energy` in `tools/dump_golden.py`. +fn dump_angle_energy(d: &mut Dump, p: &str, ae: &AngleEnergy) { + match ae { + AngleEnergy::Uncorrelated(u) => { + d.text(format!("{p}/kind"), "uncorrelated"); + if let Some(angle) = &u.angle { + dump_angle_distribution(d, &format!("{p}/angle"), angle); + } + if let Some(energy) = &u.energy { + dump_energy_distribution(d, &format!("{p}/energy"), energy); + } + } + AngleEnergy::KalbachMann(k) => { + d.text(format!("{p}/kind"), "kalbach-mann"); + d.ints( + format!("{p}/bp"), + k.breakpoints.iter().map(|&v| v as i64).collect(), + ); + d.ints( + format!("{p}/int"), + k.interpolation.iter().map(|&v| v as i64).collect(), + ); + d.floats(format!("{p}/E"), k.energy.clone()); + for (j, eout) in k.energy_out.iter().enumerate() { + dump_univariate(d, &format!("{p}/energy_out/{j}"), eout); + } + for (j, r) in k.precompound.iter().enumerate() { + d.tab1(&format!("{p}/precompound/{j}"), r); + } + for (j, a) in k.slope.iter().enumerate() { + d.tab1(&format!("{p}/slope/{j}"), a); + } + } + AngleEnergy::Correlated(c) => { + d.text(format!("{p}/kind"), "correlated"); + d.ints( + format!("{p}/bp"), + c.breakpoints.iter().map(|&v| v as i64).collect(), + ); + d.ints( + format!("{p}/int"), + c.interpolation.iter().map(|&v| v as i64).collect(), + ); + d.floats(format!("{p}/E"), c.energy.clone()); + for (j, eout) in c.energy_out.iter().enumerate() { + dump_univariate(d, &format!("{p}/energy_out/{j}"), eout); + } + for (j, mu_j) in c.mu.iter().enumerate() { + for (k, mu_jk) in mu_j.iter().enumerate() { + dump_univariate(d, &format!("{p}/mu/{j}/{k}"), mu_jk); + } + } + } + AngleEnergy::NBodyPhaseSpace(n) => { + d.text(format!("{p}/kind"), "nbody"); + d.float(format!("{p}/total_mass"), n.total_mass); + d.int(format!("{p}/n_particles"), n.n_particles); + d.float(format!("{p}/atomic_weight_ratio"), n.atomic_weight_ratio); + d.float(format!("{p}/q_value"), n.q_value); + } + } +} + +/// Mirrors `dump_incident_neutron_ace` in `tools/dump_golden.py`. +fn dump_incident_neutron_ace(d: &mut Dump, path: &str, t: &ace::Table) { + // ESZ (JXS(1)) is the energy grid and MTR (JXS(3)) the reaction list; + // without them there is no nuclide to build. + if t.data_type().ok() != Some(ace::TableType::NeutronContinuous) { + return; + } + if t.jxs[1] <= 0 || t.jxs[3] <= 0 { + return; + } + let n = endf::IncidentNeutron::from_ace(t, endf::ace::MetastableScheme::Mcnp).unwrap(); + + d.text(format!("{path}/name"), &n.name()); + d.int(format!("{path}/atomic_number"), n.atomic_number as i64); + d.int(format!("{path}/mass_number"), n.mass_number as i64); + d.int(format!("{path}/metastable"), n.metastable as i64); + d.float( + format!("{path}/atomic_weight_ratio"), + n.atomic_weight_ratio.unwrap(), + ); + d.floats(format!("{path}/kTs"), n.k_ts.clone()); + for (i, temperature) in n.temperatures().iter().enumerate() { + d.text(format!("{path}/temperatures/{i}"), temperature); + d.floats( + format!("{path}/energy/{temperature}"), + n.energy[temperature].clone(), + ); + if let Some(urr) = n.urr.get(temperature) { + d.floats( + format!("{path}/urr/{temperature}/energy"), + urr.energy.clone(), + ); + } + } + + let mts: Vec = n.reactions.keys().copied().collect(); + d.ints( + format!("{path}/mts"), + mts.iter().map(|&m| m as i64).collect(), + ); + d.ints( + format!("{path}/redundant"), + mts.iter() + .map(|m| i64::from(n.reactions[m].redundant)) + .collect(), + ); + for mt in &mts { + d.ints( + format!("{path}/components/{mt}"), + n.reaction_components(*mt) + .iter() + .map(|&m| m as i64) + .collect(), + ); + } + + // The removal cross section is deliberately not dumped here. It folds the + // elastic angular distribution into the total, and for ACE data the Python + // `forward_fraction` returns uninitialized memory — see issue #21 — so + // there is nothing stable to compare against. It is dumped on the ENDF + // path, where the answer is well defined. + + // Only the reactions this type synthesises are dumped in full; the ones + // `Reaction::from_ace` builds are compared elsewhere. + let mut from_ace_mts: BTreeSet = BTreeSet::from([2]); + from_ace_mts.extend((1..=t.nxs[4]).map(|i| t.xss[(t.jxs[3] + i - 1) as usize] as i32)); + for mt in mts.iter().filter(|m| !from_ace_mts.contains(m)) { + dump_reaction(d, &format!("{path}/synthesised/{mt}"), &n.reactions[mt]); + } +} + +/// Mirrors `dump_chain` in `tools/dump_chain_golden.py`. +fn dump_chain(d: &mut Dump, path: &str, chain: &endf::Chain) { + d.int(format!("{path}/n"), chain.nuclides.len() as i64); + for (i, nuclide) in chain.nuclides.iter().enumerate() { + let np = format!("{path}/{i}"); + d.text(format!("{np}/name"), &nuclide.name); + if let Some(half_life) = nuclide.half_life { + d.float(format!("{np}/half_life"), half_life); + } + d.float(format!("{np}/decay_energy"), nuclide.decay_energy); + for (j, mode) in nuclide.decay_modes.iter().enumerate() { + let mp = format!("{np}/decay/{j}"); + d.text(format!("{mp}/type"), &mode.kind); + if let Some(target) = &mode.target { + d.text(format!("{mp}/target"), target); + } + d.float(format!("{mp}/branching_ratio"), mode.branching_ratio); + } + for (j, rx) in nuclide.reactions.iter().enumerate() { + let rp = format!("{np}/reaction/{j}"); + d.text(format!("{rp}/type"), &rx.kind); + if let Some(target) = &rx.target { + d.text(format!("{rp}/target"), target); + } + d.float(format!("{rp}/Q"), rx.q_value); + d.float(format!("{rp}/branching_ratio"), rx.branching_ratio); + } + } +} + +/// Mirrors `dump_incident_photon` in `tools/dump_golden.py`. +fn dump_incident_photon(d: &mut Dump, path: &str, material: &Material) { + let has_photoatomic = material.section_data.keys().any(|&(mf, _)| mf == 23); + if has_photoatomic { + let n = endf::IncidentPhoton::from_endf(material, None).unwrap(); + d.int(format!("{path}/atomic_number"), n.atomic_number); + d.text(format!("{path}/name"), n.name()); + let mts: Vec = n.reactions.keys().copied().collect(); + d.ints( + format!("{path}/mts"), + mts.iter().map(|&m| m as i64).collect(), + ); + for mt in &mts { + let rx = &n.reactions[mt]; + let rp = format!("{path}/{mt}"); + if let Some(name) = rx.name() { + d.text(format!("{rp}/name"), name); + } + for (key, value) in [ + ("xs", &rx.xs), + ("scattering_factor", &rx.scattering_factor), + ("anomalous_real", &rx.anomalous_real), + ("anomalous_imag", &rx.anomalous_imag), + ] { + if let Some(value) = value { + d.tab1(&format!("{rp}/{key}"), value); + } + } + if let Some(value) = rx.subshell_binding_energy { + d.float(format!("{rp}/subshell_binding_energy"), value); + } + if let Some(value) = rx.fluorescence_yield { + d.float(format!("{rp}/fluorescence_yield"), value); + } + d.ints( + format!("{rp}/components"), + n.reaction_components(*mt) + .iter() + .map(|&m| m as i64) + .collect(), + ); + } + } + + if material.mf28(533).is_some() { + let relaxation = endf::AtomicRelaxation::from_endf(material).unwrap(); + dump_atomic_relaxation(d, &format!("{path}/relaxation"), &relaxation); + } +} + +/// Mirrors `dump_atomic_relaxation` in `tools/dump_golden.py`. +fn dump_atomic_relaxation(d: &mut Dump, path: &str, relaxation: &endf::AtomicRelaxation) { + for (i, shell) in relaxation.subshells().iter().enumerate() { + d.text(format!("{path}/subshells/{i}"), shell); + } + for (shell, value) in &relaxation.binding_energy { + d.float(format!("{path}/binding_energy/{shell}"), *value); + } + for (shell, value) in &relaxation.num_electrons { + d.float(format!("{path}/num_electrons/{shell}"), *value); + } + for (shell, t) in &relaxation.transitions { + let tp = format!("{path}/transitions/{shell}"); + for (i, s) in t.secondary_subshell.iter().enumerate() { + d.text(format!("{tp}/secondary/{i}"), s); + } + for (i, s) in t.tertiary_subshell.iter().enumerate() { + d.text(format!("{tp}/tertiary/{i}"), s); + } + d.floats(format!("{tp}/energy"), t.energy.clone()); + d.floats(format!("{tp}/probability"), t.probability.clone()); + } +} + +/// Mirrors `dump_decay` in `tools/dump_golden.py`. +fn dump_decay(d: &mut Dump, path: &str, material: &Material) { + if material.mf8_mt457().is_some() { + dump_decay_section(d, path, &endf::Decay::from_material(material).unwrap()); + } + if material.mf8_mt454(454).is_some() || material.mf8_mt454(459).is_some() { + let fpy = endf::FissionProductYields::from_material(material).unwrap(); + d.floats(format!("{path}/fpy/energies"), fpy.energies.clone()); + for (kind, sets) in [ + ("independent", &fpy.independent), + ("cumulative", &fpy.cumulative), + ] { + for (i, yields) in sets.iter().enumerate() { + // Sorted by name, as the Python dumper walks a dict. + let mut yields = yields.clone(); + yields.sort_by(|a, b| a.name.cmp(&b.name)); + for (j, product) in yields.iter().enumerate() { + let yp = format!("{path}/fpy/{kind}/{i}/{j}"); + d.text(format!("{yp}/name"), &product.name); + d.floats( + format!("{yp}/yield"), + vec![product.yield_.0, product.yield_.1], + ); + } + } + } + } +} + +/// Mirrors `dump_decay_section` in `tools/dump_golden.py`. +fn dump_decay_section(d: &mut Dump, path: &str, decay: &endf::Decay) { + let pair = |v: (f64, f64)| vec![v.0, v.1]; + let n = &decay.nuclide; + d.text(format!("{path}/name"), &n.name); + d.int(format!("{path}/atomic_number"), n.atomic_number); + d.int(format!("{path}/mass_number"), n.mass_number); + d.int(format!("{path}/isomeric_state"), n.isomeric_state); + d.int(format!("{path}/excited_state"), n.excited_state); + d.float(format!("{path}/mass"), n.mass); + d.int(format!("{path}/stable"), i64::from(n.stable)); + if let Some(spin) = n.spin { + d.float(format!("{path}/spin"), spin); + } + d.float(format!("{path}/parity"), n.parity); + + if !n.stable { + d.floats(format!("{path}/half_life"), pair(decay.half_life.unwrap())); + // A half-life of zero means it was not evaluated, and both readers + // return nothing for it rather than dividing by it (issue #23). Dumped + // either way, so the absence is compared rather than skipped on both + // sides at once. + d.floats( + format!("{path}/decay_constant"), + match decay.decay_constant() { + Some(constant) => pair(constant).to_vec(), + None => Vec::new(), + }, + ); + } + d.floats(format!("{path}/decay_energy"), pair(decay.decay_energy())); + for (key, value) in &decay.average_energies { + d.floats(format!("{path}/average_energies/{key}"), pair(*value)); + } + + for (i, mode) in decay.modes.iter().enumerate() { + let mp = format!("{path}/modes/{i}"); + d.text(format!("{mp}/parent"), &mode.parent); + d.text(format!("{mp}/modes"), &mode.modes.join(",")); + d.text(format!("{mp}/daughter"), &mode.daughter().unwrap()); + d.floats(format!("{mp}/energy"), pair(mode.energy)); + d.floats(format!("{mp}/branching_ratio"), pair(mode.branching_ratio)); + } + + for (radiation, spectrum) in &decay.spectra { + let sp = format!("{path}/spectra/{radiation}"); + d.text( + format!("{sp}/continuous_flag"), + spectrum.continuous_flag.name(), + ); + d.floats( + format!("{sp}/discrete_normalization"), + pair(spectrum.discrete_normalization), + ); + d.floats( + format!("{sp}/energy_average"), + pair(spectrum.energy_average), + ); + d.floats( + format!("{sp}/continuous_normalization"), + pair(spectrum.continuous_normalization), + ); + for (j, line) in spectrum.discrete.iter().enumerate() { + let lp = format!("{sp}/discrete/{j}"); + d.floats(format!("{lp}/energy"), pair(line.energy)); + d.text(format!("{lp}/from_mode"), &line.from_mode.join(",")); + if let Some(kind) = line.transition_type { + d.text(format!("{lp}/type"), kind); + } + d.floats(format!("{lp}/intensity"), pair(line.intensity)); + for (key, value) in [ + ("positron_intensity", line.positron_intensity), + ("internal_pair", line.internal_pair), + ("total_internal_conversion", line.total_internal_conversion), + ("k_shell_conversion", line.k_shell_conversion), + ("l_shell_conversion", line.l_shell_conversion), + ] { + if let Some(value) = value { + d.floats(format!("{lp}/{key}"), pair(value)); + } + } + } + if let Some(continuous) = &spectrum.continuous { + d.text( + format!("{sp}/continuous_from_mode"), + &spectrum.continuous_from_mode.join(","), + ); + d.tab1(&format!("{sp}/continuous"), continuous); + } + } + + for (particle, dist) in decay.sources().unwrap() { + dump_univariate(d, &format!("{path}/sources/{particle}"), &dist); + } +} + +/// Mirrors `dump_incident_neutron_endf` in `tools/dump_golden.py`. +fn dump_incident_neutron_endf(d: &mut Dump, path: &str, material: &Material) { + if material.mf1_mt451().is_none() { + return; + } + let n = endf::IncidentNeutron::from_endf(material).unwrap(); + d.text(format!("{path}/name"), &n.name()); + d.int(format!("{path}/atomic_number"), n.atomic_number as i64); + d.int(format!("{path}/mass_number"), n.mass_number as i64); + d.int(format!("{path}/metastable"), n.metastable as i64); + d.text(format!("{path}/atomic_symbol"), n.atomic_symbol()); + let mts: Vec = n.reactions.keys().copied().collect(); + d.ints( + format!("{path}/mts"), + mts.iter().map(|&m| m as i64).collect(), + ); + for mt in &mts { + d.ints( + format!("{path}/components/{mt}"), + n.reaction_components(*mt) + .iter() + .map(|&m| m as i64) + .collect(), + ); + } + + // The removal cross section, which folds the elastic angular distribution + // into the total. Several cutoffs, since each picks a different slice of + // the forward cone. + if n.contains(1) && n.contains(2) { + for cutoff in [-1.0, 0.0, 0.5] { + let name = format!("{cutoff:+.1}"); + d.tab1( + &format!("{path}/removal_xs/{name}"), + &n.removal_xs("0K", cutoff).unwrap(), + ); + } + } +} + +/// Mirrors `dump_ace_reactions` in `tools/dump_golden.py`. +fn dump_ace_reactions(d: &mut Dump, path: &str, t: &ace::Table) { + // MTR (JXS(3)) lists the reactions; without it there are none to read. + if t.data_type().ok() != Some(ace::TableType::NeutronContinuous) || t.jxs[3] <= 0 { + return; + } + let n = t.nxs[4]; + d.int(format!("{path}/n"), n); + for i_reaction in 0..=n { + let rx = endf::Reaction::from_ace(t, i_reaction).unwrap(); + dump_reaction(d, &format!("{path}/{i_reaction}"), &rx); + } +} + +/// Mirrors `dump_ace_dlw` in `tools/dump_golden.py`. +fn dump_ace_dlw(d: &mut Dump, path: &str, t: &ace::Table) { + if t.data_type().ok() != Some(ace::TableType::NeutronContinuous) { + return; + } + let (ldlw, dlw) = (t.jxs[10], t.jxs[11]); + if ldlw <= 0 { + return; + } + let at = |i: i64| t.xss.get(i as usize).copied().unwrap_or(0.0); + + let n = t.nxs[5]; + d.int(format!("{path}/n"), n); + for i_reaction in 1..=n { + let rp = format!("{path}/{i_reaction}"); + let mut lnw = at(ldlw + i_reaction - 1) as i64; + let mut chain: Vec = Vec::new(); + while lnw > 0 { + let k = chain.len(); + chain.push(lnw); + d.tab1( + &format!("{rp}/{k}/applicability"), + &Tabulated1D::from_ace(&t.xss, (dlw + lnw + 2).max(0) as usize, true), + ); + // Law 66 wants the reaction's Q value; the Python dumper passes a + // fixed stand-in, so this passes the same one. + let ae = AngleEnergy::from_ace(t, dlw, lnw, Some(0.0)).unwrap(); + dump_angle_energy(d, &format!("{rp}/{k}"), &ae); + lnw = at(dlw + lnw - 1) as i64; + } + d.ints(format!("{rp}/chain"), chain); + } +} + +/// Mirrors `dump_ace_angle` in `tools/dump_golden.py`. +fn dump_ace_angle(d: &mut Dump, path: &str, t: &ace::Table) { + if t.data_type().ok() != Some(ace::TableType::NeutronContinuous) { + return; + } + let (land, and) = (t.jxs[8], t.jxs[9]); + if land <= 0 { + return; + } + + let n = t.nxs[5] + 1; + d.int(format!("{path}/n"), n); + let locators: Vec = (0..n).map(|i| t.xss[(land + i) as usize] as i64).collect(); + d.ints(format!("{path}/locators"), locators.clone()); + for (i, &locator) in locators.iter().enumerate() { + if locator <= 0 { + continue; + } + let dist = AngleDistribution::from_ace(t, and, locator).unwrap(); + dump_angle_distribution(d, &format!("{path}/{i}"), &dist); + } +} + +/// Mirrors `ACE_XSS_SAMPLES` in `tools/dump_golden.py`. +const ACE_XSS_SAMPLES: usize = 2000; + +/// Mirrors `ace_xss_indices` in `tools/dump_golden.py`, index for index. +fn ace_xss_indices(n: usize, jxs: &[i64]) -> Vec { + let mut idx: BTreeSet = (0..n).step_by((n / ACE_XSS_SAMPLES).max(1)).collect(); + idx.extend(0..50.min(n)); + idx.extend(n.saturating_sub(50)..n); + // The JXS values are offsets into XSS: where a consumer actually looks. + for &j in jxs { + if j >= 0 && (j as usize) < n { + idx.insert(j as usize); + } + } + idx.into_iter().collect() +} + +fn dump_ace_table(d: &mut Dump, path: &str, t: &ace::Table) { + d.text(format!("{path}/name"), &t.name); + d.float(format!("{path}/atomic_weight_ratio"), t.atomic_weight_ratio); + d.float(format!("{path}/kT"), t.kt); + d.float(format!("{path}/temperature"), t.temperature()); + d.int(format!("{path}/zaid"), t.zaid().unwrap()); + d.text( + format!("{path}/data_type"), + &t.data_type().unwrap().suffix().to_string(), + ); + d.ints( + format!("{path}/pairs_iz"), + t.pairs.iter().map(|p| p.0).collect(), + ); + d.floats( + format!("{path}/pairs_aw"), + t.pairs.iter().map(|p| p.1).collect(), + ); + d.ints(format!("{path}/nxs"), t.nxs.clone()); + d.ints(format!("{path}/jxs"), t.jxs.clone()); + d.int(format!("{path}/xss_len"), t.xss.len() as i64); + let idx = ace_xss_indices(t.xss.len(), &t.jxs); + let values: Vec = idx.iter().map(|&i| t.xss[i]).collect(); + d.ints( + format!("{path}/xss_idx"), + idx.iter().map(|&i| i as i64).collect(), + ); + d.floats(format!("{path}/xss_val"), values); + + dump_ace_angle(d, &format!("{path}/and"), t); + dump_ace_dlw(d, &format!("{path}/dlw"), t); + dump_ace_reactions(d, &format!("{path}/reaction"), t); + dump_incident_neutron_ace(d, &format!("{path}/nuclide"), t); + + // The unresolved resonance block, when the table has one. + if let Some(urr) = endf::urr::ProbabilityTables::from_ace(t) { + d.floats(format!("{path}/urr/energy"), urr.energy.clone()); + d.ints( + format!("{path}/urr/shape"), + urr.shape.iter().map(|&v| v as i64).collect(), + ); + d.floats(format!("{path}/urr/table"), urr.table.clone()); + d.int(format!("{path}/urr/interpolation"), urr.interpolation); + d.int(format!("{path}/urr/inelastic_flag"), urr.inelastic_flag); + d.int(format!("{path}/urr/absorption_flag"), urr.absorption_flag); + d.int( + format!("{path}/urr/multiply_smooth"), + i64::from(urr.multiply_smooth), + ); + } +} + +fn dump_section(d: &mut Dump, path: &str, section: &Section) { + match section { + Section::Mf1Mt451(s) => { + for (key, value) in [ + ("ZA", s.za), + ("LRP", s.lrp), + ("LFI", s.lfi), + ("NLIB", s.nlib), + ("NMOD", s.nmod), + ("LIS", s.lis), + ("LISO", s.liso), + ("NFOR", s.nfor), + ("LREL", s.lrel), + ("NSUB", s.nsub), + ("NVER", s.nver), + ("LDRV", s.ldrv), + ("NWD", s.nwd), + ("NXC", s.nxc), + ] { + d.int(format!("{path}/{key}"), value); + } + for (key, value) in [ + ("AWR", s.awr), + ("ELIS", s.elis), + ("STA", s.sta), + ("AWI", s.awi), + ("EMAX", s.emax), + ("TEMP", s.temp), + ] { + d.float(format!("{path}/{key}"), value); + } + if let Some(zsymam) = &s.zsymam { + d.text(format!("{path}/ZSYMAM"), zsymam); + for (key, value) in [ + ("ALAB", &s.alab), + ("EDATE", &s.edate), + ("AUTH", &s.auth), + ("REF", &s.reference), + ("DDATE", &s.ddate), + ("RDATE", &s.rdate), + ("ENDATE", &s.endate), + ] { + d.text(format!("{path}/{key}"), value.as_deref().unwrap_or("")); + } + for (i, line) in s.hsub.iter().enumerate() { + d.text(format!("{path}/HSUB/{i}"), line); + } + for (i, line) in s.description.iter().enumerate() { + d.text(format!("{path}/description/{i}"), line); + } + } + for (i, &(mf, mt, nc, md)) in s.section_list.iter().enumerate() { + d.ints(format!("{path}/section_list/{i}"), vec![mf, mt, nc, md]); + } + } + + Section::Mf1Mt452(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LNU"), s.lnu); + dump_nu(d, path, &s.nu); + } + + Section::Mf1Mt455(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LDG"), s.ldg); + d.int(format!("{path}/LNU"), s.lnu); + if s.ldg == 0 { + d.floats(format!("{path}/lambda"), s.lambda.clone()); + } + if let Some(e_int) = &s.e_int { + d.tab2(&format!("{path}/E_int"), e_int); + } + for (i, c) in s.constants.iter().enumerate() { + d.float(format!("{path}/constants/{i}/E"), c.energy); + d.floats(format!("{path}/constants/{i}/lambda"), c.lambda.clone()); + d.floats(format!("{path}/constants/{i}/alpha"), c.alpha.clone()); + } + dump_nu(d, path, &s.nu); + } + + Section::Mf1Mt458(s) => { + d.float(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LFC"), s.lfc); + d.int(format!("{path}/NPLY"), s.nply); + if s.lfc == 1 { + d.int(format!("{path}/NFC"), s.nfc); + } + for (name, component) in FISSION_ENERGY_COMPONENTS.iter().zip(&s.components) { + match component { + FissionEnergyRelease::Polynomial(pairs) => { + let flat = pairs.iter().flat_map(|&(c, u)| [c, u]).collect(); + d.floats(format!("{path}/{name}/poly"), flat); + } + FissionEnergyRelease::Tabulated { ldrv, eifc } => { + d.int(format!("{path}/{name}/LDRV"), *ldrv); + d.tab1(&format!("{path}/{name}/EIFC"), eifc); + } + } + } + } + + Section::Mf1Mt460(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LO"), s.lo); + if s.lo == 1 { + d.int(format!("{path}/NG"), s.ng); + d.floats(format!("{path}/E"), s.energy.clone()); + } + for (i, t) in s.time.iter().enumerate() { + d.tab1(&format!("{path}/T/{i}"), t); + } + if s.lo == 2 { + d.floats(format!("{path}/lambda"), s.lambda.clone()); + } + } + + Section::Mf2(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NIS"), s.nis); + for (a, iso) in s.isotopes.iter().enumerate() { + let ip = format!("{path}/isotopes/{a}"); + d.float(format!("{ip}/ZAI"), iso.zai); + d.float(format!("{ip}/ABN"), iso.abn); + d.int(format!("{ip}/LFW"), iso.lfw); + d.int(format!("{ip}/NER"), iso.ner); + for (b, r) in iso.ranges.iter().enumerate() { + let rp = format!("{ip}/ranges/{b}"); + d.float(format!("{rp}/EL"), r.el); + d.float(format!("{rp}/EH"), r.eh); + d.int(format!("{rp}/LRU"), r.lru); + d.int(format!("{rp}/LRF"), r.lrf); + d.int(format!("{rp}/NRO"), r.nro); + d.int(format!("{rp}/NAPS"), r.naps); + dump_mf2_parameters(d, &rp, &r.parameters); + } + } + } + + Section::Mf3(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.float(format!("{path}/QM"), s.qm); + d.float(format!("{path}/QI"), s.qi); + d.int(format!("{path}/LR"), s.lr); + d.tab1(&format!("{path}/sigma"), &s.sigma); + } + + Section::Mf4(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LTT"), s.ltt); + d.int(format!("{path}/LI"), s.li); + d.int(format!("{path}/LCT"), s.lct); + if let Some(l) = &s.legendre { + let sp = format!("{path}/legendre"); + d.tab2(&format!("{sp}/E_int"), &l.e_int); + d.float(format!("{sp}/T"), l.t); + d.int(format!("{sp}/LT"), l.lt); + d.floats(format!("{sp}/E"), l.energy.clone()); + for (i, a) in l.a_l.iter().enumerate() { + d.floats(format!("{sp}/a_l/{i}"), a.clone()); + } + } + if let Some(t) = &s.tabulated { + let sp = format!("{path}/tabulated"); + d.tab2(&format!("{sp}/E_int"), &t.e_int); + d.float(format!("{sp}/T"), t.t); + d.int(format!("{sp}/LT"), t.lt); + d.floats(format!("{sp}/E"), t.energy.clone()); + for (i, mu) in t.mu.iter().enumerate() { + d.tab1(&format!("{sp}/mu/{i}"), mu); + } + } + + // The interpreted form, which is what a consumer actually uses. + let dist = AngleDistribution::from_mf4(s); + dump_angle_distribution(d, &format!("{path}/angle"), &dist); + if !dist.energy.is_empty() { + for cutoff in [-1.0, -0.5, 0.0, 0.5] { + let name = format!("{cutoff:+.1}"); + d.floats( + format!("{path}/angle/forward_fraction/{name}"), + dist.forward_fraction(cutoff), + ); + } + } + } + + Section::Mf5(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NK"), s.nk); + for (i, sub) in s.subsections.iter().enumerate() { + let sp = format!("{path}/subsections/{i}"); + d.int(format!("{sp}/LF"), sub.lf); + d.tab1(&format!("{sp}/p"), &sub.p); + let dp = format!("{sp}/distribution"); + match &sub.distribution { + EnergyDistribution::ArbitraryTabulated { e_int, energy, g } => { + d.tab2(&format!("{dp}/E_int"), e_int); + d.floats(format!("{dp}/E"), energy.clone()); + for (j, t) in g.iter().enumerate() { + d.tab1(&format!("{dp}/g/{j}"), t); + } + } + EnergyDistribution::GeneralEvaporation { u, theta, g } => { + d.float(format!("{dp}/U"), *u); + d.tab1(&format!("{dp}/theta"), theta); + d.tab1(&format!("{dp}/g"), g); + } + EnergyDistribution::MaxwellEnergy { u, theta } + | EnergyDistribution::Evaporation { u, theta } => { + d.float(format!("{dp}/U"), *u); + d.tab1(&format!("{dp}/theta"), theta); + } + EnergyDistribution::WattEnergy { u, a, b } => { + d.float(format!("{dp}/U"), *u); + d.tab1(&format!("{dp}/a"), a); + d.tab1(&format!("{dp}/b"), b); + } + EnergyDistribution::MadlandNix { efl, efh, t_m } => { + d.float(format!("{dp}/EFL"), *efl); + d.float(format!("{dp}/EFH"), *efh); + d.tab1(&format!("{dp}/T_M"), t_m); + } + // The remaining three have no ENDF law and can only come + // from an ACE table, where `dump_energy_distribution` + // handles them. + other => unreachable!("{dp}: {other:?} is not an ENDF law"), + } + } + } + + Section::Mf6(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/JP"), s.jp); + d.int(format!("{path}/LCT"), s.lct); + d.int(format!("{path}/NK"), s.nk); + for (i, p) in s.products.iter().enumerate() { + let pp = format!("{path}/products/{i}"); + d.int(format!("{pp}/ZAP"), p.zap); + d.float(format!("{pp}/AWP"), p.awp); + d.int(format!("{pp}/LIP"), p.lip); + d.int(format!("{pp}/LAW"), p.law); + d.tab1(&format!("{pp}/y_i"), &p.yield_); + dump_mf6_distribution(d, &format!("{pp}/distribution"), &p.distribution); + } + } + + Section::Mf7Mt2(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LTHR"), s.lthr); + if let Some(c) = &s.coherent { + d.float(format!("{path}/coherent/0/T"), c.t); + d.int(format!("{path}/coherent/0/LT"), c.lt); + d.tab1(&format!("{path}/coherent/0/S"), &c.s); + for (i, o) in c.others.iter().enumerate() { + let tp = format!("{path}/coherent/{}", i + 1); + d.float(format!("{tp}/T"), o.t); + d.int(format!("{tp}/LI"), o.li); + d.floats(format!("{tp}/S"), o.s.clone()); + } + } + if let Some(i) = &s.incoherent { + d.float(format!("{path}/incoherent/SB"), i.sb); + d.tab1(&format!("{path}/incoherent/W"), &i.w); + } + } + + Section::Mf7Mt4(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + for (key, value) in [ + ("LAT", s.lat), + ("LASYM", s.lasym), + ("LLN", s.lln), + ("NI", s.ni), + ("NS", s.ns), + ] { + d.int(format!("{path}/{key}"), value); + } + d.floats(format!("{path}/B"), s.b.clone()); + if let Some(bi) = &s.beta_int { + d.tab2(&format!("{path}/beta_int"), bi); + d.int(format!("{path}/NB"), s.nb); + } + for (i, law) in s.beta_data.iter().enumerate() { + let tp = format!("{path}/beta_data/{i}/0"); + d.float(format!("{tp}/T"), law.t); + d.float(format!("{tp}/beta"), law.beta); + d.int(format!("{tp}/LT"), law.lt); + d.tab1(&format!("{tp}/S"), &law.s); + for (j, o) in law.others.iter().enumerate() { + let tp = format!("{path}/beta_data/{i}/{}", j + 1); + d.float(format!("{tp}/T"), o.t); + d.float(format!("{tp}/beta"), o.beta); + d.int(format!("{tp}/LT"), o.lt); + d.floats(format!("{tp}/S"), o.s.clone()); + } + } + for (i, t) in s.teff.iter().enumerate() { + d.tab1(&format!("{path}/Teff/{i}"), t); + } + } + + Section::Mf7Mt451(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NA"), s.na); + for (i, e) in s.elements.iter().enumerate() { + let ep = format!("{path}/elements/{i}"); + d.int(format!("{ep}/NAS"), e.nas); + d.int(format!("{ep}/NI"), e.ni); + for (key, values) in [ + ("ZAI", &e.zai), + ("LISI", &e.lisi), + ("AFI", &e.afi), + ("AWRI", &e.awri), + ("SFI", &e.sfi), + ] { + d.floats(format!("{ep}/{key}"), values.clone()); + } + } + } + + Section::Mf8(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + for (key, value) in [("LIS", s.lis), ("LISO", s.liso), ("NS", s.ns), ("NO", s.no)] { + d.int(format!("{path}/{key}"), value); + } + for (i, sub) in s.subsections.iter().enumerate() { + let sp = format!("{path}/subsections/{i}"); + d.float(format!("{sp}/ZAP"), sub.zap); + d.float(format!("{sp}/ELFS"), sub.elfs); + d.int(format!("{sp}/LMF"), sub.lmf); + d.int(format!("{sp}/LFS"), sub.lfs); + if let Some(nd) = sub.nd { + d.int(format!("{sp}/ND"), nd); + for (key, values) in [ + ("HL", &sub.hl), + ("RTYP", &sub.rtyp), + ("ZAN", &sub.zan), + ("BR", &sub.br), + ("END", &sub.end), + ("CT", &sub.ct), + ] { + d.floats(format!("{sp}/{key}"), values.clone()); + } + } + } + } + + Section::Mf8Mt454(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LE"), s.le); + for (i, y) in s.yields.iter().enumerate() { + let yp = format!("{path}/yields/{i}"); + d.float(format!("{yp}/E"), y.energy); + d.int(format!("{yp}/NN"), y.nn); + d.int(format!("{yp}/NFP"), y.nfp); + d.int(format!("{yp}/LE_or_I"), y.le_or_interpolation); + for (j, p) in y.products.iter().enumerate() { + let pp = format!("{yp}/products/{j}"); + d.float(format!("{pp}/ZAFP"), p.zafp); + d.float(format!("{pp}/FPS"), p.fps); + d.floats(format!("{pp}/Y"), vec![p.y.0, p.y.1]); + } + } + } + + Section::Mf8Mt457(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + for (key, value) in [ + ("LIS", s.lis), + ("LISO", s.liso), + ("NST", s.nst), + ("NSP", s.nsp), + ] { + d.int(format!("{path}/{key}"), value); + } + d.float(format!("{path}/SPI"), s.spi); + d.float(format!("{path}/PAR"), s.par); + if s.nst == 1 { + return; + } + if let Some(hl) = s.half_life { + d.floats(format!("{path}/T1_2"), vec![hl.0, hl.1]); + } + d.int(format!("{path}/NC"), s.nc); + d.floats( + format!("{path}/Ex"), + s.ex.iter().flat_map(|&(a, b)| [a, b]).collect(), + ); + d.int(format!("{path}/NDK"), s.ndk); + for (i, m) in s.modes.iter().enumerate() { + let mp = format!("{path}/modes/{i}"); + d.float(format!("{mp}/RTYP"), m.rtyp); + d.float(format!("{mp}/RFS"), m.rfs); + d.floats(format!("{mp}/Q"), vec![m.q.0, m.q.1]); + d.floats(format!("{mp}/BR"), vec![m.br.0, m.br.1]); + } + for (i, sp_) in s.spectra.iter().enumerate() { + let sp = format!("{path}/spectra/{i}"); + d.float(format!("{sp}/STYP"), sp_.styp); + d.int(format!("{sp}/LCON"), sp_.lcon); + d.int(format!("{sp}/LCOV"), sp_.lcov); + d.int(format!("{sp}/NER"), sp_.ner); + d.floats(format!("{sp}/FD"), vec![sp_.fd.0, sp_.fd.1]); + d.floats(format!("{sp}/ER_AV"), vec![sp_.er_av.0, sp_.er_av.1]); + d.floats(format!("{sp}/FC"), vec![sp_.fc.0, sp_.fc.1]); + for (j, r) in sp_.discrete.iter().enumerate() { + let rp = format!("{sp}/discrete/{j}"); + d.floats(format!("{rp}/ER"), vec![r.er.0, r.er.1]); + d.float(format!("{rp}/RTYP"), r.rtyp); + d.float(format!("{rp}/TYPE"), r.type_); + d.floats(format!("{rp}/RI"), vec![r.ri.0, r.ri.1]); + for (key, value) in [ + ("RIS", r.ris), + ("RICC", r.ricc), + ("RICK", r.rick), + ("RICL", r.ricl), + ] { + if let Some(v) = value { + d.floats(format!("{rp}/{key}"), vec![v.0, v.1]); + } + } + } + if let Some(c) = &sp_.continuous { + d.float(format!("{sp}/continuous/RTYP"), c.rtyp); + d.tab1(&format!("{sp}/continuous/RP"), &c.rp); + } + if let Some(c) = &sp_.continuous_covariance { + d.int(format!("{sp}/cont_cov/LB"), c.lb); + d.floats(format!("{sp}/cont_cov/Ek"), c.ek.clone()); + d.floats(format!("{sp}/cont_cov/Fk"), c.fk.clone()); + } + if let Some(c) = &sp_.discrete_covariance { + d.int(format!("{sp}/disc_cov/LS"), c.ls); + d.int(format!("{sp}/disc_cov/LB"), c.lb); + d.int(format!("{sp}/disc_cov/NE"), c.ne); + d.int(format!("{sp}/disc_cov/NERP"), c.nerp); + d.floats(format!("{sp}/disc_cov/Ek"), c.ek.clone()); + d.floats(format!("{sp}/disc_cov/Fkk"), c.fkk.clone()); + } + } + } + + Section::Mf9Mf10(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LIS"), s.lis); + d.int(format!("{path}/NS"), s.ns); + for (i, level) in s.levels.iter().enumerate() { + let lp = format!("{path}/levels/{i}"); + d.float(format!("{lp}/QM"), level.qm); + d.float(format!("{lp}/QI"), level.qi); + d.int(format!("{lp}/IZAP"), level.izap); + d.int(format!("{lp}/LFS"), level.lfs); + d.tab1(&format!("{lp}/func"), &level.func); + } + } + + Section::Mf12(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LO"), s.lo); + d.int(format!("{path}/NK"), s.nk); + if let Some(y) = &s.total_yield { + d.tab1(&format!("{path}/Y"), y); + } + for (i, k) in s.multiplicities.iter().enumerate() { + let kp = format!("{path}/multiplicities/{i}"); + d.float(format!("{kp}/Eg"), k.eg); + d.float(format!("{kp}/ES"), k.es); + d.int(format!("{kp}/LP"), k.lp); + d.int(format!("{kp}/LF"), k.lf); + d.tab1(&format!("{kp}/y"), &k.y); + } + if let Some(lg) = s.lg { + d.int(format!("{path}/LG"), lg); + d.float(format!("{path}/ES_NS"), s.es_ns); + d.int(format!("{path}/LP"), s.lp); + d.int(format!("{path}/NT"), s.nt); + for (i, t) in s.transitions.iter().enumerate() { + let tp = format!("{path}/transitions/{i}"); + d.float(format!("{tp}/ES"), t.es); + d.float(format!("{tp}/TP"), t.tp); + if let Some(gp) = t.gp { + d.float(format!("{tp}/GP"), gp); + } + } + } + } + + Section::Mf13(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NK"), s.nk); + if let Some(t) = &s.sigma_total { + d.tab1(&format!("{path}/sigma_total"), t); + } + for (i, p) in s.photons.iter().enumerate() { + let pp = format!("{path}/photons/{i}"); + d.float(format!("{pp}/EG"), p.eg); + d.float(format!("{pp}/ES"), p.es); + d.int(format!("{pp}/LP"), p.lp); + d.int(format!("{pp}/LF"), p.lf); + d.tab1(&format!("{pp}/sigma"), &p.sigma); + } + } + + Section::Mf14(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LI"), s.li); + d.int(format!("{path}/NK"), s.nk); + if let (Some(ltt), Some(ni)) = (s.ltt, s.ni) { + d.int(format!("{path}/LTT"), ltt); + d.int(format!("{path}/NI"), ni); + } + for (i, sub) in s.subsections.iter().enumerate() { + let sp = format!("{path}/subsections/{i}"); + d.float(format!("{sp}/EG"), sub.eg); + d.float(format!("{sp}/ES"), sub.es); + if let Some(e_int) = &sub.e_int { + d.tab2(&format!("{sp}/E_int"), e_int); + d.int(format!("{sp}/NE"), sub.ne); + d.floats(format!("{sp}/E"), sub.energy.clone()); + } + if !sub.nl.is_empty() { + d.floats(format!("{sp}/NL"), sub.nl.clone()); + } + for (j, a) in sub.a_lk.iter().enumerate() { + d.floats(format!("{sp}/a_lk/{j}"), a.clone()); + } + for (j, p) in sub.p_k.iter().enumerate() { + d.tab1(&format!("{sp}/p_k/{j}"), p); + } + } + } + + Section::Mf15(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NC"), s.nc); + for (i, sub) in s.subsections.iter().enumerate() { + let sp = format!("{path}/subsections/{i}"); + d.int(format!("{sp}/LF"), sub.lf); + d.tab1(&format!("{sp}/p"), &sub.p); + d.tab2(&format!("{sp}/E_int"), &sub.e_int); + d.int(format!("{sp}/NE"), sub.ne); + d.floats(format!("{sp}/E"), sub.energy.clone()); + for (j, g) in sub.g.iter().enumerate() { + d.tab1(&format!("{sp}/g/{j}"), g); + } + } + } + + Section::Mf23(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.float(format!("{path}/EPE"), s.epe); + d.float(format!("{path}/EFL"), s.efl); + d.tab1(&format!("{path}/sigma"), &s.sigma); + } + + Section::Mf26(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NK"), s.nk); + for (i, p) in s.products.iter().enumerate() { + let pp = format!("{path}/products/{i}"); + d.int(format!("{pp}/ZAP"), p.zap); + d.float(format!("{pp}/AWI"), p.awi); + d.int(format!("{pp}/LAW"), p.law); + d.tab1(&format!("{pp}/y"), &p.yield_); + let dp = format!("{pp}/distribution"); + match &p.distribution { + ElectroAtomicDistribution::None => {} + ElectroAtomicDistribution::EnergyTransfer(t) => d.tab1(&format!("{dp}/ET"), t), + ElectroAtomicDistribution::ContinuumEnergyAngle(c) => { + dump_mf6_distribution( + d, + &dp, + &Mf6Distribution::ContinuumEnergyAngle((**c).clone()), + ); + } + ElectroAtomicDistribution::DiscreteTwoBody(t) => { + dump_mf6_distribution( + d, + &dp, + &Mf6Distribution::DiscreteTwoBody((**t).clone()), + ); + } + } + } + } + + Section::Mf27(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.float(format!("{path}/Z"), s.z); + d.tab1(&format!("{path}/H"), &s.h); + } + + Section::Mf28(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/NSS"), s.nss); + for (i, sh) in s.shells.iter().enumerate() { + let sp = format!("{path}/shells/{i}"); + d.float(format!("{sp}/SUBI"), sh.subi); + d.int(format!("{sp}/NTR"), sh.ntr); + d.float(format!("{sp}/EBI"), sh.ebi); + d.float(format!("{sp}/ELN"), sh.eln); + for (key, values) in [ + ("SUBJ", &sh.subj), + ("SUBK", &sh.subk), + ("ETR", &sh.etr), + ("FTR", &sh.ftr), + ] { + d.floats(format!("{sp}/{key}"), values.clone()); + } + } + } + + Section::Mf33(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/MTL"), s.mtl); + d.int(format!("{path}/NL"), s.nl); + for (i, sub) in s.subsections.iter().enumerate() { + dump_mf33_subsection(d, &format!("{path}/subsections/{i}"), sub); + } + } + + Section::Mf34(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LTT"), s.ltt); + d.int(format!("{path}/NMT1"), s.nmt1); + // Always empty, matching upstream; see issue #18. + for (i, sub) in s.subsections.iter().enumerate() { + let sp = format!("{path}/subsections/{i}"); + for (key, value) in [ + ("MAT1", sub.mat1), + ("MT1", sub.mt1), + ("NL", sub.nl), + ("NSS", sub.nss), + ("LCT", sub.lct), + ] { + d.int(format!("{sp}/{key}"), value); + } + for (key, values) in [("L", &sub.l), ("L1", &sub.l1), ("NI", &sub.ni)] { + d.floats(format!("{sp}/{key}"), values.clone()); + } + for (j, ss) in sub.subsubsections.iter().enumerate() { + let ssp = format!("{sp}/subsubsections/{j}"); + for (key, values) in [ + ("LS", &ss.ls), + ("LB", &ss.lb), + ("NT", &ss.nt), + ("NE", &ss.ne), + ] { + d.floats(format!("{ssp}/{key}"), values.clone()); + } + for (k, values) in ss.data.iter().enumerate() { + d.floats(format!("{ssp}/Data/{k}"), values.clone()); + } + } + } + } + + Section::Mf40(s) => { + d.int(format!("{path}/ZA"), s.za); + d.float(format!("{path}/AWR"), s.awr); + d.int(format!("{path}/LIS"), s.lis); + d.int(format!("{path}/NS"), s.ns); + for (i, sub) in s.subsections.iter().enumerate() { + let sp = format!("{path}/subsections/{i}"); + d.float(format!("{sp}/QM"), sub.qm); + d.float(format!("{sp}/QI"), sub.qi); + d.int(format!("{sp}/IZAP"), sub.izap); + d.int(format!("{sp}/LFS"), sub.lfs); + d.int(format!("{sp}/NL"), sub.nl); + for (j, ss) in sub.subsubsections.iter().enumerate() { + dump_mf33_subsection(d, &format!("{sp}/subsubsections/{j}"), ss); + } + } + } + + Section::Unparsed { .. } => {} + } +} + +// -------------------------------------------------------------------------- + +fn repo_root() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("..").join("..") +} + +fn golden_dir() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("golden") +} + +/// The golden file, split into the structural records and the value map. +struct Golden { + /// "ace" for an ACE fixture; ENDF materials otherwise. + kind: String, + n_tables: usize, + source: String, + n_materials: usize, + /// (material index, MF, MT) -> body line count. + sections: BTreeMap<(usize, i32, i32), usize>, + /// material index -> MAT number. + mats: BTreeMap, + values: BTreeMap, + /// `KIND chain` only: the evaluations the chain is built from. + decay: Vec, + neutron: Vec, + chain_reactions: Vec, +} + +fn parse_golden(text: &str, name: &str) -> Golden { + let mut g = Golden { + kind: String::new(), + n_tables: 0, + decay: Vec::new(), + neutron: Vec::new(), + chain_reactions: Vec::new(), + source: String::new(), + n_materials: 0, + sections: BTreeMap::new(), + mats: BTreeMap::new(), + values: BTreeMap::new(), + }; + + for (i, line) in text.lines().enumerate() { + let at = format!("{name}:{}", i + 1); + if line.trim_start().starts_with('#') || line.trim().is_empty() { + continue; + } + let mut parts = line.split_whitespace(); + let key = parts.next().unwrap_or(""); + let f: Vec<&str> = parts.collect(); + match key { + "KIND" => g.kind = f[0].to_string(), + "DECAY" => g.decay.push(f[0].to_string()), + "NEUTRON" => g.neutron.push(f[0].to_string()), + "REACTION" => g.chain_reactions.push(f[0].to_string()), + "TABLES" => g.n_tables = f[0].parse().unwrap(), + "SOURCE" => g.source = f[0].to_string(), + "MATERIALS" => g.n_materials = f[0].parse().unwrap(), + "MAT" => { + g.mats.insert(f[0].parse().unwrap(), f[1].parse().unwrap()); + } + "SECTION" => { + let k = ( + f[0].parse().unwrap(), + f[1].parse().unwrap(), + f[2].parse().unwrap(), + ); + g.sections.insert(k, f[3].parse().unwrap()); + } + "V" => { + let path = f[0].to_string(); + let rest = &f[2..]; + let value = match f[1] { + "F" => Value::Floats( + rest.iter() + .map(|s| { + s.parse() + .unwrap_or_else(|_| panic!("{at}: bad float {s:?}")) + }) + .collect(), + ), + "I" => Value::Ints( + rest.iter() + .map(|s| s.parse().unwrap_or_else(|_| panic!("{at}: bad int {s:?}"))) + .collect(), + ), + "T" => { + let hex = rest.first().copied().unwrap_or(""); + let bytes: Vec = (0..hex.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&hex[i..i + 2], 16).unwrap()) + .collect(); + Value::Text(String::from_utf8(bytes).unwrap()) + } + other => panic!("{at}: unknown value tag {other:?}"), + }; + g.values.insert(path, value); + } + other => panic!("{at}: unknown golden record {other:?}"), + } + } + g +} + +/// Compare the two `path -> value` maps whole. +/// +/// Shared by the ENDF and ACE paths: a field renamed, dropped or added shows up +/// as a path on one side and not the other, whatever produced it. +/// Whether a path holds values computed rather than read off the file. +/// +/// Two kinds qualify. `…/evaly` is the sampled interpolation the dump takes of +/// every TAB1. The reaction yields are the other: a product given by MF=10 as +/// a production cross section becomes a yield by dividing two interpolated +/// cross sections on their union grid, and the Python reader does that with +/// NumPy's array `log`, whose SIMD implementation differs from scalar `log` in +/// the last bit. The tolerance is 1e-12 relative, so a real disagreement — a +/// wrong value, a wrong index, a wrong law — still fails; only last-bit noise +/// passes. It also covers the MF=9 yields, which are read verbatim and would +/// otherwise be compared exactly. +fn is_interpolated(path: &str) -> bool { + path.ends_with("/evaly") + || (path.contains("/reaction/") && path.contains("/yield/f/")) + // The propagated uncertainties. The Python package gets these from + // `uncertainties`, which accumulates a variance and takes its square + // root, where the port applies the derivative directly. The two agree + // to the last bit or two, and the nominal values — the first entry of + // each pair — are exact either way. + || path.ends_with("/decay_constant") + || path.ends_with("/decay_energy") + // The forward-scattered fraction, and the removal cross section that + // folds it into the total. Both integrate a Legendre series, and NumPy + // changed the association of the Clenshaw recurrence between 2.2 and + // 2.4 — the results differ in the last bit or two depending on which + // NumPy wrote the golden, so no single implementation can match both + // exactly. The values are all within 1e-15 of each other. + || path.contains("/forward_fraction/") + || path.contains("/removal_xs/") +} + +fn compare(name: &str, ours: &BTreeMap, theirs: &BTreeMap) { + let ours_keys: BTreeSet<&String> = ours.keys().collect(); + let theirs_keys: BTreeSet<&String> = theirs.keys().collect(); + let missing: Vec<&&String> = theirs_keys.difference(&ours_keys).take(10).collect(); + let extra: Vec<&&String> = ours_keys.difference(&theirs_keys).take(10).collect(); + assert!( + missing.is_empty(), + "{name}: the Rust reader did not produce {} paths, e.g. {missing:?}", + theirs_keys.difference(&ours_keys).count() + ); + assert!( + extra.is_empty(), + "{name}: the Rust reader produced {} paths the Python reader does not, e.g. {extra:?}", + ours_keys.difference(&theirs_keys).count() + ); + + for (path, want) in theirs { + let got = &ours[path]; + assert_eq!( + got.kind(), + want.kind(), + "{name}: {path} is {} in Rust and {} in Python", + got.kind(), + want.kind() + ); + match (got, want) { + // Interpolation is arithmetic, not parsing: the two languages + // evaluate the same expression but need not round identically once + // logs and exps are involved. + (Value::Floats(a), Value::Floats(b)) if is_interpolated(path) => { + assert_eq!(a.len(), b.len(), "{name}: {path} length"); + for (i, (&got, &want)) in a.iter().zip(b).enumerate() { + // What is being checked is that the two readers agree, not + // that the answer is finite. A tabulated S(alpha, beta) can + // hold zeros, and log-linear interpolation across one gives + // NaN in both languages alike — a real property of the + // evaluation, reproduced faithfully. Comparing those with + // subtraction would fail on NaN != NaN and hide it. + let agree = if want.is_nan() { + got.is_nan() + } else if want.is_infinite() { + got == want + } else { + (got - want).abs() <= EVAL_TOL * want.abs().max(1.0) + }; + assert!(agree, "{name}: {path}[{i}]: rust {got} != python {want}"); + } + } + _ => assert_eq!(got, want, "{name}: {path}"), + } + } +} + +/// Compare one golden file against the Rust reader. Returns paths compared. +fn check(golden_path: &Path) -> usize { + let text = read_text(golden_path); + let name = golden_path + .file_name() + .unwrap() + .to_string_lossy() + .to_string(); + let g = parse_golden(&text, &name); + + let source_path = repo_root().join(&g.source); + + if g.kind == "chain" { + let read = |paths: &[String]| -> Vec { + paths + .iter() + .map(|p| Material::from_str(&read_text(&repo_root().join(p))).unwrap()) + .collect() + }; + let reactions: Vec<&str> = g.chain_reactions.iter().map(String::as_str).collect(); + let chain = + endf::Chain::from_endf(&read(&g.decay), &[], &read(&g.neutron), &reactions).unwrap(); + let mut d = Dump::default(); + dump_chain(&mut d, "chain", &chain); + compare(&name, &d.map, &g.values); + return g.values.len(); + } + + if g.kind == "ace" { + let tables = ace::tables_from_str(&read_text(&source_path), None) + .unwrap_or_else(|e| panic!("{name}: the Rust reader failed on {}: {e}", g.source)); + assert_eq!(tables.len(), g.n_tables, "{name}: table count"); + let mut d = Dump::default(); + for (i, table) in tables.iter().enumerate() { + dump_ace_table(&mut d, &i.to_string(), table); + } + compare(&name, &d.map, &g.values); + return g.values.len(); + } + + let endf_text = read_text(&source_path); + + let materials = materials_from_str(&endf_text) + .unwrap_or_else(|e| panic!("{name}: the Rust reader failed on {}: {e}", g.source)); + + assert_eq!(materials.len(), g.n_materials, "{name}: material count"); + + let mut d = Dump::default(); + let mut sections: BTreeMap<(usize, i32, i32), usize> = BTreeMap::new(); + for (m, material) in materials.iter().enumerate() { + assert_eq!( + Some(&material.mat), + g.mats.get(&m), + "{name}: material {m} number" + ); + for (&(mf, mt), body) in &material.section_text { + sections.insert((m, mf, mt), body.lines().count()); + } + for (&(mf, mt), section) in &material.section_data { + dump_section(&mut d, &format!("{m}/{mf}/{mt}"), section); + } + dump_radionuclide_production(&mut d, &format!("{m}/production"), material); + dump_reactions(&mut d, &format!("{m}/reaction"), material); + dump_incident_neutron_endf(&mut d, &format!("{m}/nuclide"), material); + dump_decay(&mut d, &format!("{m}/decay"), material); + dump_incident_photon(&mut d, &format!("{m}/photon"), material); + } + + assert_eq!(sections, g.sections, "{name}: section splitting differs"); + + compare(&name, &d.map, &g.values); + + g.values.len() +} + +#[test] +fn matches_the_python_reader() { + let dir = golden_dir(); + let mut goldens: Vec = std::fs::read_dir(&dir) + .unwrap_or_else(|e| panic!("reading {}: {e}", dir.display())) + .filter_map(|e| e.ok().map(|e| e.path())) + .filter(|p| has_kind(p, "txt")) + .collect(); + goldens.sort(); + + assert!(!goldens.is_empty(), "no golden files in {}", dir.display()); + + let mut total = 0usize; + for path in &goldens { + total += check(path); + } + println!("{} golden files, {total} paths compared", goldens.len()); +} + +#[test] +fn unported_files_keep_their_text() { + // The port proceeds file by file, so a section with no Rust parser must + // still round-trip its text for the Python reader to fall back to. + // + // Built synthetically rather than taken from a fixture: every file in + // every fixture on this branch is now ported, and a test that depends on + // that not being true stops testing anything the moment it stops holding. + // MF=32 (resonance parameter covariances) is not parsed by the Python + // reader either — its dispatch warns and ignores — so it is a stable + // choice rather than one the next commit invalidates. + const MF: i32 = 32; + let line = + |body: &str, mat: i32, mf: i32, mt: i32| format!("{body:<66}{mat:>4}{mf:>2}{mt:>3}\n"); + let text = line(" tape id", 1, 0, 0) + + &line(" 1.001000+3 9.991673-1 0 0 1 0", 125, MF, 2) + + &line(" 0.000000+0 0.000000+0 0 2 1 1", 125, MF, 2) + + &line("", 125, MF, 0) // SEND + + &line("", 0, 0, 0); // MEND + + let m = Material::from_str(&text).unwrap(); + assert_eq!(m.mat, 125); + + let unparsed: Vec<(i32, i32)> = m + .section_data + .iter() + .filter(|(_, s)| matches!(s, Section::Unparsed { .. })) + .map(|(&k, _)| k) + .collect(); + assert_eq!(unparsed, vec![(MF, 2)], "MF={MF} should not have a parser"); + + // The body is kept whole, SEND excluded, so the Python reader can take it. + let body = &m.section_text[&(MF, 2)]; + assert_eq!(body.lines().count(), 2); + assert!(body.contains("1.001000+3")); +} + +/// The files that have a Rust parser but which no fixture exercises. +/// +/// These are written and structurally complete but have never been run against +/// a real evaluation, so nothing here is checked against the Python reader. +/// Kept as an explicit list rather than a remark in a commit message: the test +/// below fails when a fixture starts covering one of them, which is the moment +/// the entry should be deleted. +const UNCOVERED_BY_ANY_FIXTURE: [i32; 1] = [40]; + +/// The MF files that have a Rust parser at all. +const PORTED: [i32; 21] = [ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 23, 26, 27, 28, 33, 34, 40, +]; + +#[test] +fn the_uncovered_parser_list_is_accurate() { + let mut seen: BTreeSet = BTreeSet::new(); + for entry in std::fs::read_dir(repo_root().join("tests")).unwrap() { + let path = entry.unwrap().path(); + if !has_kind(&path, "endf") { + continue; + } + let text = read_text(&path); + for m in materials_from_str(&text).unwrap() { + seen.extend(m.section_data.keys().map(|&(mf, _)| mf)); + } + } + + let uncovered: BTreeSet = PORTED + .iter() + .copied() + .filter(|mf| !seen.contains(mf)) + .collect(); + let declared: BTreeSet = UNCOVERED_BY_ANY_FIXTURE.into_iter().collect(); + assert_eq!( + uncovered, declared, + "the list of parsers no fixture exercises has changed. If a fixture now \ + covers one of these, delete it from UNCOVERED_BY_ANY_FIXTURE; if a new \ + parser has no coverage, add it." + ); +} + +/// Every distribution shape the object dumpers can write. +/// +/// Three ENDF laws are missing on purpose. LF=1, LF=5 and LF=12 reach the +/// golden files through the MF=5 section dump, which is driven by the Python +/// reader's dictionaries and writes no `kind` line, so this scan cannot see +/// them. Their fixture coverage is tracked in `golden/README.md` instead. +/// +/// ACE law 5 is missing for a different reason: the Python reader has no +/// `from_ace` for the general evaporation spectrum and dies with an +/// AttributeError, so there is nothing to compare against (issue #19). The +/// Rust reader refuses that law by name. +const DISTRIBUTION_SHAPES: [&str; 16] = [ + // Univariate shapes. + "discrete", + "tabular", + "uniform", + "mixture", + // Angular distribution shapes, from ENDF. + "legendre", + "tabulated", + // Energy distribution laws an ACE table can carry. + "maxwell", + "evaporation", + "watt", + "level-inelastic", + "discrete-photon", + "continuous-tabular", + // Joint angle-energy shapes. + "uncorrelated", + "kalbach-mann", + "correlated", + "nbody", +]; + +/// Every distribution shape is reached by some fixture. +/// +/// The golden files are the evidence: a shape that no fixture produces leaves +/// no `kind` line, and this says which one rather than the gap going unnoticed. +#[test] +fn every_distribution_shape_has_a_fixture() { + let mut seen: BTreeSet = BTreeSet::new(); + for entry in std::fs::read_dir(repo_root().join("crates/endf/tests/golden")).unwrap() { + let path = entry.unwrap().path(); + if !has_kind(&path, "txt") { + continue; + } + for line in read_text(&path).lines() { + // `V /kind T ` + let mut parts = line.split_whitespace(); + let (Some("V"), Some(p), Some("T"), Some(hex)) = + (parts.next(), parts.next(), parts.next(), parts.next()) + else { + continue; + }; + if !p.ends_with("/kind") { + continue; + } + let bytes: Vec = (0..hex.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&hex[i..i + 2], 16).unwrap()) + .collect(); + seen.insert(String::from_utf8(bytes).unwrap()); + } + } + + let missing: Vec<&&str> = DISTRIBUTION_SHAPES + .iter() + .filter(|s| !seen.contains(**s)) + .collect(); + assert!( + missing.is_empty(), + "no fixture produces these distribution shapes: {missing:?}" + ); +} + +/// Every fixture is now fully parsed. This guards the claim: if a fixture is +/// added that contains a file with no Rust parser, it says so by name rather +/// than the coverage quietly slipping. +#[test] +fn every_fixture_section_has_a_parser() { + let mut missing: BTreeSet<(String, i32, i32)> = BTreeSet::new(); + for entry in std::fs::read_dir(repo_root().join("tests")).unwrap() { + let path = entry.unwrap().path(); + if !has_kind(&path, "endf") { + continue; + } + let name = path.file_name().unwrap().to_string_lossy().to_string(); + let text = read_text(&path); + for m in materials_from_str(&text).unwrap() { + for (&(mf, mt), section) in &m.section_data { + if matches!(section, Section::Unparsed { .. }) { + missing.insert((name.clone(), mf, mt)); + } + } + } + } + assert!( + missing.is_empty(), + "fixtures contain files with no Rust parser: {missing:?}" + ); +} diff --git a/crates/endf/tests/golden/Li6.txt.xz b/crates/endf/tests/golden/Li6.txt.xz new file mode 100644 index 0000000..3face8a Binary files /dev/null and b/crates/endf/tests/golden/Li6.txt.xz differ diff --git a/crates/endf/tests/golden/README.md b/crates/endf/tests/golden/README.md new file mode 100644 index 0000000..ca30adb --- /dev/null +++ b/crates/endf/tests/golden/README.md @@ -0,0 +1,187 @@ +# Golden files + +Each `.txt.xz` here is a reference dump of what the **Python** reader produces +for one ENDF evaluation. `tests/golden.rs` reads every one of them, runs the Rust +reader over the evaluation the `SOURCE` line names, and compares. + +This is what makes the port safe: the Rust crate is not being written against +the ENDF-102 manual alone, it is being held to a reader that already works. + +## ACE fixtures + +A `.ace` fixture is dumped differently — ACE has tables, not materials — so its +golden opens with `KIND ace` and the Rust side reads it through +`endf::ace` instead. The XSS array runs to hundreds of thousands of numbers, so +the dump records a spread across it plus both ends and every JXS entry point, +which is where a consumer actually looks. Everything else is recorded in full. + +On top of the raw arrays, the ACE dump walks the blocks a transport code +reads: every locator in AND (the angular distributions), the whole of DLW (the +joint angle-energy distributions, following the linked list each reaction +carries), and every reaction the table holds, elastic scattering included. +That turns the ACE fixtures into a check on the interpretation, not only on the +numbers. + +## Compression + +Fixtures and dumps are both stored xz-compressed. An evaluation is highly +repetitive: the fixtures go 4.1 MB to 655 KB and the dumps 5.3 MB to 748 KB, +about six and seven to one. The Python side reads them through +`endf.fileutils.open_text`, which handles `.xz` and leaves anything else alone; +the Rust side reads them with `lzma-rs`, a pure-Rust **dev-dependency**, so the +`endf` crate stays dependency-free for anything that uses it. + +Nothing else changes: `python tools/dump_golden.py` writes `.txt.xz` and the +dumps are still byte-reproducible. + +## The chain golden + +`chain.txt.xz` is the odd one out: a depletion chain is the join of three +sub-libraries, so its golden names all of them with `DECAY`, `NEUTRON` and +`REACTION` lines instead of a single `SOURCE`. It is written by +`tools/dump_chain_golden.py` rather than by the main dumper, and the Rust +harness recognises it by `KIND chain`. + +The ten decay evaluations behind it were chosen to close every path the chain +follows — except Cs137's, whose barium daughters are deliberately absent so +that the stand-in walk of `replace_missing` is exercised. + +## Adding an evaluation + +1. Compress the file and drop it in `tests/`: + `python -c "import lzma,sys,pathlib; p=pathlib.Path(sys.argv[1]); pathlib.Path(str(p)+'.xz').write_bytes(lzma.compress(p.read_bytes(), preset=9))" file.endf` +2. `python tools/dump_golden.py` (or pass the one path to regenerate just it). +3. `cargo test -p endf`. + +Nothing in the Rust test needs changing — it discovers golden files and follows +`SOURCE`. + +## What is compared + +| Record | Covers | +|---|---| +| `MATERIALS`, `MAT` | Multi-material files, material numbers | +| `SECTION mf mt n` | Section splitting, for **every** MF including unported ones | +| `production/…`, `reaction/…`, `nuclide/…` | The derived views: the MF=8/9/10 join, every reaction gathered from its files, and the nuclide those reactions belong to | +| `MF3 …`, `BP`, `INT`, `X`, `Y` | Parsed values, compared **exactly** | +| `EVALX` / `EVALY` | Interpolation, compared to 1e-12 relative | + +Values are written as the shortest round-tripping decimal and both readers parse +decimals with correct rounding, so parsed values are compared bit-for-bit. Only +computed values use a tolerance, and `is_interpolated` in `golden.rs` lists +exactly which: the interpolation samples, because logs and exps need not round +identically in the two languages; the MF=10 yields, which divide two +interpolated cross sections; the propagated uncertainties, where `uncertainties` +accumulates a variance and takes its square root; and the forward-scattered +fraction with the removal cross section that folds it in, because NumPy +re-associated the Clenshaw recurrence between 2.2 and 2.4 and the two give +different last bits. Nothing that comes off the file is compared loosely. + +`python tools/dump_golden.py --check` compares the stored dumps against freshly +generated ones under the same rules, which is what CI runs. It compares the dump +*text* rather than the compressed bytes — two xz encoders can write the same +content differently, and that says nothing about the reader. + +The `SECTION` lines matter more than they look: they hold the section splitter +to the Python reader across files that have no Rust parser yet, so a new +evaluation is useful coverage the day it is added, long before every MF is +ported. + +## Coverage still wanted + +Every ENDF file the Python package parses now has a Rust parser, and all but one +are exercised by a fixture. The exception is + + MF 40 (radionuclide production covariances) + +which is structurally complete and unverified end to end, though the MF33 +subsection parser it delegates to is covered. The list is pinned in `golden.rs` +as `UNCOVERED_BY_ANY_FIXTURE` and checked, so it cannot drift in either +direction: the test fails both when a fixture starts covering one, and when a +new parser arrives without coverage. + +`MF2` is worth a line of its own. It has real Reich-Moore parameters from Fe56 +and U235, a Case C unresolved region from U235, and a synthetic multi-level +Breit-Wigner section — but Adler-Adler, R-matrix limited (LRF=7) and unresolved +Cases A and B are still untested. Cases A and B are additionally unreachable +through the current dispatch; see issue #15. + +The distribution shapes are tracked the same way, in `DISTRIBUTION_SHAPES`: +every angular, energy and joint angle-energy shape the dumpers can write has to +appear in some golden file, or the test names the one that does not. Where no +real file small enough to keep as a fixture holds a shape, one is built. +`tools/make_urr_ace.py`, `tools/make_laws_ace.py` and +`tools/make_denormal_ace.py` write ACE tables; `tools/make_nfy_endf.py` and +`tools/make_shapes_endf.py` write ENDF evaluations on top of the record writer +in `tools/endf_writer.py`. The values are invented; the layout is the format's, +which is the part both readers are being held to. + +Trimming a fixture down to the sections that matter is what `tools/trim_endf.py` +is for. A full evaluation runs to tens of megabytes, most of it covariance +data — U235 is 36 MB whole and 451 KB with ten sections kept. + +### Fixtures present + +| Fixture | Covers | +|---|---| +| `n-095_Am_244` | MF1 (incl. MT458), MF2 LRF=0, MF3, MF4, MF5 LF=7 | +| `n-095_Am_242_trimmed` | MF1, a metastable target | +| `n-049_In-115_trimmed` | MF3, MF8, MF9, MF10 — isomer production | +| `n-054_Xe_136_trimmed` | MF1, MF3 | +| `n-003_Li_006_trimmed` | MF6 LAW=2 and LAW=4, MF12, MF14, MF33 | +| `n-026_Fe_056_trimmed` | MF2 Reich-Moore, MF6 LAW=1, MF12/14, MF33 | +| `n-092_U_235_trimmed` | MF2 Reich-Moore + Case C URR, MF5 LF=5, MF8, MF10, MF15, MF34, delayed neutron groups | +| `photoat-001_H_000` | MF23, MF27 | +| `atom-001_H_000` | MF28 | +| `e-001_H_000` | MF23, MF26 in all three laws | +| `tsl-s-CH4` | MF7 MT=2 and MT=4 | +| `dec-049_In_116m1` | MF8 MT=457 decay data: four spectra, beta- only | +| eight more `dec-*` | The decay evaluations that close the chain fixture | +| `dec-049_In_116m2` | MF8 MT=457 decay data: an isomeric transition down to m1 | +| `Li6.ace` | An ACE Type 1 table; AND in all three shapes, DLW laws 3, 33 and 44, 15 reactions with photon production | +| `synthetic-urr.ace` | The unresolved resonance block, which no small real table has | +| `synthetic-laws.ace` | DLW laws 2, 4, 7, 9, 11, 61 and 66 | +| `synthetic-denormal.ace` | The float form NJOY writes for a denormal, `6.10562372605-318` | +| `synthetic-nfy.endf` | MF8 MT=454 and MT=459, the fission product yields | +| `synthetic-shapes.endf` | MF2 LRF=2 Breit-Wigner, MF5 LF=12 Madland-Nix, MF6 LANG=2 and LAW=6, MF13 | + +### Fixtures still wanted + +- **MF40**, the one parser nothing exercises. It needs an evaluation with + radionuclide production covariances, and none small enough to keep here has + them. Unlike the shapes below, MF40 reuses the MF33 subsection parser that + Li6, Fe56 and U235 do cover, so what is untested is the wrapper around it. +- **MF2 formalisms beyond Reich-Moore and Breit-Wigner**: R-matrix limited + (LRF=7), and unresolved Cases A and B. Note that Cases A and B cannot be + reached at all through the current dispatch — see issue #15 — so a fixture + alone will not cover them. +- **Adler-Adler (LRF=4)**, which both readers reject rather than parse. A + fixture would only pin that rejection. +- **ACE law 5**, which the Python reader cannot read at all — see issue #19 — + so there is nothing to compare against. Every other ACE law is covered. +- **A second ACE table of the same nuclide at another temperature**, which is + what `add_temperature_from_ace` exists for. Only the "already present" path + is exercised. +- **An ACE photoatomic table**, so `IncidentPhoton::from_ace` — the Compton + profiles and subshell photoelectric cross sections it reads — is written but + unexercised. +- **A fissile ACE table.** Li6 has no NU block, so the ACE fission path — + prompt and total nu, the delayed groups and their probabilities — is + unexercised. So is the URR block on a real table, and MFTYPE=13 photon + production. +- **A delayed neutron group whose applicability varies with energy.** U235 + gives each group a constant share, which is the usual case; the branch that + takes the product on the union of two grids is unexercised. +- **Other libraries.** Everything here is ENDF/B-VIII.0 except the ACE table, + which is TENDL-2023.1. JEFF-4.0, JENDL-5 and TENDL-2025 differ in which + optional records they write and how strictly they follow the format, which is + exactly what a format reader gets wrong. + +## A note on size + +Fixtures are trimmed with `tools/trim_endf.py` rather than added whole; a full +evaluation with covariances runs to tens of megabytes. If one ever has to be +added whole, the dump format should grow a digest record — a hash over a table +rather than its values — so that a large evaluation costs a line instead of a +megabyte. Small fixtures should stay fully enumerated: an exact diff points at +the value that broke, a hash only says something did. diff --git a/crates/endf/tests/golden/atom-001_H_000.txt.xz b/crates/endf/tests/golden/atom-001_H_000.txt.xz new file mode 100644 index 0000000..761f27d Binary files /dev/null and b/crates/endf/tests/golden/atom-001_H_000.txt.xz differ diff --git a/crates/endf/tests/golden/chain.txt.xz b/crates/endf/tests/golden/chain.txt.xz new file mode 100644 index 0000000..e5f897a Binary files /dev/null and b/crates/endf/tests/golden/chain.txt.xz differ diff --git a/crates/endf/tests/golden/dec-048_Cd_116.txt.xz b/crates/endf/tests/golden/dec-048_Cd_116.txt.xz new file mode 100644 index 0000000..22b3e2f Binary files /dev/null and b/crates/endf/tests/golden/dec-048_Cd_116.txt.xz differ diff --git a/crates/endf/tests/golden/dec-049_In_115.txt.xz b/crates/endf/tests/golden/dec-049_In_115.txt.xz new file mode 100644 index 0000000..031f6d4 Binary files /dev/null and b/crates/endf/tests/golden/dec-049_In_115.txt.xz differ diff --git a/crates/endf/tests/golden/dec-049_In_116.txt.xz b/crates/endf/tests/golden/dec-049_In_116.txt.xz new file mode 100644 index 0000000..4cea780 Binary files /dev/null and b/crates/endf/tests/golden/dec-049_In_116.txt.xz differ diff --git a/crates/endf/tests/golden/dec-049_In_116m1.txt.xz b/crates/endf/tests/golden/dec-049_In_116m1.txt.xz new file mode 100644 index 0000000..899af8d Binary files /dev/null and b/crates/endf/tests/golden/dec-049_In_116m1.txt.xz differ diff --git a/crates/endf/tests/golden/dec-049_In_116m2.txt.xz b/crates/endf/tests/golden/dec-049_In_116m2.txt.xz new file mode 100644 index 0000000..b28cc91 Binary files /dev/null and b/crates/endf/tests/golden/dec-049_In_116m2.txt.xz differ diff --git a/crates/endf/tests/golden/dec-050_Sn_115.txt.xz b/crates/endf/tests/golden/dec-050_Sn_115.txt.xz new file mode 100644 index 0000000..30eac5a Binary files /dev/null and b/crates/endf/tests/golden/dec-050_Sn_115.txt.xz differ diff --git a/crates/endf/tests/golden/dec-050_Sn_116.txt.xz b/crates/endf/tests/golden/dec-050_Sn_116.txt.xz new file mode 100644 index 0000000..b60a53e Binary files /dev/null and b/crates/endf/tests/golden/dec-050_Sn_116.txt.xz differ diff --git a/crates/endf/tests/golden/dec-054_Xe_136.txt.xz b/crates/endf/tests/golden/dec-054_Xe_136.txt.xz new file mode 100644 index 0000000..796f4c0 Binary files /dev/null and b/crates/endf/tests/golden/dec-054_Xe_136.txt.xz differ diff --git a/crates/endf/tests/golden/dec-054_Xe_137.txt.xz b/crates/endf/tests/golden/dec-054_Xe_137.txt.xz new file mode 100644 index 0000000..75d3019 Binary files /dev/null and b/crates/endf/tests/golden/dec-054_Xe_137.txt.xz differ diff --git a/crates/endf/tests/golden/dec-055_Cs_137.txt.xz b/crates/endf/tests/golden/dec-055_Cs_137.txt.xz new file mode 100644 index 0000000..3f5895e Binary files /dev/null and b/crates/endf/tests/golden/dec-055_Cs_137.txt.xz differ diff --git a/crates/endf/tests/golden/e-001_H_000.txt.xz b/crates/endf/tests/golden/e-001_H_000.txt.xz new file mode 100644 index 0000000..589116b Binary files /dev/null and b/crates/endf/tests/golden/e-001_H_000.txt.xz differ diff --git a/crates/endf/tests/golden/n-003_Li_006_trimmed.txt.xz b/crates/endf/tests/golden/n-003_Li_006_trimmed.txt.xz new file mode 100644 index 0000000..b9917e0 Binary files /dev/null and b/crates/endf/tests/golden/n-003_Li_006_trimmed.txt.xz differ diff --git a/crates/endf/tests/golden/n-026_Fe_056_trimmed.txt.xz b/crates/endf/tests/golden/n-026_Fe_056_trimmed.txt.xz new file mode 100644 index 0000000..9f11543 Binary files /dev/null and b/crates/endf/tests/golden/n-026_Fe_056_trimmed.txt.xz differ diff --git a/crates/endf/tests/golden/n-049_In-115_trimmed.txt.xz b/crates/endf/tests/golden/n-049_In-115_trimmed.txt.xz new file mode 100644 index 0000000..58291a2 Binary files /dev/null and b/crates/endf/tests/golden/n-049_In-115_trimmed.txt.xz differ diff --git a/crates/endf/tests/golden/n-054_Xe_136_trimmed.txt.xz b/crates/endf/tests/golden/n-054_Xe_136_trimmed.txt.xz new file mode 100644 index 0000000..76e40f4 Binary files /dev/null and b/crates/endf/tests/golden/n-054_Xe_136_trimmed.txt.xz differ diff --git a/crates/endf/tests/golden/n-092_U_235_trimmed.txt.xz b/crates/endf/tests/golden/n-092_U_235_trimmed.txt.xz new file mode 100644 index 0000000..fe1d7ef Binary files /dev/null and b/crates/endf/tests/golden/n-092_U_235_trimmed.txt.xz differ diff --git a/crates/endf/tests/golden/n-095_Am_242_trimmed.txt.xz b/crates/endf/tests/golden/n-095_Am_242_trimmed.txt.xz new file mode 100644 index 0000000..3ec29b2 Binary files /dev/null and b/crates/endf/tests/golden/n-095_Am_242_trimmed.txt.xz differ diff --git a/crates/endf/tests/golden/n-095_Am_244.txt.xz b/crates/endf/tests/golden/n-095_Am_244.txt.xz new file mode 100644 index 0000000..1166613 Binary files /dev/null and b/crates/endf/tests/golden/n-095_Am_244.txt.xz differ diff --git a/crates/endf/tests/golden/photoat-001_H_000.txt.xz b/crates/endf/tests/golden/photoat-001_H_000.txt.xz new file mode 100644 index 0000000..4587344 Binary files /dev/null and b/crates/endf/tests/golden/photoat-001_H_000.txt.xz differ diff --git a/crates/endf/tests/golden/synthetic-denormal.txt.xz b/crates/endf/tests/golden/synthetic-denormal.txt.xz new file mode 100644 index 0000000..1ca9a10 Binary files /dev/null and b/crates/endf/tests/golden/synthetic-denormal.txt.xz differ diff --git a/crates/endf/tests/golden/synthetic-laws.txt.xz b/crates/endf/tests/golden/synthetic-laws.txt.xz new file mode 100644 index 0000000..a1f612a Binary files /dev/null and b/crates/endf/tests/golden/synthetic-laws.txt.xz differ diff --git a/crates/endf/tests/golden/synthetic-nfy.txt.xz b/crates/endf/tests/golden/synthetic-nfy.txt.xz new file mode 100644 index 0000000..a00ae04 Binary files /dev/null and b/crates/endf/tests/golden/synthetic-nfy.txt.xz differ diff --git a/crates/endf/tests/golden/synthetic-shapes.txt.xz b/crates/endf/tests/golden/synthetic-shapes.txt.xz new file mode 100644 index 0000000..860db07 Binary files /dev/null and b/crates/endf/tests/golden/synthetic-shapes.txt.xz differ diff --git a/crates/endf/tests/golden/synthetic-urr-cases.txt.xz b/crates/endf/tests/golden/synthetic-urr-cases.txt.xz new file mode 100644 index 0000000..f0d40d6 Binary files /dev/null and b/crates/endf/tests/golden/synthetic-urr-cases.txt.xz differ diff --git a/crates/endf/tests/golden/synthetic-urr.txt.xz b/crates/endf/tests/golden/synthetic-urr.txt.xz new file mode 100644 index 0000000..e19225a Binary files /dev/null and b/crates/endf/tests/golden/synthetic-urr.txt.xz differ diff --git a/crates/endf/tests/golden/tsl-s-CH4.txt.xz b/crates/endf/tests/golden/tsl-s-CH4.txt.xz new file mode 100644 index 0000000..5141b7b Binary files /dev/null and b/crates/endf/tests/golden/tsl-s-CH4.txt.xz differ diff --git a/crates/endf/tests/public_api.rs b/crates/endf/tests/public_api.rs new file mode 100644 index 0000000..c51405b --- /dev/null +++ b/crates/endf/tests/public_api.rs @@ -0,0 +1,160 @@ +//! The crate used the way a consumer uses it, through its root re-exports. +//! +//! `golden.rs` reaches into module paths freely, because it has to name every +//! type the dumpers touch. That makes it a poor guide to whether the crate is +//! pleasant — or even possible — to depend on from outside. This walks the +//! path a transport code takes, from a file to the distributions it samples, +//! and imports everything from `endf::` rather than `endf::mf::mf6::`. +//! +//! It is a shape test, not a value test: the goldens check the numbers. What +//! fails here is a type that stopped being public, a re-export that went +//! missing, or an accessor that a consumer cannot reach without knowing the +//! crate's internal layout. + +use std::path::{Path, PathBuf}; + +use endf::{ + tables_from_str, AngleEnergy, Chain, Decay, FissionProductYields, IncidentNeutron, + IncidentPhoton, Interpretation, Material, MetastableScheme, ProbabilityTables, + RadionuclideProduction, Tabulated1D, +}; + +fn fixture(name: &str) -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../tests") + .join(name) +} + +fn read_text(name: &str) -> String { + let path = fixture(name); + let raw = std::fs::read(&path).unwrap_or_else(|e| panic!("reading {}: {e}", path.display())); + let mut out = Vec::new(); + lzma_rs::xz_decompress(&mut raw.as_slice(), &mut out) + .unwrap_or_else(|e| panic!("decompressing {}: {e}", path.display())); + String::from_utf8(out).expect("a fixture is not UTF-8") +} + +/// A file to a nuclide with cross sections on it — the first thing any +/// consumer does. +#[test] +fn from_a_file_to_a_cross_section() { + let material = Material::from_str(&read_text("n-095_Am_244.endf.xz")).unwrap(); + assert_eq!(material.mat, 9552); + assert!(material.contains(3, 1)); + + // The sublibrary decides the class, without the caller reading NSUB. + let neutron = match material.interpret().unwrap() { + Interpretation::IncidentNeutron(n) => n, + other => panic!("an incident-neutron evaluation gave {other:?}"), + }; + assert_eq!(neutron.name(), "Am244"); + assert_eq!(neutron.atomic_number, 95); + + // A reaction, its cross section, and the cross section evaluated. + let capture = &neutron.reactions[&102]; + let xs: &Tabulated1D = capture.xs.values().next().expect("a capture cross section"); + assert!(xs.eval(0.0253) > 0.0); + // No unionised energy grid from ENDF: each cross section carries its own. + // A consumer that wants one gets it from ACE, or builds it itself — see + // the ACE test below. + assert!(neutron.energy.is_empty()); + + // The same nuclide built directly, which is the other entry point. + let direct = IncidentNeutron::from_endf(&material).unwrap(); + assert_eq!(direct.name(), neutron.name()); +} + +/// Every product distribution shape reachable without naming a private type. +/// +/// This is the part an Arrow projection consumes, so a consumer has to be able +/// to match on `AngleEnergy` from the crate root. +#[test] +fn product_distributions_are_matchable() { + let material = Material::from_str(&read_text("n-003_Li_006_trimmed.endf.xz")).unwrap(); + let neutron = IncidentNeutron::from_endf(&material).unwrap(); + + let mut seen = 0; + for reaction in neutron.reactions.values() { + for product in &reaction.products { + for distribution in &product.distribution { + // The four shapes the Arrow schema has columns for. A new + // variant makes this stop compiling, which is the point. + match distribution { + AngleEnergy::Uncorrelated(_) + | AngleEnergy::Correlated(_) + | AngleEnergy::KalbachMann(_) + | AngleEnergy::NBodyPhaseSpace(_) => seen += 1, + } + } + } + } + assert!(seen > 0, "no product carried a distribution"); +} + +/// The ACE side, which is what a transport code actually reads. +#[test] +fn from_an_ace_table_to_a_nuclide() { + let tables = tables_from_str(&read_text("Li6.ace.xz"), None).unwrap(); + let table = &tables[0]; + assert!(table.name.starts_with("3006")); + assert!(!table.xss.is_empty()); + + let neutron = IncidentNeutron::from_ace(table, MetastableScheme::default()).unwrap(); + assert_eq!(neutron.name(), "Li6"); + assert!(!neutron.reactions.is_empty()); + assert_eq!(neutron.temperatures().len(), 1); + // The unionised grid an ENDF evaluation does not have, keyed by the same + // temperature string the cross sections are. + let temperature = &neutron.temperatures()[0]; + assert!(!neutron.energy[temperature].is_empty()); + + // Probability tables come back keyed by temperature, empty when the table + // has no URR block. + let urr: &std::collections::BTreeMap = &neutron.urr; + assert!(urr.is_empty(), "Li6 has no unresolved resonance block"); +} + +/// Decay data, fission yields and radionuclide production — the depletion +/// inputs, each reachable from the crate root. +#[test] +fn the_depletion_inputs_are_reachable() { + let decay_material = Material::from_str(&read_text("dec-049_In_116m1.endf.xz")).unwrap(); + let decay = Decay::from_material(&decay_material).unwrap(); + assert_eq!(decay.nuclide.name, "In116_m1"); + assert!(decay.half_life.is_some()); + assert!(!decay.modes.is_empty()); + + let yields_material = Material::from_str(&read_text("synthetic-nfy.endf.xz")).unwrap(); + let yields = FissionProductYields::from_material(&yields_material).unwrap(); + assert_eq!(yields.nuclide.name, "U235"); + assert_eq!(yields.energies.len(), 2); + + let production_material = + Material::from_str(&read_text("n-049_In-115_trimmed.endf.xz")).unwrap(); + let production = endf::radionuclide_production(&production_material); + assert!(!production.is_empty()); + let states: &Vec = production.values().next().unwrap(); + assert!(states[0].excitation_energy() >= 0.0); +} + +/// A depletion chain, built from evaluations the caller supplies. +#[test] +fn a_chain_can_be_built_from_materials() { + let decay: Vec = ["dec-049_In_116m1.endf.xz", "dec-049_In_116m2.endf.xz"] + .iter() + .map(|name| Material::from_str(&read_text(name)).unwrap()) + .collect(); + let neutron = vec![Material::from_str(&read_text("n-049_In-115_trimmed.endf.xz")).unwrap()]; + + let chain = Chain::from_endf(&decay, &[], &neutron, &["(n,gamma)"]).unwrap(); + assert!(!chain.nuclides.is_empty()); +} + +/// Photon data, the other sublibrary with a high-level class. +#[test] +fn photoatomic_data_is_reachable() { + let material = Material::from_str(&read_text("photoat-001_H_000.endf.xz")).unwrap(); + let photon = IncidentPhoton::from_endf(&material, None).unwrap(); + assert_eq!(photon.atomic_number, 1); + assert!(!photon.reactions.is_empty()); +} diff --git a/crates/endf/tests/reference/README.md b/crates/endf/tests/reference/README.md new file mode 100644 index 0000000..7d6c6bf --- /dev/null +++ b/crates/endf/tests/reference/README.md @@ -0,0 +1,31 @@ +# Reference outputs + +Files here are not golden dumps. A golden dump is a `path -> value` map that +`tests/golden.rs` compares whole; these are single artefacts that a unit test +checks against directly, and they live apart so the golden harness does not +try to parse them. + +| File | What it is | +|---|---| +| `njoy-deck.txt.xz` | The NJOY input deck the **Python** `make_ace` composes for `n-095_Am_244` at 293.6 K and 900 K, captured with its `run` stubbed out. `njoy::tests::composes_the_same_deck_as_the_python_package` holds the Rust deck to it byte for byte. | + +Regenerate the deck with: + +```python +import endf, lzma, unittest.mock as mock +from endf import njoy + +material = endf.Material('tests/n-095_Am_244.endf.xz') +captured = {} +def capture(commands, tapein, tapeout, **kwargs): + captured['commands'] = commands + raise SystemExit(0) +with mock.patch.object(njoy, 'run', capture): + try: + njoy.make_ace('tests/n-095_Am_244.endf.xz', temperatures=[293.6, 900.0], + material=material, output_dir='.') + except SystemExit: + pass +open('crates/endf/tests/reference/njoy-deck.txt.xz', 'wb').write( + lzma.compress(captured['commands'].encode(), preset=9)) +``` diff --git a/crates/endf/tests/reference/njoy-deck.txt.xz b/crates/endf/tests/reference/njoy-deck.txt.xz new file mode 100644 index 0000000..597f27f Binary files /dev/null and b/crates/endf/tests/reference/njoy-deck.txt.xz differ diff --git a/src/endf/ace.py b/src/endf/ace.py index 18d7a8c..8fcfc42 100644 --- a/src/endf/ace.py +++ b/src/endf/ace.py @@ -28,7 +28,7 @@ import numpy as np from .data import ATOMIC_SYMBOL, gnds_name, EV_PER_MEV, K_BOLTZMANN -from .fileutils import PathLike +from .fileutils import PathLike, open_binary, open_text from .records import ENDF_FLOAT_RE import endf @@ -224,7 +224,7 @@ def get_tables( # Determine whether file is ASCII or binary filename = str(filename) try: - fh = open(filename, 'rb') + fh = open_binary(filename) # Grab 10 lines of the library sb = b''.join([fh.readline() for i in range(10)]) @@ -233,11 +233,11 @@ def get_tables( # No exception so proceed with ASCII - reopen in non-binary fh.close() - with open(filename, 'r') as fh: + with open_text(filename) as fh: return _read_ascii(fh, table_names, verbose) except UnicodeDecodeError: fh.close() - with open(filename, 'rb') as fh: + with open_binary(filename) as fh: return _read_binary(fh, table_names, verbose) diff --git a/src/endf/datafiles/README.md b/src/endf/datafiles/README.md index 152fdbb..e7cbd44 100644 --- a/src/endf/datafiles/README.md +++ b/src/endf/datafiles/README.md @@ -14,12 +14,46 @@ below. | `compton_profiles.h5` | Hartree-Fock Compton profiles J(pz) per subshell for Z = 1 to 100 | Biggs, Mendelsohn and Mann, *Atomic Data and Nuclear Data Tables* **16** (1975) 201 | | `BREMX.DAT` | Scaled bremsstrahlung differential cross sections, 57 electron energies by 30 reduced photon energies, for Z = 1 to 100 | Seltzer and Berger, *Atomic Data and Nuclear Data Tables* **35** (1986) 345 | | `density_effect.h5` | Mean excitation energies and subshell ionization energies for the density effect correction, Z = 1 to 100 | Sternheimer, Berger and Seltzer, *Atomic Data and Nuclear Data Tables* **30** (1984) 261 | +| `photon_aux.txt` | Compton profiles and density effect data as plain text, built by `tools/make_photon_aux.py` | Geant4 G4EMLOW for the profiles; see below | + +## photon_aux.txt + +The Rust crate has no dependencies, so it cannot open an HDF5 file — that would +mean a C library. `tools/make_photon_aux.py` writes one whitespace-separated +text file that both readers parse with nothing but a float parser, and it takes +each half from the best source available. + +**The Compton profiles come from the primary source.** The script downloads +Geant4's **G4EMLOW** data set — verified against a pinned SHA-256 — and reads +`doppler/p-biggs.dat`, `doppler/profile-.dat` and `doppler/shell-doppler.dat` +directly. That is the distribution of the Biggs, Mendelsohn and Mann tables, so +this data is no longer a copy of OpenMC's copy. The result was checked against +the HDF5 it replaced and is **bit-identical for all 100 elements**. + +G4EMLOW 6.48 is pinned rather than the newest release. The whole `doppler` +directory is byte-identical in every version from 6.48 through 8.7 — checked +file by file, not assumed — and 6.48 is a 24 MB download against 333 MB. + +**The density effect data is still vendored** from `density_effect.h5`, because +no primary machine-readable distribution of it is known here. NIST ESTAR +publishes the mean excitation energies through a web form rather than as a +download. If a primary source turns up, only `density_section` in the script +has to change. + +It is left uncompressed, unlike the fixtures and goldens. Those are read by +tests, which already have `lzma-rs` as a dev-dependency; this one is read at +*runtime*, and compressing it would put a decompressor in the crate's real +dependencies. 359 kB of text replaces 805 kB of HDF5, and git packs it. + +`BREMX.DAT` needs no conversion — it was already whitespace-separated text. ## Known follow-up -The two HDF5 files are the only reason this package needs `h5py`, and the cubic -spline resampling of `BREMX.DAT` is the only reason it needs `scipy`. Both are -loaded once and cached, and neither format is load bearing: converting them to -`.npz` and either precomputing or reimplementing the spline would drop both -dependencies. Deferred deliberately, see +`h5py` is now only needed to *regenerate* `photon_aux.txt`, not to read it, so +the Python loaders could move over and the dependency could go. `scipy` likewise: +`crates/endf/src/spline.rs` reimplements the not-a-knot cubic spline that +`_load_bremsstrahlung` uses, and it agrees with SciPy to 3.8e-15 over all +600,000 resampled values, so the Python side could use the same algorithm. Both +deferred deliberately — keeping SciPy on the Python side means the parity +harness compares two independent spline implementations. See fusion-neutronics/nuclear_data_to_yamc_format#19. diff --git a/src/endf/datafiles/compton_profiles_biggs1975.txt b/src/endf/datafiles/compton_profiles_biggs1975.txt new file mode 100644 index 0000000..a1bd2a4 --- /dev/null +++ b/src/endf/datafiles/compton_profiles_biggs1975.txt @@ -0,0 +1,110 @@ +# Compton profiles J(pz) per subshell, with subshell occupancies and +# binding energies in eV. Z = 1 to 100 on a 31-point momentum grid. +# +# Biggs, Mendelsohn and Mann, At. Data Nucl. Data Tables 16 (1975) 201, +# as distributed in the Geant4 G4EMLOW 6.48 data set, +# under doppler/. +# +# Generated by tools/make_photon_aux.py. +COMPTON +pz 31 0.0 0.05 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.4 3.0 4.0 5.0 6.0 7.0 8.0 10.0 15.0 20.0 30.0 40.0 60.0 100.0 +Z 1 1 1.0 13.61 0.849 0.842 0.824 0.794 0.755 0.655 0.544 0.435 0.337 0.257 0.192 0.106 0.0584 0.0327 0.0188 0.0111 0.00679 0.00275 0.000849 0.000173 4.83e-05 1.68e-05 6.79e-06 3.09e-06 8.2e-07 7.4e-08 1.3e-08 1.2e-09 2.3e-10 4.3e-11 2.6e-11 +Z 2 1 2.0 23.419999999999998 0.535 0.534 0.528 0.52 0.509 0.478 0.439 0.396 0.35 0.306 0.264 0.191 0.136 0.0955 0.0672 0.0476 0.034 0.0179 0.0074 0.00206 0.000698 0.000274 0.00012 5.78e-05 1.6e-05 1.6e-06 2.9e-07 2.6e-08 4.7e-09 4.3e-10 3.9e-11 +Z 3 2 2.0 1.0 59.85 5.5 0.329 0.328 0.327 0.325 0.322 0.315 0.305 0.293 0.279 0.263 0.247 0.213 0.18 0.149 0.122 0.099 0.0798 0.0513 0.0266 0.00943 0.00371 0.00161 0.000764 0.000389 0.00012 1.2e-05 2.4e-06 2.2e-07 3.9e-08 3.5e-09 1.8e-10 1.94 1.87 1.69 1.43 1.14 0.612 0.274 0.108 0.0411 0.0194 0.0141 0.0134 0.012 0.00958 0.00724 0.00536 0.00395 0.00218 0.000962 0.000295 0.000108 4.48e-05 2.06e-05 1.03e-05 3.1e-06 3.1e-07 5.9e-08 5.4e-09 9.6e-10 8.6e-11 4.4e-12 +Z 4 2 2.0 2.0 118.36 8.18 0.237 0.237 0.236 0.236 0.235 0.232 0.228 0.223 0.218 0.211 0.204 0.188 0.171 0.153 0.136 0.119 0.104 0.0771 0.0481 0.0215 0.00986 0.00477 0.00244 0.00131 0.00044 5e-05 9.9e-06 9.4e-07 1.7e-07 1.5e-08 7.4e-10 1.34 1.32 1.25 1.15 1.02 0.743 0.486 0.293 0.165 0.0892 0.0475 0.0164 0.0108 0.0104 0.0102 0.00939 0.00823 0.0058 0.00315 0.00115 0.000461 0.000204 9.87e-05 5.11e-05 1.6e-05 1.8e-06 3.4e-07 3.2e-08 5.8e-09 5.2e-10 2.5e-11 +Z 5 3 2.0 2.0 1.0 195.61 12.58 6.67 0.186 0.186 0.186 0.185 0.185 0.184 0.182 0.179 0.176 0.173 0.169 0.161 0.151 0.141 0.13 0.119 0.109 0.0884 0.0628 0.0338 0.0179 0.00961 0.00532 0.00304 0.0011 0.00014 2.9e-05 2.9e-06 5.3e-07 4.8e-08 2.3e-09 1.0 0.992 0.963 0.917 0.857 0.711 0.552 0.405 0.284 0.191 0.124 0.05 0.0209 0.0115 0.00924 0.00897 0.00893 0.00808 0.00573 0.00268 0.00122 0.000586 0.000298 0.000161 5.4e-05 6.3e-06 1.3e-06 1.2e-07 2.2e-08 2e-09 9.4e-11 0.615 0.615 0.614 0.612 0.606 0.581 0.533 0.467 0.393 0.321 0.256 0.157 0.0943 0.0568 0.0346 0.0215 0.0135 0.00571 0.00178 0.000345 8.88e-05 2.82e-05 1.04e-05 4.29e-06 9.3e-07 5e-08 5.7e-09 2.5e-10 2.5e-11 1e-12 1.7e-14 +Z 6 3 2.0 2.0 2.0 291.01000000000005 17.560000000000002 8.99 0.153 0.153 0.153 0.153 0.153 0.152 0.151 0.149 0.148 0.146 0.144 0.139 0.133 0.126 0.12 0.112 0.105 0.0905 0.0701 0.0433 0.0258 0.0153 0.00913 0.00555 0.0022 0.00031 6.8e-05 7e-06 1.3e-06 1.2e-07 5.8e-09 0.804 0.798 0.783 0.759 0.726 0.641 0.541 0.439 0.343 0.26 0.192 0.0982 0.0477 0.0234 0.013 0.00909 0.00795 0.00775 0.00695 0.00425 0.00227 0.0012 0.000649 0.000365 0.00013 1.6e-05 3.4e-06 3.3e-07 6.2e-08 5.6e-09 2.7e-10 0.488 0.488 0.488 0.487 0.485 0.475 0.453 0.42 0.379 0.333 0.287 0.204 0.14 0.095 0.0644 0.0438 0.0301 0.0146 0.0053 0.0012 0.000334 0.00011 4.16e-05 1.75e-05 3.9e-06 2.2e-07 2.6e-08 1.2e-09 1.2e-10 4.8e-12 8e-14 +Z 7 3 2.0 2.0 3.0 404.85 23.099999999999998 11.5 0.13 0.13 0.13 0.13 0.13 0.129 0.129 0.128 0.127 0.126 0.124 0.121 0.117 0.113 0.109 0.104 0.0987 0.0881 0.0724 0.0495 0.0325 0.0209 0.0133 0.00858 0.0037 0.00059 0.00014 1.5e-05 2.8e-06 2.6e-07 1.3e-08 0.672 0.669 0.66 0.646 0.625 0.572 0.507 0.435 0.364 0.296 0.236 0.142 0.0807 0.0443 0.0244 0.0142 0.00953 0.00694 0.00676 0.00529 0.00333 0.00195 0.00114 0.000674 0.00026 3.5e-05 7.5e-06 7.6e-07 1.4e-07 1.3e-08 6.2e-10 0.407 0.407 0.407 0.407 0.406 0.401 0.39 0.372 0.348 0.319 0.287 0.224 0.168 0.124 0.0908 0.0662 0.0484 0.0261 0.0109 0.00287 0.000882 0.000309 0.000121 5.23e-05 1.2e-05 7.3e-07 8.9e-08 4.1e-09 4.2e-10 1.7e-11 3e-13 +Z 8 3 2.0 2.0 4.0 537.28 29.23 14.19 0.113 0.113 0.113 0.113 0.113 0.113 0.112 0.112 0.111 0.11 0.109 0.107 0.105 0.102 0.0986 0.0952 0.0915 0.0838 0.0718 0.0529 0.0373 0.0257 0.0174 0.0118 0.0055 0.001 0.00024 2.8e-05 5.4e-06 5.1e-07 2.5e-08 0.579 0.577 0.571 0.561 0.548 0.513 0.468 0.417 0.363 0.311 0.261 0.175 0.111 0.0684 0.0409 0.0245 0.0151 0.00765 0.00605 0.00561 0.00414 0.00271 0.00171 0.00107 0.00044 6.5e-05 1.5e-05 1.5e-06 2.9e-07 2.7e-08 1.3e-09 0.35 0.35 0.35 0.349 0.349 0.346 0.34 0.33 0.315 0.297 0.275 0.228 0.183 0.143 0.111 0.0852 0.0653 0.0385 0.0179 0.00542 0.00184 0.00069 0.000284 0.000126 3e-05 1.9e-06 2.4e-07 1.1e-08 1.2e-09 5e-11 8.5e-13 +Z 9 3 2.0 2.0 5.0 688.37 35.93000000000001 17.05 0.1 0.1 0.1 0.1 0.1 0.0999 0.0996 0.0992 0.0987 0.0982 0.0975 0.096 0.0942 0.0922 0.0899 0.0874 0.0847 0.0789 0.0697 0.0542 0.0405 0.0295 0.0211 0.015 0.0075 0.0015 0.0004 4.8e-05 9.6e-06 9.2e-07 4.5e-08 0.508 0.507 0.503 0.496 0.487 0.462 0.43 0.393 0.353 0.312 0.271 0.197 0.136 0.0911 0.0592 0.0378 0.0241 0.0107 0.00579 0.00539 0.00458 0.00335 0.00228 0.00152 0.00067 0.00011 2.6e-05 2.8e-06 5.4e-07 5e-08 2.4e-09 0.307 0.307 0.307 0.307 0.306 0.305 0.301 0.295 0.286 0.274 0.259 0.224 0.188 0.154 0.125 0.0998 0.0795 0.0503 0.0255 0.00872 0.00324 0.0013 0.000563 0.00026 6.6e-05 4.4e-06 5.7e-07 2.8e-08 3e-09 1.3e-10 2.1e-12 +Z 10 3 2.0 2.0 6.0 858.1800000000001 43.23 20.080000000000002 0.09 0.09 0.0899 0.0899 0.0898 0.0897 0.0895 0.0892 0.0888 0.0884 0.088 0.0869 0.0855 0.084 0.0823 0.0805 0.0784 0.074 0.0668 0.0543 0.0424 0.0323 0.0241 0.0178 0.0096 0.0022 0.0006 7.6e-05 1.6e-05 1.5e-06 7.6e-08 0.453 0.452 0.449 0.444 0.438 0.42 0.397 0.369 0.338 0.305 0.272 0.209 0.155 0.11 0.0767 0.0522 0.0351 0.0159 0.00656 0.00493 0.00466 0.00377 0.00278 0.00196 0.00094 0.00017 4.2e-05 4.7e-06 9.3e-07 8.7e-08 4.2e-09 0.274 0.274 0.274 0.273 0.273 0.272 0.27 0.266 0.26 0.252 0.241 0.216 0.188 0.159 0.133 0.11 0.0906 0.0607 0.0332 0.0126 0.00505 0.00216 0.000984 0.000473 0.00013 9e-06 1.2e-06 6e-08 6.7e-09 2.8e-10 4.8e-12 +Z 11 4 2.0 2.0 6.0 1.0 1064.0 64.48 36.42 5.1499999999999995 0.0815 0.0815 0.0815 0.0815 0.0814 0.0813 0.0811 0.0809 0.0807 0.0804 0.08 0.0792 0.0782 0.0771 0.0758 0.0743 0.0728 0.0694 0.0637 0.0534 0.0433 0.0342 0.0265 0.0203 0.012 0.003 0.00087 0.00012 2.4e-05 2.4e-06 1.2e-07 0.39 0.39 0.388 0.385 0.381 0.369 0.354 0.335 0.314 0.291 0.267 0.218 0.172 0.132 0.098 0.0713 0.051 0.0252 0.00943 0.00484 0.00472 0.0042 0.00335 0.00251 0.0013 0.00026 6.7e-05 7.9e-06 1.6e-06 1.5e-07 7.4e-09 0.225 0.225 0.225 0.225 0.224 0.224 0.223 0.222 0.22 0.216 0.212 0.199 0.182 0.164 0.144 0.125 0.108 0.0774 0.046 0.0192 0.00832 0.00377 0.0018 0.000896 0.00025 1.9e-05 2.6e-06 1.4e-07 1.5e-08 6.5e-10 1.1e-11 2.07 1.99 1.77 1.46 1.13 0.556 0.223 0.0796 0.0319 0.0205 0.0191 0.018 0.0142 0.01 0.00672 0.0044 0.00286 0.00119 0.000339 0.000115 0.000109 9.89e-05 7.94e-05 5.96e-05 3.1e-05 6.1e-06 1.5e-06 1.8e-07 3.6e-08 3.4e-09 1.7e-10 +Z 12 4 2.0 2.0 6.0 2.0 1294.5 89.46 56.55 6.89 0.0745 0.0745 0.0745 0.0745 0.0744 0.0743 0.0742 0.074 0.0738 0.0736 0.0733 0.0727 0.072 0.0711 0.0701 0.069 0.0678 0.0651 0.0605 0.0521 0.0435 0.0354 0.0283 0.0223 0.014 0.0038 0.0012 0.00017 3.6e-05 3.7e-06 1.9e-07 0.342 0.342 0.34 0.338 0.336 0.328 0.317 0.305 0.29 0.273 0.255 0.218 0.181 0.146 0.115 0.0883 0.0667 0.0364 0.0143 0.00517 0.00459 0.00441 0.00379 0.00302 0.0017 0.00039 0.0001 1.3e-05 2.6e-06 2.5e-07 1.2e-08 0.192 0.192 0.192 0.192 0.192 0.192 0.191 0.191 0.19 0.188 0.186 0.179 0.169 0.158 0.144 0.13 0.116 0.0894 0.0578 0.0267 0.0124 0.00593 0.00295 0.00152 0.00045 3.7e-05 5.2e-06 2.8e-07 3.2e-08 1.4e-09 2.4e-11 1.59 1.55 1.44 1.28 1.09 0.696 0.387 0.193 0.0911 0.0449 0.0272 0.0212 0.0207 0.0181 0.0144 0.0107 0.00763 0.00364 0.00112 0.000237 0.000174 0.00017 0.000148 0.000118 6.7e-05 1.5e-05 3.9e-06 4.7e-07 9.6e-08 9.3e-09 4.5e-10 +Z 13 5 2.0 2.0 6.0 2.0 1.0 1549.9 119.05 81.19999999999999 10.16 4.88 0.0686 0.0686 0.0686 0.0685 0.0685 0.0684 0.0683 0.0682 0.0681 0.0679 0.0677 0.0672 0.0666 0.0659 0.0651 0.0642 0.0633 0.0611 0.0575 0.0505 0.0432 0.0361 0.0296 0.0239 0.015 0.0047 0.0016 0.00024 5.2e-05 5.5e-06 2.8e-07 0.305 0.304 0.304 0.302 0.3 0.295 0.287 0.278 0.267 0.255 0.241 0.213 0.183 0.153 0.126 0.101 0.0801 0.0479 0.0207 0.00625 0.00445 0.00439 0.00404 0.00342 0.0021 0.00053 0.00015 1.9e-05 4e-06 3.9e-07 1.9e-08 0.168 0.168 0.168 0.168 0.168 0.167 0.167 0.167 0.166 0.166 0.164 0.161 0.155 0.148 0.139 0.129 0.118 0.0964 0.0673 0.0343 0.0171 0.00863 0.00447 0.00239 0.00075 6.6e-05 9.7e-06 5.3e-07 6.1e-08 2.7e-09 4.8e-11 1.24 1.22 1.17 1.08 0.975 0.729 0.494 0.308 0.18 0.101 0.0575 0.0271 0.0233 0.0231 0.0212 0.0179 0.0143 0.00806 0.00293 0.000541 0.000252 0.000241 0.000227 0.000194 0.00012 3e-05 8.2e-06 1e-06 2.1e-07 2.1e-08 1e-09 0.919 0.918 0.916 0.904 0.879 0.776 0.619 0.452 0.307 0.199 0.124 0.0452 0.0162 0.00666 0.00402 0.0035 0.00346 0.00328 0.00249 0.00127 0.000618 0.000307 0.000157 8.33e-05 2.6e-05 2.2e-06 3.2e-07 1.7e-08 2e-09 8.6e-11 1.6e-12 +Z 14 5 2.0 2.0 6.0 2.0 2.0 1828.5 151.55 108.67 13.63 6.55 0.0635 0.0635 0.0635 0.0635 0.0635 0.0634 0.0633 0.0632 0.0631 0.063 0.0628 0.0624 0.0619 0.0614 0.0608 0.0601 0.0593 0.0576 0.0545 0.0488 0.0425 0.0363 0.0304 0.0252 0.017 0.0056 0.002 0.00032 7.3e-05 7.8e-06 4e-07 0.275 0.275 0.274 0.273 0.272 0.268 0.262 0.255 0.247 0.237 0.227 0.205 0.181 0.156 0.132 0.11 0.0906 0.0584 0.0279 0.00822 0.0045 0.00425 0.00412 0.00369 0.0025 0.0007 0.00021 2.8e-05 5.9e-06 5.9e-07 2.9e-08 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.148 0.148 0.147 0.145 0.142 0.137 0.131 0.124 0.116 0.0992 0.074 0.0414 0.0221 0.0118 0.00636 0.00352 0.0012 0.00011 1.7e-05 9.4e-07 1.1e-07 4.9e-09 8.9e-11 1.04 1.03 0.992 0.94 0.872 0.707 0.531 0.374 0.248 0.158 0.0979 0.0407 0.0256 0.0237 0.0235 0.0221 0.0194 0.0129 0.00566 0.00116 0.000361 0.000287 0.000283 0.000258 0.00018 4.9e-05 1.4e-05 1.9e-06 3.9e-07 3.9e-08 1.9e-09 0.744 0.744 0.743 0.739 0.728 0.681 0.597 0.49 0.38 0.281 0.201 0.0946 0.0419 0.0183 0.00872 0.00524 0.00421 0.00401 0.0036 0.00217 0.00115 0.000599 0.000319 0.000174 5.6e-05 5.2e-06 7.7e-07 4.3e-08 5e-09 2.2e-10 4.1e-12 +Z 15 5 2.0 2.0 6.0 2.0 3.0 2130.4 187.15 139.14 17.21 8.379999999999999 0.0592 0.0592 0.0591 0.0591 0.0591 0.0591 0.059 0.0589 0.0588 0.0587 0.0586 0.0583 0.0579 0.0574 0.0569 0.0564 0.0557 0.0543 0.0518 0.047 0.0416 0.0362 0.0309 0.0261 0.018 0.0066 0.0024 0.00042 9.8e-05 1.1e-05 5.7e-07 0.251 0.25 0.25 0.249 0.248 0.245 0.241 0.235 0.229 0.222 0.214 0.196 0.176 0.156 0.136 0.116 0.0982 0.0674 0.0353 0.0111 0.00492 0.00409 0.00406 0.00382 0.0028 0.00089 0.00028 3.9e-05 8.4e-06 8.5e-07 4.3e-08 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.133 0.132 0.13 0.127 0.123 0.118 0.112 0.0991 0.0781 0.0475 0.0272 0.0152 0.00856 0.00489 0.0017 0.00017 2.7e-05 1.6e-06 1.9e-07 8.5e-09 1.5e-10 0.897 0.89 0.868 0.833 0.786 0.669 0.536 0.407 0.295 0.205 0.138 0.0611 0.032 0.0243 0.0233 0.0232 0.022 0.017 0.00893 0.00221 0.000579 0.00033 0.000317 0.000306 0.00023 7.2e-05 2.2e-05 3e-06 6.5e-07 6.5e-08 3.3e-09 0.631 0.631 0.631 0.629 0.624 0.599 0.551 0.483 0.404 0.325 0.253 0.142 0.0741 0.0371 0.0185 0.0098 0.00609 0.00433 0.0042 0.00304 0.00178 0.000982 0.000544 0.000306 0.0001 1e-05 1.6e-06 9.1e-08 1.1e-08 4.8e-10 8.7e-12 +Z 16 5 2.0 2.0 6.0 2.0 4.0 2455.9 225.97 172.73000000000002 20.95 10.34 0.0553 0.0553 0.0553 0.0553 0.0553 0.0553 0.0552 0.0552 0.0551 0.055 0.0549 0.0546 0.0543 0.0539 0.0535 0.053 0.0525 0.0513 0.0493 0.0452 0.0406 0.0358 0.0311 0.0267 0.019 0.0075 0.0029 0.00053 0.00013 1.5e-05 7.8e-07 0.23 0.23 0.23 0.229 0.228 0.226 0.223 0.218 0.213 0.208 0.201 0.187 0.171 0.154 0.137 0.12 0.103 0.0746 0.0423 0.0146 0.00582 0.00404 0.00392 0.00383 0.0031 0.0011 0.00036 5.3e-05 1.2e-05 1.2e-06 6.1e-08 0.122 0.122 0.122 0.122 0.122 0.122 0.122 0.122 0.122 0.122 0.122 0.121 0.119 0.117 0.115 0.111 0.107 0.0971 0.08 0.0524 0.0319 0.0188 0.011 0.0065 0.0024 0.00026 4.2e-05 2.6e-06 3.1e-07 1.4e-08 2.6e-10 0.794 0.788 0.773 0.748 0.715 0.628 0.526 0.421 0.324 0.24 0.173 0.0847 0.0429 0.0272 0.0231 0.0227 0.0225 0.0196 0.0122 0.00371 0.000983 0.000407 0.000339 0.000336 0.00028 9.9e-05 3.2e-05 4.6e-06 1e-06 1e-07 5.2e-09 0.551 0.551 0.55 0.549 0.547 0.533 0.504 0.459 0.404 0.343 0.283 0.179 0.106 0.0596 0.0326 0.0179 0.0103 0.00508 0.00436 0.00372 0.00243 0.00144 0.000829 0.000482 0.00017 1.8e-05 2.9e-06 1.7e-07 2e-08 9.3e-10 1.7e-11 +Z 17 5 2.0 2.0 6.0 2.0 5.0 2804.9 268.05 209.48000000000002 24.84 12.42 0.052 0.052 0.052 0.052 0.052 0.0519 0.0519 0.0518 0.0518 0.0517 0.0516 0.0514 0.0511 0.0508 0.0505 0.0501 0.0497 0.0487 0.0469 0.0435 0.0395 0.0353 0.0311 0.0271 0.02 0.0084 0.0034 0.00066 0.00017 1.9e-05 1e-06 0.213 0.213 0.213 0.212 0.212 0.21 0.207 0.204 0.2 0.195 0.19 0.178 0.165 0.15 0.136 0.121 0.107 0.0802 0.0487 0.0185 0.0072 0.0042 0.00377 0.00374 0.0032 0.0013 0.00045 7e-05 1.6e-05 1.7e-06 8.5e-08 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.111 0.11 0.109 0.107 0.105 0.101 0.094 0.0803 0.056 0.0361 0.0224 0.0136 0.00831 0.0032 0.00038 6.4e-05 4e-06 4.9e-07 2.3e-08 4.2e-10 0.713 0.709 0.698 0.68 0.655 0.589 0.509 0.423 0.34 0.265 0.201 0.108 0.0569 0.0331 0.0243 0.0221 0.0219 0.0208 0.015 0.00556 0.00163 0.00056 0.000366 0.000352 0.00032 0.00013 4.4e-05 6.6e-06 1.5e-06 1.5e-07 7.8e-09 0.49 0.49 0.489 0.489 0.487 0.479 0.46 0.431 0.392 0.346 0.298 0.206 0.134 0.0826 0.0493 0.0288 0.0169 0.00695 0.0044 0.00412 0.00302 0.00193 0.00117 0.000702 0.00026 3e-05 4.9e-06 3e-07 3.6e-08 1.6e-09 3e-11 +Z 18 5 2.0 2.0 6.0 2.0 6.0 3177.6 313.43 249.42999999999998 28.92 14.620000000000001 0.049 0.049 0.049 0.049 0.049 0.049 0.0489 0.0489 0.0488 0.0488 0.0487 0.0485 0.0483 0.048 0.0478 0.0474 0.0471 0.0462 0.0447 0.0418 0.0383 0.0347 0.0309 0.0272 0.021 0.0092 0.0039 0.00081 0.00021 2.5e-05 1.4e-06 0.198 0.198 0.198 0.198 0.197 0.196 0.193 0.191 0.187 0.184 0.179 0.17 0.159 0.146 0.134 0.121 0.108 0.0843 0.0542 0.0226 0.00902 0.00462 0.00368 0.00361 0.0033 0.0015 0.00056 9.1e-05 2.1e-05 2.2e-06 1.2e-07 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.102 0.101 0.1 0.0983 0.0961 0.0904 0.0794 0.0586 0.0398 0.0258 0.0163 0.0103 0.0041 0.00053 9.3e-05 6e-06 7.5e-07 3.5e-08 6.5e-10 0.649 0.646 0.637 0.623 0.604 0.552 0.489 0.419 0.348 0.281 0.222 0.13 0.0723 0.0415 0.0275 0.0224 0.0211 0.0208 0.017 0.00758 0.00253 0.000831 0.00042 0.000362 0.00035 0.00016 5.8e-05 9.2e-06 2.1e-06 2.2e-07 1.1e-08 0.442 0.442 0.441 0.441 0.44 0.435 0.423 0.402 0.374 0.34 0.302 0.224 0.156 0.104 0.0665 0.0416 0.0257 0.0102 0.00465 0.0042 0.00345 0.00238 0.00152 0.000949 0.00037 4.5e-05 7.7e-06 4.8e-07 6e-08 2.8e-09 5.1e-11 +Z 19 6 2.0 2.0 6.0 2.0 6.0 1.0 3583.3 371.15999999999997 301.65 40.5 23.75 4.220000000000001 0.0464 0.0464 0.0464 0.0464 0.0464 0.0463 0.0463 0.0463 0.0462 0.0462 0.0461 0.046 0.0458 0.0455 0.0453 0.045 0.0447 0.044 0.0427 0.0402 0.0372 0.0339 0.0306 0.0272 0.021 0.01 0.0045 0.00097 0.00026 3.2e-05 1.8e-06 0.185 0.185 0.185 0.185 0.184 0.183 0.181 0.179 0.176 0.173 0.17 0.162 0.152 0.142 0.131 0.12 0.109 0.0872 0.0588 0.0267 0.0112 0.00535 0.00372 0.00348 0.0033 0.0017 0.00067 0.00012 2.7e-05 2.9e-06 1.5e-07 0.0965 0.0965 0.0965 0.0965 0.0965 0.0965 0.0965 0.0965 0.0964 0.0964 0.0963 0.096 0.0956 0.0949 0.0939 0.0926 0.0909 0.0866 0.0778 0.06 0.0428 0.0289 0.019 0.0123 0.0052 0.00071 0.00013 8.8e-06 1.1e-06 5.3e-08 9.9e-10 0.57 0.568 0.562 0.552 0.539 0.503 0.457 0.405 0.349 0.295 0.243 0.156 0.0946 0.0563 0.0355 0.0257 0.0221 0.0212 0.0192 0.0102 0.0039 0.00133 0.000562 0.000401 0.00038 0.0002 7.8e-05 1.3e-05 3e-06 3.2e-07 1.7e-08 0.376 0.376 0.376 0.376 0.375 0.373 0.367 0.357 0.342 0.322 0.298 0.242 0.185 0.134 0.0933 0.0628 0.0413 0.0174 0.00625 0.00459 0.00417 0.00312 0.00212 0.00137 0.00057 7.3e-05 1.3e-05 8.5e-07 1.1e-07 5e-09 9e-11 2.46 2.32 1.96 1.49 1.02 0.371 0.111 0.0491 0.0427 0.0419 0.0373 0.0233 0.0123 0.00604 0.00295 0.00157 0.00103 0.000823 0.000778 0.000435 0.000167 5.59e-05 2.23e-05 1.51e-05 1.4e-05 7.6e-06 2.9e-06 4.9e-07 1.1e-07 1.2e-08 6.3e-10 +Z 20 6 2.0 2.0 6.0 2.0 6.0 2.0 4015.0000000000005 434.10999999999996 359.03999999999996 53.16 34.01 5.45 0.044 0.044 0.044 0.044 0.044 0.044 0.0439 0.0439 0.0439 0.0438 0.0438 0.0436 0.0435 0.0433 0.0431 0.0428 0.0426 0.042 0.0409 0.0387 0.036 0.0332 0.0302 0.0271 0.021 0.011 0.005 0.0012 0.00032 4e-05 2.3e-06 0.174 0.174 0.174 0.174 0.173 0.172 0.171 0.169 0.167 0.164 0.161 0.154 0.146 0.138 0.128 0.118 0.109 0.0891 0.0626 0.0307 0.0137 0.00637 0.00393 0.00339 0.0033 0.0019 0.00079 0.00014 3.4e-05 3.8e-06 2e-07 0.0902 0.0902 0.0902 0.0902 0.0902 0.0902 0.0902 0.0902 0.0901 0.0901 0.09 0.0899 0.0895 0.089 0.0883 0.0873 0.0861 0.0827 0.0758 0.0607 0.0451 0.0317 0.0216 0.0144 0.0064 0.00094 0.00018 1.3e-05 1.6e-06 7.8e-08 1.5e-09 0.508 0.507 0.503 0.496 0.486 0.46 0.426 0.386 0.342 0.298 0.254 0.176 0.115 0.0724 0.046 0.0314 0.0245 0.0212 0.0204 0.0128 0.00559 0.00206 0.000806 0.000466 0.00041 0.00025 0.0001 1.8e-05 4.2e-06 4.6e-07 2.4e-08 0.33 0.33 0.33 0.33 0.33 0.329 0.326 0.32 0.311 0.299 0.283 0.244 0.199 0.155 0.116 0.0835 0.0584 0.0271 0.00905 0.00483 0.00465 0.00379 0.00273 0.00185 0.00081 0.00011 2.1e-05 1.4e-06 1.8e-07 8.4e-09 1.7e-10 1.95 1.87 1.68 1.4 1.09 0.547 0.228 0.0935 0.0532 0.0466 0.0463 0.0392 0.0264 0.0154 0.00831 0.00439 0.00246 0.00134 0.00126 0.000848 0.000376 0.000137 5.12e-05 2.76e-05 2.3e-05 1.4e-05 5.8e-06 1e-06 2.4e-07 2.6e-08 1.4e-09 +Z 21 7 2.0 2.0 6.0 2.0 6.0 1.0 2.0 4465.8 494.28999999999996 413.68 60.91 39.6 7.08 5.9 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0417 0.0417 0.0416 0.0415 0.0414 0.0412 0.0411 0.0408 0.0406 0.0401 0.0391 0.0372 0.0349 0.0324 0.0297 0.0269 0.022 0.011 0.0055 0.0013 0.00038 5e-05 2.9e-06 0.164 0.164 0.164 0.164 0.163 0.162 0.161 0.16 0.158 0.155 0.153 0.147 0.14 0.133 0.125 0.116 0.108 0.0901 0.0657 0.0344 0.0163 0.00765 0.00433 0.00338 0.0032 0.0021 0.00092 0.00018 4.3e-05 4.9e-06 2.6e-07 0.0847 0.0847 0.0847 0.0847 0.0847 0.0847 0.0847 0.0847 0.0846 0.0846 0.0846 0.0844 0.0842 0.0838 0.0833 0.0825 0.0816 0.079 0.0734 0.0607 0.0467 0.0341 0.0239 0.0165 0.0076 0.0012 0.00024 1.7e-05 2.3e-06 1.1e-07 2.1e-09 0.471 0.47 0.467 0.461 0.453 0.432 0.404 0.371 0.334 0.296 0.258 0.187 0.128 0.0844 0.0549 0.0369 0.0271 0.0208 0.0202 0.0145 0.00719 0.00292 0.00114 0.000562 0.00041 0.00028 0.00012 2.3e-05 5.5e-06 6.2e-07 3.3e-08 0.304 0.304 0.304 0.304 0.304 0.303 0.301 0.297 0.29 0.281 0.27 0.24 0.203 0.165 0.129 0.0971 0.0712 0.0359 0.0124 0.0049 0.00469 0.00413 0.00316 0.00225 0.001 0.00016 3e-05 2.1e-06 2.7e-07 1.3e-08 2.4e-10 0.31 0.31 0.31 0.31 0.31 0.309 0.307 0.303 0.294 0.282 0.266 0.229 0.19 0.154 0.123 0.0974 0.0768 0.0476 0.0235 0.00766 0.0027 0.00103 0.000424 0.000187 4.3e-05 2.3e-06 2.3e-07 6.6e-09 4.6e-10 9.8e-12 1.5e-13 1.84 1.78 1.61 1.37 1.09 0.589 0.266 0.112 0.0569 0.0435 0.0422 0.0389 0.0289 0.0185 0.0108 0.00603 0.00338 0.00147 0.0012 0.000943 0.000479 0.000194 7.36e-05 3.4e-05 2.3e-05 1.6e-05 7e-06 1.3e-06 3.1e-07 3.5e-08 1.8e-09 +Z 22 7 2.0 2.0 6.0 2.0 6.0 2.0 2.0 4940.599999999999 557.4399999999999 471.22 68.61 45.1 8.389999999999999 6.28 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0398 0.0398 0.0398 0.0398 0.0397 0.0396 0.0395 0.0394 0.0392 0.039 0.0388 0.0384 0.0375 0.0359 0.0338 0.0316 0.0291 0.0267 0.022 0.012 0.006 0.0015 0.00045 6.1e-05 3.6e-06 0.155 0.155 0.155 0.155 0.154 0.154 0.153 0.151 0.15 0.148 0.146 0.141 0.135 0.128 0.121 0.114 0.106 0.0905 0.068 0.0378 0.0189 0.00914 0.00492 0.00347 0.0031 0.0022 0.001 0.00021 5.3e-05 6.2e-06 3.3e-07 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0797 0.0796 0.0794 0.0792 0.0787 0.0782 0.0774 0.0754 0.0709 0.0603 0.0479 0.036 0.0261 0.0185 0.009 0.0015 0.00031 2.4e-05 3.2e-06 1.6e-07 3e-09 0.441 0.44 0.437 0.432 0.426 0.408 0.385 0.357 0.326 0.293 0.259 0.194 0.139 0.095 0.0637 0.0431 0.0306 0.0209 0.0195 0.0157 0.00872 0.00389 0.00159 0.000717 0.00041 0.00031 0.00015 2.9e-05 7.1e-06 8e-07 4.3e-08 0.282 0.282 0.282 0.282 0.282 0.282 0.28 0.277 0.273 0.266 0.257 0.233 0.203 0.17 0.138 0.108 0.0822 0.0447 0.0165 0.00522 0.0046 0.0043 0.0035 0.00261 0.0013 0.00021 4.1e-05 3e-06 3.9e-07 1.9e-08 3.5e-10 0.275 0.275 0.275 0.275 0.275 0.275 0.274 0.271 0.266 0.259 0.249 0.223 0.192 0.162 0.134 0.11 0.0894 0.0586 0.0309 0.011 0.00414 0.00166 0.000705 0.000318 7.6e-05 4.2e-06 4.3e-07 1.3e-08 9e-10 1.9e-11 6.5e-14 1.76 1.71 1.56 1.34 1.09 0.619 0.297 0.13 0.0623 0.0419 0.0384 0.037 0.0297 0.0205 0.0128 0.00757 0.00437 0.0017 0.00112 0.000974 0.000561 0.000252 0.000101 4.34e-05 2.2e-05 1.7e-05 8e-06 1.6e-06 3.9e-07 4.4e-08 2.4e-09 +Z 23 7 2.0 2.0 6.0 2.0 6.0 3.0 2.0 5439.6 623.7900000000001 531.88 76.42 50.65 9.61 6.63 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.038 0.038 0.038 0.0379 0.0378 0.0376 0.0375 0.0374 0.0372 0.0368 0.0361 0.0346 0.0328 0.0308 0.0286 0.0263 0.022 0.012 0.0065 0.0018 0.00053 7.3e-05 4.5e-06 0.147 0.147 0.147 0.147 0.146 0.146 0.145 0.144 0.142 0.141 0.139 0.135 0.13 0.124 0.118 0.111 0.104 0.0904 0.0697 0.0408 0.0215 0.0108 0.0057 0.00369 0.003 0.0023 0.0012 0.00025 6.5e-05 7.7e-06 4.2e-07 0.0755 0.0755 0.0755 0.0755 0.0755 0.0755 0.0755 0.0755 0.0755 0.0755 0.0754 0.0754 0.0752 0.075 0.0747 0.0742 0.0737 0.072 0.0684 0.0595 0.0485 0.0376 0.028 0.0204 0.01 0.0019 0.0004 3.2e-05 4.3e-06 2.2e-07 4.3e-09 0.415 0.414 0.412 0.408 0.403 0.388 0.368 0.344 0.317 0.288 0.258 0.199 0.147 0.104 0.0721 0.0495 0.0349 0.0216 0.0187 0.0164 0.0101 0.00494 0.00215 0.000946 0.00042 0.00033 0.00017 3.5e-05 8.9e-06 1e-06 5.6e-08 0.264 0.264 0.264 0.264 0.264 0.264 0.263 0.261 0.257 0.252 0.245 0.226 0.201 0.173 0.144 0.116 0.0915 0.0532 0.0212 0.00587 0.00446 0.00434 0.00375 0.00292 0.0015 0.00027 5.5e-05 4.1e-06 5.5e-07 2.7e-08 5.4e-10 0.25 0.25 0.25 0.25 0.25 0.25 0.249 0.248 0.245 0.24 0.233 0.214 0.19 0.165 0.14 0.118 0.0984 0.0674 0.0377 0.0145 0.00579 0.00243 0.00107 0.000496 0.00012 7.1e-06 7.5e-07 2.3e-08 1.6e-09 3.5e-11 1.2e-13 1.69 1.65 1.51 1.32 1.09 0.643 0.324 0.147 0.0691 0.042 0.0356 0.0346 0.0296 0.0217 0.0144 0.00897 0.00538 0.00203 0.00105 0.000961 0.000622 0.000308 0.000133 5.65e-05 2.2e-05 1.8e-05 8.9e-06 1.9e-06 4.7e-07 5.4e-08 2.9e-09 +Z 24 7 2.0 2.0 6.0 2.0 6.0 5.0 1.0 5957.6 687.34 589.7399999999999 79.19000000000001 51.25 6.46 5.96 0.0365 0.0365 0.0365 0.0365 0.0365 0.0365 0.0364 0.0364 0.0364 0.0364 0.0363 0.0363 0.0362 0.0361 0.036 0.0358 0.0357 0.0353 0.0347 0.0334 0.0318 0.03 0.028 0.026 0.022 0.013 0.007 0.002 0.00062 8.8e-05 5.4e-06 0.14 0.14 0.14 0.14 0.139 0.139 0.138 0.137 0.136 0.134 0.133 0.129 0.125 0.12 0.114 0.109 0.103 0.0899 0.0709 0.0434 0.0241 0.0126 0.00663 0.00405 0.0029 0.0024 0.0013 0.0003 7.8e-05 9.4e-06 5.3e-07 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0715 0.0714 0.0712 0.071 0.0706 0.0702 0.0689 0.0659 0.0584 0.0488 0.0388 0.0297 0.0221 0.012 0.0023 0.00051 4.2e-05 5.8e-06 3e-07 5.9e-09 0.398 0.398 0.395 0.392 0.387 0.374 0.356 0.334 0.31 0.284 0.256 0.202 0.152 0.111 0.0782 0.0546 0.0385 0.0225 0.0177 0.0164 0.0111 0.00591 0.00274 0.00123 0.00043 0.00035 0.00019 4.2e-05 1.1e-05 1.3e-06 7e-08 0.253 0.253 0.253 0.252 0.252 0.252 0.251 0.249 0.246 0.242 0.236 0.22 0.198 0.173 0.147 0.121 0.0974 0.0594 0.0255 0.00673 0.00427 0.0042 0.00381 0.00312 0.0018 0.00033 7.1e-05 5.5e-06 7.4e-07 3.7e-08 7.4e-10 0.261 0.261 0.261 0.261 0.261 0.261 0.26 0.257 0.251 0.244 0.234 0.209 0.183 0.156 0.133 0.111 0.0933 0.065 0.0376 0.0153 0.00646 0.00283 0.00129 0.000614 0.00016 9.6e-06 1e-06 3.2e-08 2.4e-09 5.3e-11 3.1e-13 1.85 1.79 1.62 1.38 1.11 0.611 0.282 0.117 0.0512 0.0313 0.0275 0.0267 0.0222 0.0161 0.0108 0.00684 0.00421 0.00163 0.00074 0.000673 0.000482 0.000261 0.000121 5.33e-05 1.7e-05 1.3e-05 7.1e-06 1.6e-06 4.1e-07 4.8e-08 2.6e-09 +Z 25 7 2.0 2.0 6.0 2.0 6.0 5.0 2.0 6510.9 766.47 662.97 92.58 62.089999999999996 11.85 7.25 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.0349 0.0349 0.0349 0.0349 0.0348 0.0347 0.0346 0.0345 0.0344 0.0343 0.034 0.0334 0.0322 0.0308 0.0292 0.0274 0.0255 0.022 0.013 0.0074 0.0022 0.00071 0.0001 6.6e-06 0.133 0.133 0.133 0.133 0.133 0.132 0.132 0.131 0.13 0.129 0.127 0.124 0.12 0.116 0.111 0.106 0.1 0.0891 0.0717 0.0457 0.0265 0.0144 0.00771 0.00453 0.0029 0.0025 0.0014 0.00034 9.3e-05 1.1e-05 6.5e-07 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.0681 0.068 0.0678 0.0676 0.0674 0.067 0.066 0.0635 0.0572 0.0488 0.0397 0.0311 0.0236 0.013 0.0027 0.00063 5.4e-05 7.6e-06 4e-07 8e-09 0.373 0.372 0.37 0.367 0.364 0.352 0.338 0.32 0.299 0.276 0.253 0.205 0.159 0.119 0.087 0.0623 0.0445 0.025 0.0175 0.0166 0.0123 0.00707 0.00352 0.00164 0.00049 0.00036 0.00021 5e-05 1.3e-05 1.6e-06 8.9e-08 0.235 0.235 0.235 0.235 0.235 0.235 0.234 0.233 0.231 0.228 0.223 0.211 0.194 0.173 0.15 0.127 0.105 0.068 0.0315 0.00837 0.00438 0.00417 0.00395 0.00338 0.002 0.00042 9.3e-05 7.5e-06 1e-06 5.2e-08 1e-09 0.215 0.215 0.215 0.215 0.215 0.215 0.214 0.214 0.212 0.21 0.206 0.195 0.18 0.162 0.144 0.126 0.109 0.0801 0.0493 0.0216 0.00959 0.00438 0.00207 0.00101 0.00027 1.7e-05 1.9e-06 6.2e-08 4.6e-09 1e-10 8.2e-13 1.59 1.55 1.44 1.27 1.08 0.677 0.368 0.18 0.0856 0.0458 0.0326 0.0296 0.0277 0.0225 0.0165 0.0112 0.00731 0.00292 0.00105 0.000863 0.000683 0.000405 0.000203 9.3e-05 2.5e-05 1.8e-05 1e-05 2.4e-06 6.5e-07 7.7e-08 4.3e-09 +Z 26 7 2.0 2.0 6.0 2.0 6.0 6.0 2.0 7083.400000000001 842.96 733.5500000000001 101.00999999999999 68.04 12.91 7.53 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0335 0.0335 0.0335 0.0334 0.0334 0.0333 0.0332 0.0331 0.033 0.0327 0.0322 0.0312 0.0299 0.0284 0.0268 0.0251 0.022 0.014 0.0078 0.0024 0.00081 0.00012 7.9e-06 0.127 0.127 0.127 0.127 0.127 0.127 0.126 0.125 0.124 0.123 0.122 0.119 0.116 0.112 0.108 0.103 0.0983 0.088 0.0721 0.0476 0.0287 0.0162 0.00888 0.00513 0.0029 0.0025 0.0015 0.00039 0.00011 1.4e-05 7.9e-07 0.065 0.065 0.065 0.065 0.065 0.065 0.065 0.065 0.065 0.065 0.065 0.0649 0.0649 0.0648 0.0646 0.0644 0.0641 0.0632 0.0612 0.0559 0.0485 0.0403 0.0322 0.025 0.014 0.0032 0.00077 6.9e-05 9.9e-06 5.3e-07 1.1e-08 0.355 0.354 0.353 0.35 0.347 0.337 0.324 0.309 0.29 0.27 0.249 0.205 0.163 0.125 0.0935 0.0684 0.0496 0.0275 0.0173 0.0163 0.013 0.00806 0.00429 0.00209 0.00057 0.00037 0.00023 5.9e-05 1.6e-05 2e-06 1.1e-07 0.223 0.223 0.223 0.223 0.223 0.223 0.222 0.221 0.22 0.217 0.214 0.203 0.189 0.171 0.151 0.131 0.11 0.0743 0.0367 0.0102 0.00454 0.00403 0.00394 0.00351 0.0023 0.00051 0.00012 9.9e-06 1.4e-06 7.1e-08 1.4e-09 0.201 0.201 0.201 0.201 0.201 0.201 0.201 0.2 0.199 0.197 0.195 0.186 0.174 0.159 0.143 0.127 0.112 0.0845 0.0541 0.025 0.0117 0.00553 0.0027 0.00136 0.00038 2.5e-05 2.9e-06 9.6e-08 7.2e-09 1.6e-10 1.3e-12 1.55 1.51 1.41 1.25 1.07 0.69 0.387 0.196 0.0946 0.0492 0.0324 0.0273 0.0264 0.0224 0.0171 0.0121 0.00815 0.00343 0.00113 0.0008 0.000686 0.000442 0.000237 0.000115 2.9e-05 1.7e-05 1.1e-05 2.7e-06 7.5e-07 9.1e-08 5.1e-09 +Z 27 7 2.0 2.0 6.0 2.0 6.0 7.0 2.0 7680.700000000001 922.9499999999999 807.5400000000001 109.69 74.17 13.93 7.81 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0322 0.0322 0.0321 0.0321 0.032 0.0319 0.0318 0.0315 0.0311 0.0301 0.029 0.0277 0.0262 0.0247 0.021 0.014 0.0082 0.0027 0.00091 0.00014 9.4e-06 0.122 0.122 0.122 0.122 0.122 0.121 0.121 0.12 0.119 0.118 0.117 0.115 0.112 0.108 0.105 0.101 0.0961 0.0868 0.0722 0.0492 0.0308 0.018 0.0101 0.00585 0.0029 0.0025 0.0016 0.00045 0.00013 1.7e-05 9.6e-07 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.0621 0.062 0.0619 0.0618 0.0616 0.0614 0.0607 0.059 0.0545 0.0481 0.0406 0.0331 0.0262 0.016 0.0037 0.00094 8.7e-05 1.3e-05 6.9e-07 1.4e-08 0.339 0.339 0.337 0.335 0.332 0.324 0.312 0.298 0.282 0.264 0.245 0.205 0.166 0.13 0.0992 0.0741 0.0546 0.0303 0.0175 0.0158 0.0134 0.00895 0.00507 0.0026 0.00069 0.00037 0.00025 6.8e-05 1.9e-05 2.4e-06 1.3e-07 0.212 0.212 0.212 0.212 0.212 0.212 0.212 0.211 0.209 0.207 0.205 0.196 0.184 0.169 0.151 0.133 0.114 0.0797 0.0417 0.0123 0.00489 0.00391 0.00387 0.00358 0.0025 0.00061 0.00015 1.3e-05 1.8e-06 9.4e-08 1.9e-09 0.19 0.19 0.19 0.19 0.19 0.189 0.189 0.189 0.188 0.187 0.185 0.178 0.168 0.155 0.141 0.127 0.113 0.0879 0.0582 0.0283 0.0138 0.00678 0.00341 0.00176 0.00051 3.6e-05 4.2e-06 1.4e-07 1.1e-08 2.5e-10 1.7e-12 1.51 1.48 1.38 1.24 1.06 0.7 0.404 0.211 0.104 0.0533 0.033 0.0254 0.0249 0.022 0.0174 0.0128 0.0089 0.00396 0.00125 0.00074 0.000675 0.000469 0.000269 0.000138 3.5e-05 1.6e-05 1.1e-05 3.1e-06 8.5e-07 1.1e-07 6e-09 +Z 28 7 2.0 2.0 6.0 2.0 6.0 8.0 2.0 8302.800000000001 1006.5 884.9799999999999 118.64 80.48 14.66 8.09 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.031 0.031 0.0309 0.0308 0.0307 0.0306 0.0304 0.03 0.0292 0.0282 0.027 0.0256 0.0242 0.021 0.014 0.0085 0.0029 0.001 0.00016 1.1e-05 0.117 0.117 0.117 0.117 0.117 0.116 0.116 0.115 0.115 0.114 0.113 0.111 0.108 0.105 0.102 0.0979 0.0939 0.0855 0.0721 0.0505 0.0326 0.0197 0.0114 0.00665 0.0031 0.0025 0.0017 0.0005 0.00015 2e-05 1.2e-06 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0595 0.0594 0.0593 0.0592 0.0591 0.0589 0.0583 0.0569 0.0531 0.0475 0.0408 0.0338 0.0273 0.017 0.0043 0.0011 0.00011 1.6e-05 8.9e-07 1.8e-08 0.325 0.324 0.323 0.321 0.318 0.311 0.301 0.288 0.274 0.258 0.241 0.204 0.168 0.134 0.104 0.0793 0.0595 0.0334 0.018 0.0152 0.0137 0.00972 0.00584 0.00316 0.00085 0.00036 0.00027 7.7e-05 2.2e-05 2.8e-06 1.6e-07 0.202 0.202 0.202 0.202 0.202 0.202 0.202 0.201 0.2 0.199 0.196 0.189 0.179 0.166 0.151 0.134 0.117 0.0844 0.0466 0.0147 0.00544 0.00384 0.00376 0.0036 0.0026 0.00071 0.00018 1.6e-05 2.3e-06 1.2e-07 2.5e-09 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.178 0.177 0.176 0.17 0.162 0.151 0.139 0.127 0.114 0.0904 0.0617 0.0314 0.0159 0.00809 0.00419 0.00222 0.00067 4.9e-05 5.9e-06 2.1e-07 1.6e-08 3.6e-10 2.4e-12 1.47 1.44 1.35 1.22 1.05 0.709 0.42 0.225 0.113 0.058 0.0342 0.0238 0.0234 0.0213 0.0175 0.0133 0.00954 0.00448 0.00142 0.000688 0.000652 0.000487 0.000298 0.000162 4.2e-05 1.6e-05 1.2e-05 3.4e-06 9.6e-07 1.2e-07 7.1e-09 +Z 29 7 2.0 2.0 6.0 2.0 6.0 10.0 1.0 8943.2 1086.1 958.53 121.26 80.5 9.799999999999999 7.109999999999999 0.0301 0.0301 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.0299 0.0299 0.0298 0.0298 0.0297 0.0296 0.0294 0.029 0.0283 0.0273 0.0263 0.0251 0.0238 0.021 0.014 0.0089 0.0032 0.0011 0.00019 1.3e-05 0.112 0.112 0.112 0.112 0.112 0.112 0.111 0.111 0.11 0.11 0.109 0.107 0.104 0.102 0.0986 0.0953 0.0917 0.0841 0.0718 0.0516 0.0343 0.0214 0.0128 0.00753 0.0033 0.0024 0.0018 0.00056 0.00017 2.3e-05 1.4e-06 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.0571 0.057 0.057 0.0569 0.0568 0.0566 0.0561 0.055 0.0517 0.0467 0.0407 0.0343 0.0282 0.018 0.0048 0.0013 0.00013 2e-05 1.1e-06 2.4e-08 0.315 0.315 0.314 0.312 0.309 0.302 0.293 0.282 0.268 0.253 0.237 0.203 0.169 0.137 0.108 0.0831 0.0631 0.036 0.0185 0.0145 0.0136 0.0102 0.0065 0.00369 0.001 0.00035 0.00028 8.6e-05 2.5e-05 3.3e-06 1.9e-07 0.196 0.196 0.196 0.196 0.196 0.196 0.195 0.195 0.194 0.193 0.19 0.184 0.175 0.163 0.149 0.134 0.118 0.0872 0.0502 0.0169 0.00607 0.00378 0.00359 0.00352 0.0027 0.00081 0.00021 2e-05 3e-06 1.6e-07 3.3e-09 0.185 0.185 0.185 0.185 0.185 0.185 0.185 0.184 0.183 0.181 0.179 0.171 0.161 0.148 0.135 0.122 0.11 0.0869 0.0599 0.0314 0.0164 0.00862 0.00459 0.00249 0.00078 6.1e-05 7.5e-06 2.8e-07 2.2e-08 5.1e-10 3.5e-12 1.64 1.6 1.48 1.31 1.1 0.686 0.37 0.179 0.0819 0.0392 0.0234 0.018 0.0177 0.0156 0.0125 0.00936 0.00675 0.00325 0.00106 0.000461 0.000443 0.000351 0.000229 0.000131 3.6e-05 1.1e-05 8.4e-06 2.6e-06 7.7e-07 1e-07 5.9e-09 +Z 30 7 2.0 2.0 6.0 2.0 6.0 10.0 2.0 9622.4 1184.3999999999999 1050.5 137.42999999999998 90.59 16.849999999999998 8.610000000000001 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.0289 0.0289 0.0288 0.0288 0.0287 0.0286 0.0284 0.0281 0.0274 0.0266 0.0256 0.0245 0.0233 0.021 0.014 0.0092 0.0034 0.0013 0.00022 1.5e-05 0.108 0.108 0.108 0.108 0.108 0.108 0.107 0.107 0.106 0.106 0.105 0.103 0.101 0.0985 0.0958 0.0928 0.0896 0.0826 0.0713 0.0524 0.0358 0.023 0.0141 0.00847 0.0035 0.0024 0.0019 0.00062 0.00019 2.7e-05 1.6e-06 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0548 0.0548 0.0547 0.0546 0.0545 0.0541 0.0531 0.0503 0.046 0.0406 0.0347 0.0289 0.019 0.0054 0.0015 0.00016 2.5e-05 1.4e-06 3e-08 0.299 0.299 0.298 0.297 0.294 0.289 0.281 0.271 0.259 0.246 0.232 0.201 0.17 0.14 0.113 0.0885 0.0685 0.04 0.02 0.0142 0.0136 0.0109 0.00727 0.00434 0.0013 0.00035 0.00029 9.7e-05 3e-05 4e-06 2.3e-07 0.186 0.186 0.186 0.186 0.186 0.185 0.185 0.185 0.184 0.183 0.181 0.176 0.169 0.159 0.147 0.134 0.12 0.0915 0.0553 0.0199 0.00714 0.00394 0.00353 0.0035 0.0029 0.00093 0.00026 2.5e-05 3.8e-06 2.1e-07 4.3e-09 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.161 0.16 0.157 0.151 0.143 0.134 0.124 0.114 0.0933 0.0671 0.037 0.0201 0.0109 0.00594 0.0033 0.0011 8.9e-05 1.1e-05 4.3e-07 3.4e-08 8.1e-10 6.2e-12 1.41 1.38 1.3 1.18 1.04 0.721 0.446 0.251 0.132 0.0687 0.0383 0.0216 0.0206 0.0198 0.0172 0.0138 0.0105 0.00545 0.00183 0.000624 0.000588 0.000497 0.000343 0.000207 6.1e-05 1.4e-05 1.2e-05 3.9e-06 1.2e-06 1.6e-07 9.4e-09 +Z 31 8 2.0 2.0 6.0 2.0 6.0 10.0 2.0 1.0 10331.0 1290.7 1150.4 157.75 111.00999999999999 11.69 5.0 4.88 0.0281 0.0281 0.0281 0.0281 0.0281 0.0281 0.0281 0.028 0.028 0.028 0.028 0.028 0.0279 0.0279 0.0278 0.0278 0.0277 0.0275 0.0272 0.0266 0.0259 0.025 0.0239 0.0228 0.02 0.014 0.0094 0.0036 0.0014 0.00024 1.8e-05 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.103 0.102 0.101 0.0997 0.0978 0.0956 0.0931 0.0904 0.0875 0.0811 0.0707 0.053 0.0371 0.0245 0.0154 0.00945 0.0039 0.0023 0.0019 0.00068 0.00022 3.1e-05 1.9e-06 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0528 0.0527 0.0527 0.0526 0.0525 0.0521 0.0513 0.0489 0.0451 0.0403 0.0349 0.0295 0.02 0.006 0.0018 0.00019 3.1e-05 1.8e-06 3.9e-08 0.285 0.284 0.284 0.282 0.281 0.275 0.269 0.26 0.25 0.238 0.226 0.199 0.17 0.143 0.117 0.0934 0.0736 0.0443 0.0219 0.0139 0.0136 0.0114 0.00802 0.00501 0.0016 0.00035 0.0003 0.00011 3.4e-05 4.7e-06 2.8e-07 0.176 0.176 0.176 0.176 0.176 0.176 0.175 0.175 0.175 0.174 0.173 0.169 0.163 0.155 0.145 0.133 0.121 0.0952 0.0602 0.0233 0.0085 0.00424 0.00351 0.00348 0.003 0.0011 0.00031 3.2e-05 4.8e-06 2.7e-07 5.6e-09 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.145 0.145 0.145 0.143 0.14 0.135 0.129 0.122 0.114 0.0971 0.0729 0.0424 0.0238 0.0133 0.00747 0.00424 0.0014 0.00012 1.6e-05 6.4e-07 5.2e-08 1.3e-09 1e-11 1.18 1.16 1.11 1.04 0.944 0.723 0.506 0.327 0.198 0.116 0.0673 0.0302 0.0244 0.0241 0.0227 0.0196 0.0158 0.00899 0.00322 0.000891 0.000784 0.000701 0.000512 0.000325 0.0001 1.9e-05 1.7e-05 6e-06 1.9e-06 2.6e-07 1.5e-08 0.915 0.914 0.912 0.901 0.876 0.773 0.618 0.452 0.309 0.201 0.126 0.0464 0.0168 0.00712 0.00447 0.00398 0.00395 0.00367 0.00255 0.000981 0.000326 0.000131 9.21e-05 8.92e-05 8e-05 2.9e-05 8.3e-06 8.5e-07 1.3e-07 7.1e-09 1.5e-10 +Z 32 8 2.0 2.0 6.0 2.0 6.0 10.0 2.0 2.0 11067.0 1402.3 1255.4 179.25 129.38000000000002 38.19 14.780000000000001 6.5 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0271 0.0271 0.0271 0.0271 0.0271 0.027 0.027 0.0269 0.0268 0.0267 0.0264 0.0259 0.0252 0.0243 0.0234 0.0224 0.02 0.015 0.0097 0.0039 0.0015 0.00028 2e-05 0.101 0.101 0.101 0.1 0.1 0.1 0.0999 0.0995 0.0991 0.0985 0.0979 0.0965 0.0948 0.0928 0.0905 0.0881 0.0854 0.0796 0.07 0.0535 0.0383 0.0259 0.0167 0.0105 0.0043 0.0023 0.0019 0.00074 0.00025 3.6e-05 2.2e-06 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0509 0.0508 0.0508 0.0507 0.0506 0.0503 0.0496 0.0475 0.0442 0.0399 0.035 0.0299 0.021 0.0066 0.002 0.00023 3.8e-05 2.2e-06 4.8e-08 0.271 0.271 0.27 0.269 0.267 0.263 0.257 0.25 0.241 0.231 0.22 0.195 0.17 0.144 0.12 0.0978 0.0784 0.0486 0.0241 0.0138 0.0135 0.0118 0.00873 0.0057 0.0019 0.00035 0.00031 0.00012 3.9e-05 5.6e-06 3.4e-07 0.167 0.167 0.167 0.167 0.167 0.167 0.166 0.166 0.166 0.165 0.164 0.161 0.156 0.15 0.142 0.132 0.121 0.098 0.0648 0.027 0.0101 0.0047 0.00353 0.00344 0.0031 0.0012 0.00036 3.9e-05 6.1e-06 3.4e-07 7.2e-09 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.132 0.131 0.13 0.127 0.123 0.118 0.112 0.0984 0.0771 0.0472 0.0276 0.0159 0.00913 0.00529 0.0018 0.00017 2.3e-05 9.3e-07 7.7e-08 1.9e-09 1.5e-11 1.03 1.02 0.985 0.934 0.866 0.702 0.527 0.371 0.246 0.156 0.0971 0.0415 0.0277 0.0262 0.0258 0.0238 0.0204 0.0128 0.00501 0.00121 0.000938 0.00088 0.00068 0.000453 0.00015 2.3e-05 2.1e-05 8.1e-06 2.6e-06 3.7e-07 2.2e-08 0.769 0.769 0.768 0.763 0.751 0.698 0.605 0.489 0.371 0.269 0.187 0.0837 0.0351 0.015 0.00775 0.00561 0.0052 0.00509 0.00395 0.0017 0.000595 0.000226 0.000137 0.000126 0.00012 4.8e-05 1.4e-05 1.5e-06 2.3e-07 1.3e-08 2.8e-10 +Z 33 8 2.0 2.0 6.0 2.0 6.0 10.0 2.0 3.0 11829.0 1519.2 1365.7 202.01999999999998 148.95 50.550000000000004 17.86 8.120000000000001 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0262 0.0262 0.0261 0.0261 0.026 0.0259 0.0257 0.0251 0.0245 0.0237 0.0229 0.022 0.02 0.015 0.0099 0.0041 0.0016 0.00031 2.3e-05 0.0971 0.0971 0.0971 0.097 0.097 0.0968 0.0965 0.0962 0.0958 0.0953 0.0948 0.0935 0.0919 0.0901 0.0881 0.0858 0.0834 0.0781 0.0693 0.0538 0.0393 0.0272 0.0179 0.0115 0.0047 0.0022 0.002 0.0008 0.00027 4.1e-05 2.6e-06 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.049 0.049 0.0489 0.0487 0.0481 0.0463 0.0433 0.0395 0.035 0.0302 0.021 0.0072 0.0023 0.00027 4.6e-05 2.7e-06 6e-08 0.258 0.258 0.258 0.257 0.255 0.252 0.246 0.24 0.232 0.223 0.213 0.192 0.169 0.145 0.122 0.101 0.0826 0.0528 0.0266 0.0139 0.0133 0.0121 0.00937 0.00639 0.0023 0.00035 0.00032 0.00013 4.5e-05 6.5e-06 4e-07 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.157 0.156 0.154 0.15 0.145 0.138 0.13 0.121 0.0999 0.0689 0.0307 0.012 0.00532 0.00362 0.00341 0.0032 0.0014 0.00043 4.8e-05 7.6e-06 4.3e-07 9.3e-09 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.122 0.122 0.122 0.121 0.119 0.116 0.113 0.109 0.0979 0.0797 0.0514 0.0312 0.0185 0.0109 0.00646 0.0023 0.00023 3.2e-05 1.3e-06 1.1e-07 2.8e-09 2.1e-11 0.922 0.914 0.89 0.852 0.801 0.673 0.531 0.396 0.28 0.19 0.125 0.0552 0.0321 0.0275 0.0273 0.0264 0.0239 0.0165 0.00719 0.00165 0.00107 0.00103 0.000845 0.00059 0.00022 2.7e-05 2.5e-05 1e-05 3.5e-06 5e-07 3.1e-08 0.674 0.674 0.673 0.67 0.664 0.632 0.573 0.491 0.399 0.31 0.232 0.12 0.0569 0.0263 0.0129 0.00789 0.00636 0.00607 0.00524 0.00255 0.000954 0.000354 0.000188 0.00016 0.00015 6.8e-05 2.1e-05 2.4e-06 3.7e-07 2.1e-08 4.6e-10 +Z 34 8 2.0 2.0 6.0 2.0 6.0 10.0 2.0 4.0 12619.0 1641.5 1481.2 226.1 169.76999999999998 63.97 20.990000000000002 9.819999999999999 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0254 0.0254 0.0254 0.0253 0.0253 0.0251 0.0249 0.0244 0.0239 0.0232 0.0224 0.0215 0.02 0.015 0.01 0.0043 0.0018 0.00034 2.7e-05 0.0939 0.0939 0.0939 0.0939 0.0938 0.0936 0.0934 0.0931 0.0927 0.0923 0.0918 0.0906 0.0892 0.0876 0.0857 0.0837 0.0815 0.0766 0.0684 0.054 0.0401 0.0283 0.0191 0.0125 0.0052 0.0022 0.002 0.00086 0.0003 4.7e-05 3e-06 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0474 0.0474 0.0473 0.0473 0.0471 0.0466 0.045 0.0424 0.039 0.0349 0.0305 0.022 0.0079 0.0026 0.00032 5.5e-05 3.3e-06 7.5e-08 0.247 0.247 0.246 0.245 0.244 0.241 0.236 0.23 0.223 0.216 0.207 0.188 0.167 0.145 0.124 0.104 0.0864 0.0568 0.0293 0.0142 0.013 0.0123 0.00994 0.00706 0.0028 0.00036 0.00033 0.00015 5.1e-05 7.6e-06 4.8e-07 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.15 0.15 0.15 0.149 0.147 0.144 0.14 0.134 0.127 0.119 0.101 0.0723 0.0344 0.0142 0.00613 0.00379 0.00338 0.0033 0.0015 0.0005 5.8e-05 9.4e-06 5.5e-07 1.2e-08 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.113 0.112 0.11 0.108 0.104 0.0963 0.0809 0.0549 0.0347 0.0212 0.0128 0.00773 0.0029 0.0003 4.2e-05 1.8e-06 1.6e-07 4e-09 2.9e-11 0.839 0.833 0.814 0.785 0.745 0.643 0.526 0.409 0.304 0.217 0.15 0.0702 0.0381 0.0291 0.028 0.0277 0.0262 0.0198 0.00964 0.00224 0.00119 0.00116 0.001 0.000734 0.00029 3.2e-05 2.8e-05 1.3e-05 4.4e-06 6.5e-07 4.1e-08 0.604 0.604 0.603 0.602 0.598 0.578 0.538 0.479 0.408 0.333 0.263 0.151 0.0797 0.04 0.0202 0.0113 0.00791 0.00673 0.00628 0.00349 0.00141 0.000528 0.000252 0.000192 0.00018 9e-05 3e-05 3.5e-06 5.6e-07 3.2e-08 7e-10 +Z 35 8 2.0 2.0 6.0 2.0 6.0 10.0 2.0 5.0 13435.0 1769.2 1602.1 251.48999999999998 191.82 78.45 24.18 11.590000000000002 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0247 0.0247 0.0247 0.0246 0.0246 0.0245 0.0244 0.0242 0.0238 0.0233 0.0226 0.0219 0.0211 0.019 0.015 0.01 0.0045 0.0019 0.00038 3e-05 0.0909 0.0909 0.0909 0.0909 0.0908 0.0907 0.0904 0.0902 0.0898 0.0894 0.089 0.0879 0.0866 0.0851 0.0834 0.0816 0.0796 0.0751 0.0675 0.054 0.0409 0.0294 0.0203 0.0135 0.0058 0.0021 0.002 0.00092 0.00034 5.3e-05 3.5e-06 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0458 0.0458 0.0456 0.0451 0.0438 0.0415 0.0384 0.0347 0.0306 0.023 0.0085 0.0029 0.00037 6.5e-05 4e-06 9.2e-08 0.236 0.236 0.236 0.235 0.234 0.231 0.227 0.222 0.216 0.209 0.201 0.184 0.165 0.145 0.125 0.107 0.0895 0.0605 0.0321 0.0147 0.0128 0.0124 0.0104 0.00769 0.0032 0.00039 0.00033 0.00016 5.8e-05 8.8e-06 5.6e-07 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.143 0.143 0.143 0.142 0.141 0.138 0.135 0.13 0.124 0.117 0.101 0.0751 0.038 0.0165 0.00712 0.00405 0.00339 0.0033 0.0017 0.00057 7e-05 1.2e-05 6.8e-07 1.5e-08 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.106 0.105 0.104 0.102 0.1 0.0938 0.0812 0.0577 0.0378 0.0238 0.0147 0.00909 0.0035 0.00038 5.6e-05 2.5e-06 2.2e-07 5.6e-09 3.8e-11 0.772 0.767 0.752 0.729 0.697 0.614 0.516 0.415 0.32 0.238 0.172 0.0855 0.0454 0.0314 0.0284 0.0282 0.0276 0.0226 0.0122 0.00303 0.00134 0.00126 0.00114 0.000878 0.00038 3.9e-05 3.1e-05 1.5e-05 5.5e-06 8.3e-07 6.3e-08 0.549 0.549 0.549 0.548 0.545 0.532 0.504 0.461 0.406 0.345 0.283 0.177 0.102 0.0551 0.0292 0.0161 0.0102 0.00728 0.00703 0.00444 0.00195 0.000756 0.000335 0.000227 0.00021 0.00011 3.9e-05 4.8e-06 7.8e-07 4.6e-08 1e-09 +Z 36 12 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 14280.0 1902.3 1728.3000000000002 1673.4 278.17 215.11999999999998 206.96 95.35 93.98 27.44 13.43 12.72 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0233 0.0233 0.0233 0.0232 0.0232 0.0231 0.0229 0.0226 0.0221 0.0215 0.0209 0.0202 0.019 0.014 0.01 0.0049 0.0022 0.00049 4.9e-05 0.0862 0.0862 0.0862 0.0861 0.0861 0.0859 0.0858 0.0855 0.0852 0.0849 0.0845 0.0836 0.0825 0.0812 0.0798 0.0782 0.0764 0.0725 0.0659 0.0538 0.0418 0.031 0.022 0.0152 0.0068 0.002 0.0019 0.001 0.00041 7.5e-05 6.1e-06 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0433 0.0432 0.0432 0.0431 0.0427 0.0416 0.0398 0.0373 0.0341 0.0305 0.023 0.0095 0.0035 0.00052 0.0001 7.8e-06 2.8e-07 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0442 0.0442 0.0442 0.0441 0.044 0.0436 0.0424 0.0405 0.0377 0.0344 0.0306 0.023 0.0091 0.0032 0.00045 8.2e-05 5.6e-06 1.5e-07 0.222 0.222 0.222 0.221 0.22 0.218 0.214 0.21 0.205 0.199 0.192 0.178 0.161 0.144 0.126 0.109 0.0934 0.0655 0.0363 0.0156 0.0123 0.0121 0.0108 0.0085 0.004 0.00045 0.00032 0.00019 7.3e-05 1.3e-05 1e-06 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.132 0.131 0.128 0.124 0.12 0.114 0.101 0.0781 0.0429 0.0201 0.00892 0.00462 0.00339 0.0032 0.0019 0.00072 0.0001 1.9e-05 1.4e-06 4.8e-08 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.136 0.136 0.135 0.133 0.13 0.126 0.121 0.115 0.101 0.0774 0.0415 0.019 0.00837 0.00445 0.00342 0.0033 0.0018 0.00067 8.8e-05 1.5e-05 9.9e-07 2.6e-08 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.1 0.0996 0.0988 0.0975 0.0958 0.0909 0.0805 0.0597 0.0406 0.0264 0.0168 0.0106 0.0042 0.0005 7.7e-05 3.7e-06 3.5e-07 1.1e-08 1.3e-10 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.0994 0.0981 0.0963 0.0913 0.0807 0.0595 0.0403 0.0261 0.0165 0.0104 0.0041 0.00048 7.3e-05 3.4e-06 3.1e-07 8.6e-09 9.3e-11 0.705 0.701 0.689 0.671 0.646 0.581 0.501 0.416 0.333 0.259 0.195 0.104 0.0561 0.0353 0.0288 0.0277 0.0276 0.0247 0.0154 0.00438 0.00156 0.00131 0.00125 0.00104 0.00051 5e-05 3.3e-05 1.9e-05 7.6e-06 1.3e-06 1e-07 0.496 0.496 0.496 0.495 0.494 0.485 0.467 0.436 0.396 0.348 0.298 0.202 0.126 0.0745 0.0423 0.0239 0.0143 0.00797 0.00731 0.00545 0.00273 0.00114 0.000483 0.000274 0.00022 0.00014 5.5e-05 7.6e-06 1.4e-06 1e-07 3.5e-09 0.508 0.508 0.508 0.507 0.505 0.496 0.475 0.442 0.398 0.348 0.295 0.196 0.121 0.0698 0.039 0.0219 0.0132 0.00782 0.00734 0.00527 0.00254 0.00104 0.000442 0.000264 0.00023 0.00014 5.1e-05 6.6e-06 1.1e-06 7.3e-08 1.9e-09 +Z 37 13 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 1.0 15159.0 2048.0 1867.1 1805.1 313.18 246.69 237.29 119.2 117.57000000000001 36.72 20.73 19.75 4.02 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0226 0.0226 0.0226 0.0225 0.0225 0.0223 0.022 0.0215 0.021 0.0204 0.0198 0.018 0.014 0.011 0.0051 0.0023 0.00054 5.6e-05 0.0835 0.0835 0.0835 0.0834 0.0834 0.0833 0.0831 0.0829 0.0826 0.0823 0.082 0.0811 0.0801 0.079 0.0776 0.0762 0.0745 0.071 0.0649 0.0536 0.0422 0.0318 0.0231 0.0161 0.0074 0.002 0.0019 0.0011 0.00045 8.4e-05 7.1e-06 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0418 0.0417 0.0414 0.0405 0.0389 0.0366 0.0337 0.0305 0.024 0.01 0.0039 0.0006 0.00012 9.4e-06 3.4e-07 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0429 0.0428 0.0428 0.0427 0.0423 0.0413 0.0396 0.0371 0.0341 0.0306 0.023 0.0097 0.0036 0.00052 9.7e-05 6.7e-06 1.8e-07 0.213 0.213 0.213 0.212 0.211 0.209 0.206 0.202 0.198 0.192 0.187 0.173 0.158 0.143 0.127 0.111 0.0955 0.0686 0.0392 0.0167 0.0121 0.0119 0.011 0.00899 0.0045 0.00051 0.00032 0.0002 8.1e-05 1.5e-05 1.2e-06 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.128 0.128 0.128 0.128 0.127 0.126 0.123 0.12 0.116 0.112 0.1 0.0796 0.046 0.0227 0.0104 0.0052 0.00352 0.0032 0.002 0.00081 0.00012 2.3e-05 1.7e-06 6e-08 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.13 0.13 0.129 0.128 0.125 0.122 0.118 0.113 0.101 0.079 0.0447 0.0215 0.00971 0.00496 0.00352 0.0033 0.002 0.00076 0.0001 1.9e-05 1.2e-06 3.2e-08 0.095 0.095 0.095 0.095 0.095 0.095 0.095 0.095 0.095 0.095 0.095 0.0949 0.0947 0.0944 0.0938 0.0929 0.0916 0.0879 0.0795 0.0611 0.0431 0.0288 0.0188 0.0121 0.005 0.00062 9.8e-05 4.9e-06 4.7e-07 1.4e-08 1.8e-10 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0956 0.0956 0.0954 0.095 0.0944 0.0934 0.0921 0.0883 0.0797 0.061 0.0429 0.0286 0.0185 0.0119 0.0049 0.0006 9.3e-05 4.5e-06 4.2e-07 1.2e-08 1.3e-10 0.631 0.629 0.62 0.607 0.589 0.539 0.478 0.41 0.341 0.276 0.217 0.126 0.0711 0.0432 0.032 0.029 0.0287 0.0272 0.0188 0.00602 0.00196 0.00144 0.00141 0.00123 0.00065 6.6e-05 3.6e-05 2.3e-05 9.4e-06 1.7e-06 1.4e-07 0.433 0.433 0.433 0.433 0.432 0.428 0.418 0.4 0.375 0.343 0.307 0.228 0.157 0.101 0.0613 0.0364 0.0218 0.0103 0.00826 0.00686 0.00378 0.00168 0.000714 0.000369 0.00027 0.00018 7.5e-05 1.1e-05 2.1e-06 1.5e-07 5.4e-09 0.443 0.443 0.443 0.442 0.441 0.437 0.425 0.406 0.379 0.345 0.306 0.225 0.152 0.0958 0.0575 0.0337 0.0201 0.00993 0.00838 0.00673 0.00357 0.00154 0.00065 0.000351 0.00027 0.00018 6.9e-05 9.5e-06 1.7e-06 1.1e-07 2.8e-09 2.56 2.4 2.0 1.48 0.977 0.324 0.0972 0.0556 0.0537 0.05 0.0414 0.0224 0.0104 0.00461 0.0023 0.00154 0.00137 0.00134 0.000988 0.000323 9.67e-05 6.56e-05 6.43e-05 5.63e-05 3e-05 3e-06 1.6e-06 1e-06 4.3e-07 7.6e-08 6.2e-09 +Z 38 13 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 2.0 16067.000000000002 2200.1 2012.1000000000001 1942.3999999999999 350.32 280.32000000000005 269.53 144.93 143.01 46.39 28.47 27.2 5.1000000000000005 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.022 0.022 0.022 0.0219 0.0219 0.0218 0.0217 0.0214 0.021 0.0205 0.02 0.0194 0.018 0.014 0.011 0.0053 0.0025 0.00059 6.3e-05 0.0809 0.0809 0.0809 0.0809 0.0808 0.0807 0.0806 0.0804 0.0801 0.0799 0.0795 0.0788 0.0779 0.0768 0.0756 0.0742 0.0728 0.0695 0.0638 0.0533 0.0426 0.0326 0.024 0.0171 0.0081 0.0021 0.0019 0.0011 0.00049 9.4e-05 8.1e-06 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0406 0.0405 0.0404 0.0402 0.0394 0.0379 0.0359 0.0333 0.0303 0.024 0.011 0.0042 0.00068 0.00014 1.1e-05 4.2e-07 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0416 0.0415 0.0415 0.0414 0.0411 0.0402 0.0387 0.0365 0.0337 0.0305 0.024 0.01 0.0039 0.00059 0.00011 8e-06 2.2e-07 0.204 0.204 0.204 0.204 0.203 0.201 0.198 0.195 0.191 0.186 0.181 0.169 0.155 0.141 0.126 0.111 0.0972 0.0714 0.0421 0.0179 0.0121 0.0117 0.0111 0.00941 0.0051 0.00059 0.00031 0.00021 9e-05 1.7e-05 1.4e-06 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.122 0.121 0.119 0.116 0.113 0.109 0.0991 0.0806 0.0489 0.0253 0.012 0.00592 0.00373 0.0031 0.0022 0.00091 0.00014 2.7e-05 2.1e-06 7.5e-08 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.124 0.123 0.121 0.118 0.115 0.11 0.0996 0.0802 0.0476 0.0241 0.0112 0.00559 0.00368 0.0032 0.0021 0.00085 0.00012 2.2e-05 1.5e-06 4e-08 0.0901 0.0901 0.0901 0.0901 0.0901 0.0901 0.0901 0.0901 0.0901 0.0901 0.0901 0.09 0.0899 0.0896 0.0892 0.0886 0.0876 0.0848 0.078 0.0621 0.0452 0.0312 0.0208 0.0136 0.0058 0.00076 0.00012 6.4e-06 6.3e-07 1.9e-08 2.5e-10 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0906 0.0905 0.0902 0.0898 0.0891 0.0882 0.0852 0.0783 0.062 0.045 0.0309 0.0205 0.0134 0.0057 0.00073 0.00012 5.9e-06 5.5e-07 1.6e-08 1.7e-10 0.573 0.571 0.564 0.554 0.54 0.502 0.454 0.399 0.341 0.285 0.232 0.145 0.0862 0.0525 0.0365 0.0307 0.0295 0.0289 0.022 0.00801 0.00252 0.00159 0.00155 0.00141 0.00081 8.8e-05 4e-05 2.7e-05 1.2e-05 2.1e-06 1.8e-07 0.389 0.389 0.389 0.389 0.388 0.386 0.379 0.368 0.352 0.33 0.303 0.241 0.178 0.123 0.0803 0.0505 0.0312 0.0136 0.00902 0.00808 0.0049 0.00233 0.00101 0.000494 0.0003 0.00023 9.7e-05 1.5e-05 2.9e-06 2.2e-07 7.8e-09 0.397 0.397 0.397 0.397 0.396 0.393 0.387 0.374 0.356 0.333 0.304 0.239 0.174 0.118 0.0761 0.0472 0.029 0.0129 0.00915 0.00801 0.00467 0.00215 0.000922 0.000461 0.00031 0.00022 9e-05 1.3e-05 2.3e-06 1.6e-07 4.1e-09 2.06 1.97 1.74 1.41 1.06 0.486 0.187 0.0821 0.0604 0.0591 0.0568 0.041 0.0233 0.0117 0.00565 0.00312 0.00229 0.00211 0.00175 0.000666 0.000195 0.000109 0.000105 9.64e-05 5.6e-05 6e-06 2.7e-06 1.8e-06 7.8e-07 1.4e-07 1.2e-08 +Z 39 14 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 1.0 2.0 17000.0 2354.9 2159.7000000000003 2081.5 385.79 312.26000000000005 299.92 168.73999999999998 166.51 53.35 33.71 32.14 5.24 5.13 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0214 0.0214 0.0214 0.0214 0.0213 0.0213 0.0212 0.0211 0.0208 0.0204 0.02 0.0195 0.019 0.018 0.014 0.011 0.0054 0.0026 0.00065 7e-05 0.0785 0.0785 0.0785 0.0785 0.0784 0.0783 0.0782 0.078 0.0778 0.0775 0.0773 0.0766 0.0757 0.0747 0.0736 0.0724 0.071 0.068 0.0628 0.053 0.0428 0.0332 0.0249 0.018 0.0088 0.0021 0.0018 0.0012 0.00053 0.00011 9.2e-06 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0393 0.0393 0.0393 0.0392 0.039 0.0383 0.037 0.0352 0.0329 0.0301 0.024 0.011 0.0046 0.00077 0.00016 1.3e-05 5.1e-07 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0403 0.0403 0.0402 0.04 0.0392 0.0378 0.0358 0.0333 0.0304 0.024 0.011 0.0043 0.00067 0.00013 9.5e-06 2.7e-07 0.196 0.196 0.196 0.196 0.195 0.193 0.191 0.188 0.184 0.18 0.175 0.165 0.152 0.139 0.126 0.112 0.0984 0.0738 0.0448 0.0192 0.0122 0.0115 0.0112 0.00974 0.0056 0.00069 0.00031 0.00022 9.9e-05 1.9e-05 1.6e-06 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.117 0.116 0.115 0.113 0.11 0.106 0.0976 0.0811 0.0514 0.0279 0.0137 0.00678 0.00403 0.0031 0.0023 0.001 0.00016 3.3e-05 2.6e-06 9.3e-08 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.119 0.118 0.117 0.114 0.111 0.108 0.0984 0.0809 0.0502 0.0266 0.0128 0.00634 0.00392 0.0032 0.0022 0.00095 0.00014 2.7e-05 1.8e-06 4.9e-08 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0855 0.0853 0.085 0.0845 0.0839 0.0817 0.0762 0.0625 0.047 0.0333 0.0227 0.0152 0.0067 0.00092 0.00016 8.3e-06 8.2e-07 2.6e-08 3.3e-10 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0862 0.0862 0.0862 0.0861 0.0859 0.0856 0.0851 0.0844 0.0822 0.0766 0.0626 0.0468 0.033 0.0224 0.015 0.0065 0.00089 0.00015 7.6e-06 7.3e-07 2.1e-08 2.2e-10 0.533 0.531 0.526 0.518 0.506 0.475 0.434 0.388 0.338 0.288 0.24 0.157 0.0979 0.0608 0.041 0.0324 0.0298 0.0293 0.0242 0.01 0.00319 0.00172 0.00164 0.00154 0.00096 0.00011 4.2e-05 3.1e-05 1.4e-05 2.6e-06 2.2e-07 0.361 0.361 0.361 0.361 0.361 0.359 0.354 0.346 0.333 0.316 0.295 0.244 0.188 0.137 0.0943 0.0623 0.0401 0.0173 0.00951 0.00877 0.00585 0.00298 0.00135 0.000636 0.00033 0.00026 0.00012 1.9e-05 3.7e-06 2.9e-07 1.1e-08 0.366 0.366 0.366 0.366 0.366 0.364 0.359 0.351 0.337 0.319 0.297 0.243 0.186 0.134 0.091 0.0594 0.0378 0.0164 0.00966 0.00886 0.00568 0.0028 0.00124 0.000591 0.00034 0.00026 0.00011 1.7e-05 3.1e-06 2.1e-07 5.6e-09 0.454 0.454 0.454 0.454 0.454 0.45 0.439 0.417 0.384 0.344 0.301 0.218 0.151 0.101 0.0666 0.0432 0.0277 0.0112 0.00326 0.0016 0.00154 0.00128 0.000945 0.000658 0.0003 4.2e-05 7.1e-06 3.8e-07 3.7e-08 1.2e-09 1.5e-11 1.9 1.83 1.64 1.37 1.07 0.544 0.231 0.0998 0.062 0.0566 0.0562 0.046 0.0295 0.0163 0.00836 0.00444 0.00284 0.00226 0.00205 0.00091 0.000276 0.000129 0.000119 0.000113 7.1e-05 8.3e-06 3.1e-06 2.2e-06 9.8e-07 1.9e-07 1.6e-08 +Z 40 14 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 2.0 2.0 17962.0 2514.6 2312.2 2224.7999999999997 422.06 344.93 330.88 193.09 190.49 59.96 38.63 36.739999999999995 6.67 6.5200000000000005 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0209 0.0208 0.0208 0.0208 0.0208 0.0207 0.0207 0.0205 0.0203 0.0199 0.0195 0.0191 0.0186 0.017 0.014 0.011 0.0056 0.0028 0.0007 7.8e-05 0.0762 0.0762 0.0762 0.0762 0.0761 0.0761 0.0759 0.0758 0.0756 0.0753 0.0751 0.0744 0.0737 0.0728 0.0717 0.0706 0.0693 0.0666 0.0617 0.0526 0.043 0.0338 0.0257 0.0189 0.0095 0.0022 0.0018 0.0012 0.00056 0.00012 1e-05 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0382 0.0381 0.0381 0.0379 0.0372 0.0361 0.0345 0.0324 0.0299 0.024 0.012 0.005 0.00087 0.00019 1.6e-05 6.1e-07 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0392 0.0391 0.0389 0.0382 0.037 0.0352 0.0329 0.0302 0.024 0.011 0.0046 0.00076 0.00015 1.1e-05 3.2e-07 0.189 0.189 0.189 0.188 0.188 0.186 0.184 0.181 0.178 0.174 0.17 0.16 0.149 0.137 0.125 0.112 0.0993 0.0758 0.0474 0.0207 0.0124 0.0113 0.0111 0.00998 0.0061 0.00081 0.00031 0.00023 0.00011 2.2e-05 1.9e-06 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.113 0.113 0.113 0.113 0.113 0.112 0.111 0.109 0.106 0.104 0.096 0.0813 0.0536 0.0304 0.0155 0.00775 0.00442 0.003 0.0024 0.0011 0.00019 3.9e-05 3.1e-06 1.2e-07 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.115 0.115 0.114 0.113 0.111 0.108 0.105 0.0969 0.0812 0.0524 0.029 0.0145 0.00721 0.00423 0.0031 0.0024 0.0011 0.00017 3.1e-05 2.2e-06 6e-08 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0815 0.0814 0.0812 0.0808 0.0803 0.0786 0.0743 0.0626 0.0484 0.0352 0.0246 0.0168 0.0076 0.0011 0.00019 1.1e-05 1.1e-06 3.4e-08 4.4e-10 0.0823 0.0823 0.0823 0.0823 0.0823 0.0823 0.0823 0.0823 0.0823 0.0823 0.0823 0.0822 0.0822 0.082 0.0818 0.0815 0.0809 0.0792 0.0747 0.0627 0.0482 0.0349 0.0243 0.0165 0.0074 0.0011 0.00018 9.7e-06 9.4e-07 2.8e-08 2.9e-10 0.501 0.5 0.496 0.488 0.479 0.452 0.417 0.377 0.333 0.288 0.245 0.167 0.108 0.0686 0.0458 0.0345 0.0302 0.0291 0.0258 0.0121 0.00401 0.0019 0.00169 0.00164 0.0011 0.00014 4.5e-05 3.4e-05 1.6e-05 3.1e-06 2.7e-07 0.339 0.339 0.339 0.339 0.338 0.337 0.333 0.327 0.317 0.304 0.287 0.244 0.195 0.147 0.106 0.0731 0.0488 0.0215 0.0102 0.00917 0.00669 0.00367 0.00173 0.000814 0.00036 0.00029 0.00014 2.3e-05 4.7e-06 3.8e-07 1.4e-08 0.342 0.342 0.342 0.342 0.342 0.341 0.337 0.331 0.321 0.306 0.289 0.244 0.194 0.145 0.103 0.0705 0.0466 0.0204 0.0103 0.00938 0.00659 0.00349 0.0016 0.000753 0.00037 0.00029 0.00013 2.1e-05 3.9e-06 2.7e-07 7.3e-09 0.393 0.393 0.393 0.393 0.393 0.392 0.387 0.375 0.357 0.332 0.303 0.238 0.178 0.128 0.0894 0.0613 0.0414 0.0183 0.00548 0.00197 0.00188 0.00166 0.00128 0.00092 0.00044 6.5e-05 1.1e-05 6.2e-07 6.1e-08 2e-09 2.6e-11 1.8 1.74 1.58 1.34 1.07 0.579 0.264 0.115 0.0645 0.0537 0.0531 0.0471 0.0331 0.0198 0.0108 0.00581 0.00345 0.00229 0.00217 0.00112 0.000363 0.000149 0.000124 0.000122 8.3e-05 1.1e-05 3.3e-06 2.5e-06 1.2e-06 2.3e-07 2e-08 +Z 41 14 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 1.0 18948.0 2676.2999999999997 2466.6000000000004 2369.1 455.97999999999996 375.22 359.28000000000003 214.82 211.81 63.449999999999996 40.58 38.36 5.9399999999999995 5.76 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0203 0.0202 0.0202 0.0201 0.02 0.0198 0.0195 0.0191 0.0187 0.0182 0.017 0.014 0.011 0.0058 0.0029 0.00076 8.7e-05 0.0741 0.074 0.074 0.074 0.074 0.0739 0.0738 0.0736 0.0735 0.0732 0.073 0.0724 0.0717 0.0709 0.0699 0.0689 0.0677 0.0651 0.0607 0.0521 0.0431 0.0343 0.0264 0.0197 0.01 0.0023 0.0017 0.0013 0.0006 0.00013 1.2e-05 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.037 0.037 0.037 0.0368 0.0363 0.0353 0.0338 0.0319 0.0296 0.024 0.012 0.0053 0.00098 0.00021 1.9e-05 7.4e-07 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.0381 0.038 0.0378 0.0372 0.0361 0.0345 0.0325 0.03 0.024 0.012 0.005 0.00085 0.00017 1.3e-05 3.8e-07 0.182 0.182 0.182 0.182 0.181 0.18 0.178 0.175 0.172 0.169 0.165 0.156 0.146 0.135 0.124 0.112 0.0999 0.0776 0.0497 0.0222 0.0127 0.0111 0.011 0.0101 0.0066 0.00095 0.00031 0.00024 0.00012 2.4e-05 2.1e-06 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.108 0.107 0.105 0.103 0.101 0.0942 0.0811 0.0554 0.0327 0.0174 0.00884 0.0049 0.003 0.0025 0.0012 0.00022 4.6e-05 3.8e-06 1.4e-07 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.111 0.111 0.111 0.111 0.11 0.109 0.107 0.105 0.102 0.0952 0.0812 0.0544 0.0313 0.0162 0.00818 0.00464 0.0031 0.0025 0.0012 0.00019 3.7e-05 2.7e-06 7.3e-08 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0779 0.0778 0.0776 0.0774 0.077 0.0757 0.0722 0.0623 0.0495 0.0369 0.0264 0.0184 0.0086 0.0013 0.00024 1.3e-05 1.4e-06 4.5e-08 5.7e-10 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0787 0.0786 0.0785 0.0784 0.0781 0.0777 0.0763 0.0727 0.0624 0.0493 0.0366 0.026 0.0181 0.0084 0.0013 0.00022 1.2e-05 1.2e-06 3.6e-08 3.8e-10 0.48 0.479 0.475 0.469 0.46 0.436 0.405 0.368 0.328 0.287 0.247 0.173 0.115 0.0746 0.0497 0.0364 0.0305 0.0284 0.0263 0.0138 0.0049 0.0021 0.00171 0.00169 0.0012 0.00018 4.7e-05 3.6e-05 1.8e-05 3.6e-06 3.2e-07 0.324 0.324 0.324 0.324 0.324 0.323 0.32 0.315 0.306 0.294 0.279 0.241 0.198 0.153 0.114 0.0808 0.0557 0.0255 0.0108 0.00915 0.00724 0.00426 0.00212 0.00101 0.00038 0.0003 0.00016 2.8e-05 5.8e-06 4.7e-07 1.8e-08 0.326 0.326 0.326 0.326 0.325 0.324 0.322 0.316 0.308 0.296 0.281 0.243 0.198 0.153 0.112 0.0791 0.054 0.0244 0.0109 0.00952 0.00726 0.00412 0.00199 0.000936 0.00039 0.00031 0.00015 2.5e-05 4.8e-06 3.4e-07 9.4e-09 0.385 0.385 0.385 0.385 0.384 0.383 0.377 0.366 0.348 0.323 0.295 0.235 0.179 0.132 0.095 0.0674 0.0471 0.0223 0.00711 0.00205 0.00182 0.00169 0.00137 0.00102 0.0005 7.9e-05 1.4e-05 8e-07 8.1e-08 2.6e-09 3.5e-11 1.88 1.81 1.63 1.37 1.08 0.567 0.248 0.103 0.0555 0.0457 0.0452 0.0402 0.0286 0.0176 0.00993 0.00547 0.00321 0.00189 0.00179 0.00105 0.000373 0.000141 0.000105 0.000104 7.6e-05 1.1e-05 2.9e-06 2.2e-06 1.1e-06 2.2e-07 1.9e-08 +Z 42 15 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 1.0 1.0 19965.0 2846.5 2629.5 2521.0 494.09 409.64000000000004 391.63 240.45 237.0 69.63 45.07 42.459999999999994 7.0 6.7700000000000005 5.97 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0197 0.0197 0.0197 0.0197 0.0196 0.0195 0.0193 0.019 0.0186 0.0182 0.0178 0.017 0.014 0.011 0.0059 0.003 0.00082 9.7e-05 0.072 0.072 0.072 0.072 0.0719 0.0719 0.0717 0.0716 0.0714 0.0712 0.071 0.0705 0.0698 0.0691 0.0682 0.0672 0.0662 0.0638 0.0596 0.0516 0.0431 0.0347 0.0271 0.0205 0.011 0.0024 0.0017 0.0013 0.00064 0.00014 1.3e-05 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.036 0.0359 0.0358 0.0353 0.0344 0.0331 0.0314 0.0293 0.024 0.013 0.0057 0.0011 0.00025 2.2e-05 8.8e-07 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.0371 0.037 0.037 0.0368 0.0363 0.0353 0.0339 0.032 0.0297 0.024 0.012 0.0053 0.00095 0.0002 1.5e-05 4.5e-07 0.176 0.176 0.176 0.175 0.175 0.174 0.172 0.17 0.167 0.164 0.16 0.152 0.143 0.133 0.122 0.111 0.1 0.079 0.0519 0.0238 0.0131 0.0109 0.0108 0.0102 0.007 0.0011 0.00032 0.00025 0.00013 2.7e-05 2.5e-06 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.104 0.103 0.102 0.1 0.0981 0.0924 0.0807 0.0569 0.0349 0.0192 0.01 0.00548 0.003 0.0025 0.0013 0.00025 5.3e-05 4.5e-06 1.7e-07 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.107 0.107 0.107 0.106 0.105 0.104 0.102 0.0997 0.0935 0.081 0.056 0.0336 0.018 0.00926 0.00513 0.0031 0.0025 0.0013 0.00022 4.3e-05 3.2e-06 8.9e-08 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0747 0.0746 0.0746 0.0744 0.0743 0.074 0.073 0.0701 0.0617 0.0502 0.0384 0.028 0.0199 0.0096 0.0015 0.00029 1.7e-05 1.8e-06 5.8e-08 7.4e-10 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0753 0.0753 0.0752 0.0749 0.0746 0.0736 0.0706 0.0619 0.0501 0.0381 0.0277 0.0196 0.0094 0.0015 0.00027 1.5e-05 1.5e-06 4.6e-08 4.9e-10 0.456 0.455 0.452 0.446 0.439 0.418 0.39 0.358 0.322 0.285 0.248 0.179 0.123 0.0817 0.0548 0.0393 0.0316 0.0279 0.0268 0.0156 0.00597 0.00241 0.00176 0.00173 0.0013 0.00022 5e-05 3.9e-05 2e-05 4.2e-06 3.8e-07 0.306 0.306 0.306 0.306 0.306 0.305 0.303 0.298 0.292 0.283 0.27 0.239 0.2 0.16 0.123 0.0902 0.0643 0.0308 0.0122 0.00926 0.00787 0.00498 0.00261 0.00127 0.00043 0.00033 0.00018 3.4e-05 7.1e-06 6e-07 2.3e-08 0.309 0.309 0.309 0.309 0.309 0.308 0.306 0.302 0.295 0.285 0.273 0.24 0.2 0.159 0.121 0.0878 0.0618 0.0292 0.012 0.00959 0.00789 0.0048 0.00244 0.00117 0.00043 0.00034 0.00017 3e-05 5.9e-06 4.3e-07 1.2e-08 0.347 0.347 0.347 0.347 0.347 0.346 0.343 0.336 0.325 0.308 0.287 0.24 0.191 0.147 0.111 0.0815 0.0592 0.03 0.0103 0.00256 0.002 0.00193 0.00163 0.00125 0.00065 0.00011 2e-05 1.2e-06 1.2e-07 4e-09 5.2e-11 0.357 0.357 0.357 0.357 0.357 0.356 0.352 0.344 0.33 0.311 0.288 0.237 0.187 0.143 0.106 0.078 0.0563 0.0283 0.00963 0.00245 0.00197 0.00189 0.00159 0.00121 0.00062 0.0001 1.9e-05 1e-06 1e-07 3.1e-09 3.4e-11 1.82 1.76 1.6 1.36 1.09 0.59 0.269 0.114 0.0576 0.0435 0.042 0.039 0.0295 0.0192 0.0114 0.00651 0.00379 0.00193 0.00174 0.00115 0.000451 0.000164 0.000107 0.000104 8.2e-05 1.3e-05 3e-06 2.3e-06 1.2e-06 2.5e-07 2.3e-08 +Z 43 15 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 2.0 1.0 21012.0 3022.4 2797.9 2677.6 533.4200000000001 445.24 424.95 267.01 263.07 75.85 49.6 46.55 8.07 7.78 6.19 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0193 0.0192 0.0192 0.0192 0.0192 0.0191 0.019 0.0188 0.0185 0.0182 0.0179 0.0174 0.016 0.014 0.011 0.006 0.0032 0.00088 0.00011 0.07 0.07 0.07 0.07 0.07 0.0699 0.0698 0.0697 0.0695 0.0693 0.0691 0.0686 0.068 0.0673 0.0665 0.0656 0.0647 0.0624 0.0586 0.0511 0.043 0.035 0.0276 0.0212 0.012 0.0025 0.0017 0.0013 0.00068 0.00016 1.5e-05 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.0349 0.0348 0.0344 0.0336 0.0325 0.0309 0.029 0.024 0.013 0.0061 0.0012 0.00028 2.6e-05 1e-06 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.0361 0.036 0.0359 0.0354 0.0345 0.0333 0.0315 0.0294 0.025 0.013 0.0057 0.0011 0.00022 1.8e-05 5.3e-07 0.17 0.17 0.17 0.169 0.169 0.168 0.166 0.164 0.162 0.159 0.156 0.149 0.14 0.131 0.121 0.111 0.1 0.0802 0.054 0.0255 0.0137 0.0108 0.0106 0.0102 0.0074 0.0013 0.00033 0.00026 0.00014 3e-05 2.8e-06 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.101 0.101 0.101 0.0999 0.0988 0.0973 0.0954 0.0904 0.08 0.0582 0.037 0.0211 0.0113 0.00616 0.0031 0.0026 0.0014 0.00028 6.2e-05 5.4e-06 2.1e-07 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.102 0.101 0.0992 0.0971 0.0917 0.0805 0.0574 0.0356 0.0198 0.0104 0.00571 0.0031 0.0026 0.0014 0.00025 5e-05 3.8e-06 1.1e-07 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0717 0.0716 0.0715 0.0714 0.0711 0.0704 0.0681 0.0609 0.0507 0.0396 0.0295 0.0214 0.011 0.0018 0.00034 2.1e-05 2.2e-06 7.4e-08 9.6e-10 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0723 0.0722 0.0721 0.0718 0.071 0.0686 0.0612 0.0506 0.0393 0.0292 0.021 0.01 0.0017 0.00032 1.9e-05 1.9e-06 5.9e-08 6.3e-10 0.43 0.429 0.426 0.422 0.415 0.397 0.374 0.346 0.315 0.282 0.249 0.185 0.131 0.0896 0.0611 0.0433 0.0337 0.0279 0.0271 0.0175 0.00726 0.00284 0.00185 0.00178 0.0015 0.00027 5.5e-05 4.2e-05 2.2e-05 4.9e-06 4.5e-07 0.287 0.287 0.287 0.287 0.287 0.286 0.285 0.282 0.277 0.269 0.26 0.234 0.202 0.166 0.131 0.0999 0.0735 0.0371 0.0143 0.00939 0.00847 0.00574 0.00319 0.0016 0.0005 0.00035 0.0002 4.1e-05 8.8e-06 7.6e-07 2.9e-08 0.291 0.291 0.291 0.291 0.291 0.29 0.289 0.285 0.28 0.273 0.263 0.236 0.202 0.165 0.129 0.0971 0.0707 0.0351 0.0137 0.00972 0.00852 0.00556 0.00298 0.00146 0.00048 0.00036 0.0002 3.6e-05 7.2e-06 5.4e-07 1.5e-08 0.299 0.299 0.299 0.299 0.299 0.298 0.297 0.295 0.29 0.282 0.271 0.241 0.204 0.167 0.132 0.102 0.0773 0.0422 0.0157 0.00361 0.00235 0.0023 0.00204 0.00163 0.00088 0.00016 3e-05 1.8e-06 1.9e-07 6.3e-09 8.3e-11 0.305 0.305 0.305 0.305 0.305 0.304 0.303 0.3 0.295 0.286 0.273 0.241 0.203 0.164 0.129 0.0992 0.0747 0.0404 0.0149 0.00346 0.00234 0.00229 0.00201 0.00159 0.00086 0.00015 2.8e-05 1.6e-06 1.6e-07 5e-09 5.5e-11 1.62 1.58 1.46 1.28 1.06 0.643 0.334 0.158 0.0784 0.0505 0.0441 0.0429 0.0363 0.026 0.0167 0.01 0.0059 0.00258 0.00205 0.00153 0.000659 0.000239 0.000135 0.000126 0.00011 2e-05 3.9e-06 3e-06 1.6e-06 3.4e-07 3.2e-08 +Z 44 15 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 3.0 1.0 22087.0 3203.9 2971.8 2838.7 574.03 482.06 459.29 294.53 290.04999999999995 82.14 54.19 50.66 9.15 8.790000000000001 6.38 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0188 0.0187 0.0187 0.0187 0.0187 0.0186 0.0184 0.0181 0.0178 0.0175 0.0171 0.016 0.014 0.011 0.0062 0.0033 0.00094 0.00012 0.0682 0.0682 0.0682 0.0681 0.0681 0.0681 0.068 0.0678 0.0677 0.0675 0.0673 0.0669 0.0663 0.0657 0.0649 0.0641 0.0632 0.0611 0.0575 0.0506 0.0429 0.0353 0.0282 0.0219 0.012 0.0027 0.0016 0.0013 0.00072 0.00017 1.7e-05 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.034 0.034 0.034 0.034 0.0339 0.0335 0.0328 0.0318 0.0304 0.0286 0.024 0.014 0.0065 0.0013 0.00032 3e-05 1.2e-06 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0351 0.0351 0.035 0.0346 0.0338 0.0326 0.0311 0.0291 0.025 0.013 0.006 0.0012 0.00025 2.1e-05 6.2e-07 0.164 0.164 0.164 0.164 0.163 0.162 0.161 0.159 0.157 0.154 0.152 0.145 0.137 0.129 0.119 0.11 0.1 0.0811 0.0558 0.0271 0.0143 0.0108 0.0104 0.0102 0.0077 0.0015 0.00034 0.00026 0.00015 3.3e-05 3.2e-06 0.0982 0.0982 0.0982 0.0982 0.0982 0.0982 0.0982 0.0981 0.0981 0.0981 0.098 0.0978 0.0973 0.0967 0.0957 0.0945 0.0929 0.0885 0.0792 0.0592 0.0389 0.0229 0.0126 0.00691 0.0032 0.0026 0.0015 0.00032 7.2e-05 6.4e-06 2.5e-07 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.1 0.1 0.1 0.1 0.1 0.0996 0.0988 0.0978 0.0964 0.0946 0.0898 0.0798 0.0585 0.0375 0.0216 0.0116 0.00636 0.0032 0.0027 0.0015 0.00028 5.8e-05 4.5e-06 1.3e-07 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.0689 0.0689 0.0687 0.0686 0.0679 0.0661 0.06 0.0509 0.0406 0.0309 0.0227 0.012 0.0021 0.00041 2.6e-05 2.8e-06 9.4e-08 1.2e-09 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0696 0.0696 0.0696 0.0695 0.0694 0.0692 0.0685 0.0666 0.0603 0.0509 0.0404 0.0306 0.0224 0.011 0.002 0.00039 2.3e-05 2.4e-06 7.5e-08 8.1e-10 0.416 0.415 0.412 0.408 0.402 0.386 0.365 0.339 0.31 0.279 0.248 0.188 0.135 0.0944 0.065 0.046 0.035 0.0274 0.0266 0.0187 0.00839 0.00329 0.00192 0.00177 0.0015 0.00032 6e-05 4.4e-05 2.4e-05 5.5e-06 5.2e-07 0.276 0.276 0.276 0.276 0.276 0.275 0.274 0.271 0.267 0.261 0.252 0.23 0.201 0.168 0.136 0.106 0.0796 0.042 0.0162 0.00923 0.00868 0.00629 0.00369 0.00193 0.00057 0.00036 0.00022 4.7e-05 1.1e-05 9.3e-07 3.6e-08 0.281 0.281 0.281 0.281 0.281 0.281 0.279 0.276 0.272 0.265 0.256 0.232 0.201 0.167 0.133 0.102 0.0761 0.0393 0.0152 0.00949 0.00872 0.00607 0.00343 0.00174 0.00054 0.00037 0.00021 4.2e-05 8.5e-06 6.5e-07 1.9e-08 0.296 0.296 0.296 0.296 0.296 0.296 0.294 0.292 0.286 0.277 0.266 0.236 0.2 0.165 0.132 0.104 0.0798 0.0455 0.0181 0.00415 0.00227 0.00221 0.00203 0.00168 0.00096 0.00018 3.6e-05 2.2e-06 2.4e-07 8e-09 1.1e-10 0.303 0.303 0.303 0.303 0.303 0.302 0.301 0.298 0.291 0.281 0.269 0.236 0.199 0.162 0.129 0.101 0.077 0.0434 0.0171 0.00393 0.00224 0.00219 0.002 0.00164 0.00092 0.00017 3.3e-05 2e-06 2e-07 6.3e-09 6.9e-11 1.74 1.69 1.54 1.33 1.09 0.624 0.304 0.135 0.0639 0.0411 0.0365 0.0355 0.0296 0.0212 0.0138 0.00841 0.00504 0.00215 0.00157 0.00127 0.0006 0.000225 0.000114 9.95e-05 8.9e-05 1.9e-05 3.4e-06 2.4e-06 1.4e-06 3.1e-07 2.9e-08 +Z 45 15 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 4.0 1.0 23191.0 3391.2 3151.5 3004.5 615.9499999999999 520.1500000000001 494.65999999999997 323.03 317.96 88.52 58.839999999999996 54.78 10.24 9.809999999999999 6.56 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0182 0.0181 0.0179 0.0177 0.0174 0.0171 0.0167 0.016 0.013 0.011 0.0063 0.0034 0.001 0.00013 0.0664 0.0664 0.0664 0.0664 0.0663 0.0663 0.0662 0.0661 0.066 0.0658 0.0656 0.0652 0.0647 0.0641 0.0634 0.0626 0.0618 0.0599 0.0565 0.05 0.0428 0.0355 0.0286 0.0225 0.013 0.0029 0.0016 0.0014 0.00075 0.00018 1.9e-05 0.0332 0.0332 0.0332 0.0332 0.0332 0.0332 0.0332 0.0332 0.0332 0.0332 0.0332 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.033 0.0327 0.0321 0.0311 0.0299 0.0283 0.024 0.014 0.0068 0.0015 0.00036 3.5e-05 1.5e-06 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0342 0.0341 0.0337 0.0331 0.032 0.0306 0.0288 0.025 0.014 0.0064 0.0013 0.00029 2.4e-05 7.3e-07 0.159 0.159 0.159 0.159 0.158 0.157 0.156 0.154 0.152 0.15 0.147 0.141 0.134 0.126 0.118 0.109 0.0998 0.0818 0.0574 0.0288 0.0151 0.0108 0.0102 0.0101 0.008 0.0017 0.00036 0.00027 0.00015 3.7e-05 3.6e-06 0.0949 0.0949 0.0949 0.0949 0.0949 0.0949 0.0949 0.0949 0.0949 0.0949 0.0948 0.0946 0.0942 0.0937 0.0929 0.0918 0.0904 0.0865 0.0783 0.0599 0.0405 0.0247 0.014 0.00775 0.0033 0.0027 0.0016 0.00036 8.3e-05 7.5e-06 3e-07 0.0973 0.0973 0.0973 0.0973 0.0973 0.0973 0.0973 0.0973 0.0972 0.0972 0.0971 0.0969 0.0965 0.0959 0.095 0.0938 0.0922 0.088 0.079 0.0593 0.0392 0.0233 0.0129 0.0071 0.0033 0.0027 0.0016 0.00031 6.7e-05 5.2e-06 1.5e-07 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0664 0.0664 0.0664 0.0663 0.0661 0.0656 0.0641 0.059 0.0509 0.0414 0.0321 0.024 0.013 0.0024 0.00048 3.1e-05 3.4e-06 1.2e-07 1.6e-09 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.0671 0.067 0.0669 0.0668 0.0662 0.0646 0.0593 0.0509 0.0412 0.0318 0.0237 0.012 0.0023 0.00045 2.8e-05 3e-06 9.5e-08 1e-09 0.399 0.398 0.396 0.392 0.387 0.372 0.353 0.33 0.304 0.276 0.247 0.191 0.14 0.1 0.07 0.0497 0.0372 0.0274 0.0262 0.0199 0.00965 0.00388 0.00205 0.00178 0.0016 0.00038 6.8e-05 4.5e-05 2.6e-05 6.3e-06 6.1e-07 0.263 0.263 0.263 0.263 0.263 0.263 0.262 0.259 0.256 0.251 0.244 0.225 0.2 0.17 0.14 0.112 0.0862 0.0476 0.0187 0.00924 0.00887 0.00684 0.00425 0.00232 0.00067 0.00038 0.00024 5.5e-05 1.3e-05 1.1e-06 4.5e-08 0.27 0.27 0.27 0.27 0.269 0.269 0.268 0.265 0.262 0.256 0.248 0.228 0.2 0.169 0.138 0.108 0.0824 0.0444 0.0173 0.00943 0.00895 0.00662 0.00395 0.00209 0.00061 0.00039 0.00024 4.8e-05 1e-05 7.8e-07 2.3e-08 0.277 0.277 0.277 0.277 0.277 0.277 0.276 0.274 0.27 0.264 0.255 0.231 0.201 0.169 0.139 0.112 0.0882 0.0527 0.0225 0.00529 0.00244 0.00228 0.00217 0.00186 0.0011 0.00022 4.6e-05 2.9e-06 3.2e-07 1.1e-08 1.4e-10 0.283 0.283 0.283 0.283 0.283 0.283 0.282 0.279 0.275 0.268 0.258 0.232 0.2 0.167 0.137 0.109 0.0856 0.0506 0.0213 0.005 0.0024 0.00227 0.00215 0.00183 0.0011 0.00021 4.3e-05 2.6e-06 2.7e-07 8.6e-09 9.4e-11 1.7 1.65 1.52 1.32 1.09 0.638 0.319 0.145 0.0677 0.0409 0.0345 0.0335 0.029 0.0216 0.0146 0.00923 0.00566 0.00233 0.00149 0.00128 0.000667 0.000261 0.000122 9.7e-05 9e-05 2.1e-05 3.7e-06 2.5e-06 1.4e-06 3.4e-07 3.3e-08 +Z 46 14 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 24321.0 3580.0 3332.6 3170.6 654.94 555.25 526.8 348.24 342.51000000000005 91.00999999999999 59.68 55.09 8.14 7.669999999999999 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0178 0.0178 0.0178 0.0177 0.0175 0.0173 0.017 0.0167 0.0164 0.016 0.013 0.011 0.0064 0.0035 0.0011 0.00014 0.0647 0.0647 0.0647 0.0647 0.0646 0.0646 0.0645 0.0644 0.0643 0.0642 0.064 0.0636 0.0631 0.0626 0.0619 0.0612 0.0604 0.0587 0.0555 0.0494 0.0426 0.0357 0.0291 0.0231 0.014 0.0031 0.0016 0.0014 0.00079 0.0002 2.1e-05 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0322 0.0321 0.0318 0.0313 0.0305 0.0293 0.0279 0.024 0.014 0.0072 0.0016 0.0004 4e-05 1.7e-06 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0335 0.0334 0.0334 0.0334 0.0334 0.0334 0.0333 0.033 0.0323 0.0314 0.0301 0.0285 0.024 0.014 0.0067 0.0014 0.00032 2.7e-05 8.5e-07 0.154 0.154 0.154 0.154 0.153 0.153 0.151 0.15 0.148 0.146 0.144 0.138 0.131 0.124 0.116 0.108 0.0993 0.0823 0.0589 0.0304 0.0159 0.0109 0.01 0.00996 0.0083 0.002 0.00039 0.00027 0.00016 4.1e-05 4.1e-06 0.0919 0.0919 0.0919 0.0919 0.0919 0.0919 0.0919 0.0919 0.0919 0.0918 0.0918 0.0916 0.0913 0.0908 0.0901 0.0892 0.0879 0.0846 0.0772 0.0604 0.042 0.0264 0.0154 0.00866 0.0035 0.0027 0.0017 0.0004 9.5e-05 8.9e-06 3.6e-07 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0942 0.0942 0.0941 0.0939 0.0936 0.0931 0.0923 0.0912 0.0898 0.0861 0.078 0.0599 0.0408 0.025 0.0142 0.0079 0.0034 0.0027 0.0016 0.00035 7.6e-05 6.1e-06 1.8e-07 0.0642 0.0642 0.0642 0.0642 0.0642 0.0642 0.0642 0.0642 0.0642 0.0642 0.0642 0.0641 0.0641 0.0641 0.0641 0.064 0.0639 0.0635 0.0623 0.0579 0.0507 0.042 0.0331 0.0252 0.014 0.0027 0.00056 3.8e-05 4.2e-06 1.5e-07 2e-09 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0647 0.0646 0.0646 0.0644 0.064 0.0627 0.0582 0.0508 0.0419 0.0329 0.025 0.013 0.0026 0.00053 3.4e-05 3.7e-06 1.2e-07 1.3e-09 0.386 0.385 0.383 0.38 0.375 0.362 0.344 0.323 0.299 0.272 0.246 0.192 0.144 0.104 0.0739 0.0527 0.0392 0.0275 0.0255 0.0207 0.0108 0.00451 0.00223 0.00179 0.0017 0.00044 7.7e-05 4.7e-05 2.8e-05 7e-06 6.9e-07 0.254 0.254 0.254 0.254 0.254 0.253 0.252 0.251 0.248 0.243 0.237 0.22 0.198 0.171 0.143 0.116 0.0911 0.0524 0.0212 0.00924 0.00886 0.00724 0.00475 0.00271 0.00079 0.00038 0.00026 6.3e-05 1.5e-05 1.4e-06 5.5e-08 0.261 0.261 0.261 0.261 0.261 0.261 0.26 0.258 0.254 0.249 0.242 0.224 0.199 0.17 0.14 0.112 0.0869 0.0486 0.0193 0.0093 0.00895 0.00701 0.00441 0.00243 0.0007 0.00039 0.00025 5.5e-05 1.2e-05 9.3e-07 2.7e-08 0.278 0.278 0.278 0.278 0.278 0.277 0.276 0.274 0.269 0.261 0.251 0.225 0.196 0.165 0.137 0.111 0.0888 0.0548 0.0247 0.00611 0.00248 0.00216 0.00211 0.00187 0.0012 0.00025 5.3e-05 3.5e-06 3.9e-07 1.4e-08 1.8e-10 0.285 0.285 0.285 0.285 0.285 0.284 0.283 0.28 0.274 0.265 0.254 0.226 0.195 0.163 0.134 0.108 0.0861 0.0526 0.0234 0.00572 0.00239 0.00212 0.00206 0.00181 0.0011 0.00023 4.9e-05 3.1e-06 3.3e-07 1.1e-08 1.2e-10 +Z 47 15 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 1.0 25489.0 3783.4 3528.1000000000004 3350.0 703.8 600.19 568.5300000000001 382.99 376.55 101.61 68.41000000000001 63.13999999999999 12.469999999999999 11.86 6.89 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0175 0.0174 0.0174 0.0174 0.0174 0.0174 0.0173 0.0171 0.0169 0.0167 0.0164 0.0161 0.015 0.013 0.011 0.0065 0.0037 0.0011 0.00015 0.0631 0.0631 0.0631 0.0631 0.063 0.063 0.0629 0.0628 0.0627 0.0626 0.0624 0.0621 0.0616 0.0611 0.0605 0.0598 0.0591 0.0575 0.0545 0.0488 0.0424 0.0358 0.0294 0.0236 0.014 0.0033 0.0016 0.0014 0.00082 0.00022 2.3e-05 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0315 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0313 0.0311 0.0306 0.0298 0.0288 0.0275 0.024 0.015 0.0076 0.0018 0.00045 4.6e-05 2e-06 0.0327 0.0327 0.0327 0.0327 0.0327 0.0327 0.0327 0.0327 0.0327 0.0327 0.0327 0.0326 0.0326 0.0326 0.0326 0.0326 0.0326 0.0326 0.0325 0.0322 0.0317 0.0308 0.0296 0.0281 0.024 0.014 0.0071 0.0015 0.00036 3.1e-05 9.9e-07 0.149 0.149 0.149 0.149 0.149 0.148 0.147 0.146 0.144 0.142 0.14 0.135 0.129 0.122 0.114 0.107 0.0987 0.0827 0.0602 0.0319 0.0168 0.0111 0.00986 0.0098 0.0085 0.0022 0.00043 0.00027 0.00017 4.5e-05 4.6e-06 0.0891 0.0891 0.0891 0.0891 0.0891 0.089 0.089 0.089 0.089 0.089 0.0889 0.0888 0.0885 0.0881 0.0875 0.0867 0.0856 0.0827 0.0761 0.0607 0.0434 0.028 0.0168 0.00963 0.0037 0.0027 0.0018 0.00044 0.00011 1e-05 4.3e-07 0.0915 0.0915 0.0915 0.0915 0.0915 0.0915 0.0914 0.0914 0.0914 0.0914 0.0913 0.0912 0.0909 0.0904 0.0897 0.0888 0.0876 0.0843 0.077 0.0604 0.0422 0.0266 0.0155 0.00876 0.0036 0.0028 0.0017 0.00039 8.7e-05 7.1e-06 2.1e-07 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.062 0.0619 0.0619 0.0618 0.0615 0.0604 0.0567 0.0504 0.0424 0.034 0.0263 0.015 0.003 0.00066 4.5e-05 5.2e-06 1.8e-07 2.5e-09 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0624 0.0623 0.062 0.0609 0.0571 0.0505 0.0423 0.0338 0.0261 0.014 0.0029 0.00062 4.1e-05 4.5e-06 1.5e-07 1.6e-09 0.369 0.368 0.366 0.363 0.359 0.347 0.332 0.313 0.291 0.268 0.243 0.194 0.148 0.11 0.0793 0.0571 0.0423 0.0282 0.0251 0.0215 0.0121 0.0053 0.0025 0.00183 0.0017 0.00052 8.9e-05 4.8e-05 3.1e-05 7.9e-06 8e-07 0.242 0.242 0.242 0.242 0.242 0.241 0.241 0.239 0.237 0.233 0.228 0.214 0.195 0.172 0.146 0.121 0.0972 0.0583 0.0245 0.00954 0.00892 0.00768 0.00531 0.00317 0.00095 0.00039 0.00028 7.2e-05 1.7e-05 1.6e-06 6.8e-08 0.249 0.249 0.249 0.249 0.249 0.249 0.248 0.246 0.243 0.239 0.234 0.218 0.197 0.171 0.144 0.118 0.0932 0.0544 0.0223 0.0095 0.00907 0.0075 0.00497 0.00285 0.00083 0.00041 0.00028 6.3e-05 1.4e-05 1.1e-06 3.4e-08 0.247 0.247 0.247 0.247 0.247 0.247 0.246 0.245 0.243 0.239 0.234 0.218 0.197 0.172 0.147 0.123 0.101 0.0657 0.0315 0.00828 0.00301 0.00237 0.00234 0.00214 0.0014 0.00032 7.1e-05 4.9e-06 5.4e-07 1.9e-08 2.6e-10 0.251 0.251 0.251 0.251 0.251 0.251 0.251 0.25 0.247 0.243 0.237 0.22 0.197 0.172 0.146 0.121 0.0993 0.0637 0.0301 0.0078 0.0029 0.00234 0.00231 0.0021 0.0014 0.0003 6.5e-05 4.3e-06 4.7e-07 1.5e-08 1.7e-10 1.64 1.6 1.48 1.3 1.08 0.66 0.346 0.164 0.0763 0.042 0.0316 0.0296 0.0272 0.0218 0.0157 0.0106 0.00682 0.00281 0.00137 0.00124 0.000771 0.00034 0.000146 9.47e-05 8.8e-05 2.7e-05 4.6e-06 2.4e-06 1.5e-06 4e-07 4e-08 +Z 48 15 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 26688.0 3994.1000000000004 3730.9 3535.4 755.37 647.79 612.63 420.06 412.85999999999996 113.36 78.22000000000001 72.19 17.71 16.97 8.219999999999999 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.017 0.017 0.017 0.017 0.017 0.017 0.0169 0.0167 0.0165 0.0163 0.0161 0.0158 0.015 0.013 0.011 0.0066 0.0038 0.0012 0.00017 0.0615 0.0615 0.0615 0.0615 0.0615 0.0614 0.0614 0.0613 0.0612 0.0611 0.0609 0.0606 0.0602 0.0597 0.0591 0.0585 0.0578 0.0563 0.0536 0.0482 0.0421 0.0358 0.0297 0.0241 0.015 0.0036 0.0016 0.0014 0.00085 0.00023 2.6e-05 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0306 0.0306 0.0306 0.0306 0.0305 0.0303 0.0299 0.0292 0.0283 0.0271 0.024 0.015 0.0079 0.0019 0.0005 5.3e-05 2.4e-06 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0319 0.0318 0.0317 0.0315 0.031 0.0302 0.0291 0.0277 0.024 0.015 0.0074 0.0017 0.0004 3.5e-05 1.1e-06 0.145 0.145 0.145 0.145 0.144 0.144 0.143 0.142 0.14 0.138 0.136 0.131 0.126 0.12 0.113 0.106 0.098 0.0829 0.0613 0.0334 0.0178 0.0113 0.00973 0.00962 0.0086 0.0025 0.00048 0.00027 0.00018 4.9e-05 5.1e-06 0.0864 0.0864 0.0864 0.0864 0.0864 0.0864 0.0864 0.0863 0.0863 0.0863 0.0863 0.0861 0.0859 0.0856 0.085 0.0843 0.0834 0.0808 0.0749 0.0608 0.0445 0.0296 0.0182 0.0107 0.004 0.0026 0.0019 0.00049 0.00012 1.2e-05 5.1e-07 0.0888 0.0888 0.0888 0.0888 0.0888 0.0888 0.0888 0.0888 0.0887 0.0887 0.0887 0.0885 0.0883 0.0879 0.0873 0.0864 0.0854 0.0825 0.076 0.0607 0.0434 0.0281 0.0168 0.00967 0.0038 0.0028 0.0018 0.00043 9.8e-05 8.2e-06 2.5e-07 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.0599 0.0599 0.0599 0.0599 0.0598 0.0595 0.0587 0.0555 0.05 0.0426 0.0348 0.0274 0.016 0.0034 0.00076 5.4e-05 6.3e-06 2.3e-07 3.1e-09 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0605 0.0604 0.0604 0.0601 0.0592 0.0559 0.0501 0.0426 0.0346 0.0271 0.015 0.0033 0.00071 4.9e-05 5.5e-06 1.8e-07 2e-09 0.352 0.351 0.35 0.347 0.343 0.333 0.32 0.303 0.284 0.263 0.24 0.195 0.152 0.115 0.0846 0.0617 0.0457 0.0294 0.0248 0.0223 0.0135 0.00619 0.00284 0.0019 0.0018 0.0006 0.00011 4.9e-05 3.3e-05 8.9e-06 9.3e-07 0.23 0.23 0.23 0.23 0.23 0.23 0.229 0.228 0.226 0.224 0.22 0.208 0.191 0.171 0.148 0.125 0.103 0.0641 0.0282 0.01 0.00894 0.00805 0.00587 0.00365 0.0011 0.0004 0.00031 8.3e-05 2e-05 2e-06 8.4e-08 0.237 0.237 0.237 0.237 0.237 0.237 0.236 0.235 0.233 0.23 0.225 0.212 0.194 0.171 0.147 0.122 0.0989 0.0601 0.0256 0.00986 0.00915 0.00794 0.00553 0.00331 0.00099 0.00042 0.0003 7.2e-05 1.6e-05 1.4e-06 4.1e-08 0.224 0.224 0.224 0.224 0.224 0.224 0.224 0.223 0.222 0.22 0.217 0.207 0.193 0.174 0.153 0.132 0.111 0.0756 0.0385 0.0109 0.00369 0.00256 0.00252 0.00238 0.0017 0.0004 9.1e-05 6.5e-06 7.4e-07 2.7e-08 3.6e-10 0.228 0.228 0.228 0.228 0.228 0.228 0.228 0.227 0.226 0.224 0.22 0.21 0.194 0.174 0.153 0.131 0.11 0.0738 0.0371 0.0103 0.00354 0.00254 0.00251 0.00235 0.0016 0.00038 8.5e-05 5.8e-06 6.4e-07 2.1e-08 2.3e-10 1.45 1.42 1.33 1.2 1.04 0.694 0.409 0.219 0.112 0.0605 0.0398 0.0325 0.0317 0.0275 0.0213 0.0152 0.0102 0.00432 0.00179 0.00156 0.00106 0.000498 0.000213 0.000124 0.00011 3.9e-05 6.7e-06 3e-06 2e-06 5.5e-07 5.7e-08 +Z 49 16 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 1.0 27921.0 4213.8 3942.5 3728.4 811.24 699.62 660.6700000000001 461.04 453.0 127.89999999999999 90.77 83.86999999999999 25.490000000000002 24.58 10.83 4.909999999999999 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0166 0.0166 0.0166 0.0166 0.0166 0.0165 0.0164 0.0162 0.016 0.0157 0.0155 0.015 0.013 0.011 0.0067 0.0039 0.0013 0.00018 0.06 0.06 0.06 0.06 0.06 0.06 0.0599 0.0598 0.0597 0.0596 0.0595 0.0592 0.0588 0.0583 0.0578 0.0572 0.0566 0.0552 0.0526 0.0476 0.0418 0.0358 0.03 0.0245 0.015 0.0039 0.0016 0.0014 0.00088 0.00025 2.8e-05 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0298 0.0296 0.0292 0.0286 0.0278 0.0266 0.024 0.015 0.0082 0.0021 0.00056 6e-05 2.7e-06 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.0311 0.031 0.0308 0.0303 0.0296 0.0286 0.0274 0.024 0.015 0.0077 0.0018 0.00044 4e-05 1.3e-06 0.141 0.141 0.141 0.141 0.14 0.14 0.139 0.138 0.136 0.135 0.133 0.128 0.123 0.117 0.111 0.104 0.0973 0.0829 0.0623 0.0349 0.0187 0.0117 0.00965 0.00944 0.0087 0.0028 0.00054 0.00027 0.00019 5.3e-05 5.7e-06 0.0838 0.0838 0.0838 0.0838 0.0838 0.0838 0.0838 0.0838 0.0838 0.0838 0.0837 0.0836 0.0834 0.0831 0.0827 0.082 0.0812 0.0789 0.0737 0.0608 0.0455 0.031 0.0196 0.0117 0.0044 0.0026 0.0019 0.00054 0.00014 1.4e-05 6e-07 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0862 0.0862 0.0862 0.0862 0.0862 0.086 0.0858 0.0854 0.0849 0.0842 0.0833 0.0807 0.0748 0.0608 0.0444 0.0295 0.0181 0.0106 0.0041 0.0027 0.0019 0.00047 0.00011 9.5e-06 2.9e-07 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.0581 0.058 0.058 0.058 0.0579 0.0577 0.057 0.0543 0.0494 0.0428 0.0354 0.0283 0.017 0.0038 0.00087 6.4e-05 7.6e-06 2.8e-07 3.8e-09 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0585 0.0583 0.0575 0.0547 0.0496 0.0428 0.0353 0.028 0.016 0.0036 0.00082 5.9e-05 6.6e-06 2.2e-07 2.4e-09 0.336 0.336 0.335 0.332 0.329 0.32 0.308 0.293 0.276 0.257 0.237 0.195 0.155 0.119 0.0895 0.0663 0.0494 0.0309 0.0246 0.0228 0.0147 0.00715 0.00327 0.00201 0.0018 0.00069 0.00012 5e-05 3.5e-05 9.9e-06 1.1e-06 0.219 0.219 0.219 0.219 0.219 0.219 0.219 0.218 0.216 0.214 0.211 0.201 0.187 0.17 0.15 0.129 0.107 0.0699 0.0323 0.0108 0.00894 0.00836 0.0064 0.00417 0.0014 0.0004 0.00033 9.4e-05 2.4e-05 2.4e-06 1e-07 0.226 0.226 0.226 0.226 0.226 0.226 0.226 0.225 0.223 0.22 0.216 0.206 0.19 0.171 0.149 0.126 0.104 0.0658 0.0293 0.0104 0.00918 0.00831 0.00608 0.0038 0.0012 0.00043 0.00032 8.3e-05 1.9e-05 1.6e-06 5e-08 0.206 0.206 0.206 0.206 0.206 0.206 0.206 0.206 0.205 0.204 0.202 0.196 0.186 0.172 0.155 0.137 0.119 0.0843 0.0457 0.0139 0.00455 0.00278 0.00267 0.00258 0.0019 0.0005 0.00012 8.5e-06 9.9e-07 3.6e-08 4.9e-10 0.208 0.208 0.208 0.208 0.208 0.208 0.208 0.208 0.207 0.206 0.204 0.198 0.187 0.173 0.156 0.137 0.118 0.0831 0.0445 0.0133 0.00438 0.00277 0.00268 0.00257 0.0019 0.00047 0.00011 7.7e-06 8.6e-07 2.9e-08 3.2e-10 1.24 1.22 1.16 1.07 0.961 0.706 0.467 0.283 0.162 0.0919 0.0568 0.0374 0.0365 0.0341 0.0284 0.0215 0.0152 0.00676 0.00246 0.00197 0.00145 0.000734 0.000319 0.000171 0.00014 5.6e-05 1e-05 3.9e-06 2.7e-06 7.7e-07 8.2e-08 0.962 0.961 0.958 0.944 0.914 0.792 0.614 0.43 0.279 0.17 0.0999 0.0326 0.0126 0.00824 0.00779 0.0077 0.00719 0.00526 0.00248 0.000594 0.000359 0.000347 0.000279 0.000187 6.2e-05 1.6e-05 1.3e-05 3.9e-06 9.8e-07 9.8e-08 4.2e-09 +Z 50 16 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 29184.0 4440.3 4160.8 3926.8 869.05 753.36 710.3199999999999 503.56999999999994 494.62 142.81 103.64 95.8 33.49 32.39 13.39 6.28 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0163 0.0162 0.0162 0.0162 0.0161 0.016 0.0158 0.0156 0.0154 0.0152 0.015 0.013 0.011 0.0068 0.004 0.0013 0.0002 0.0586 0.0586 0.0586 0.0586 0.0586 0.0585 0.0585 0.0584 0.0583 0.0582 0.0581 0.0578 0.0574 0.057 0.0565 0.056 0.0554 0.0541 0.0517 0.0469 0.0415 0.0358 0.0302 0.0249 0.016 0.0042 0.0016 0.0014 0.00091 0.00027 3.1e-05 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0291 0.0291 0.0289 0.0286 0.028 0.0272 0.0262 0.024 0.015 0.0086 0.0023 0.00062 6.8e-05 3.2e-06 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0303 0.0301 0.0297 0.0291 0.0282 0.027 0.024 0.015 0.008 0.0019 0.00048 4.5e-05 1.5e-06 0.137 0.137 0.137 0.137 0.136 0.136 0.135 0.134 0.133 0.131 0.129 0.125 0.121 0.115 0.109 0.103 0.0964 0.0829 0.0631 0.0363 0.0198 0.0121 0.00962 0.00926 0.0087 0.0031 0.00061 0.00027 0.0002 5.7e-05 6.4e-06 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0813 0.0813 0.0812 0.0811 0.0808 0.0804 0.0798 0.0791 0.0771 0.0724 0.0607 0.0463 0.0323 0.0209 0.0128 0.0048 0.0026 0.002 0.00059 0.00016 1.6e-05 7.1e-07 0.0839 0.0839 0.0839 0.0839 0.0839 0.0839 0.0839 0.0838 0.0838 0.0838 0.0838 0.0837 0.0835 0.0832 0.0827 0.0821 0.0812 0.0789 0.0737 0.0608 0.0454 0.0308 0.0194 0.0116 0.0044 0.0027 0.002 0.00052 0.00012 1.1e-05 3.4e-07 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0563 0.0562 0.0562 0.056 0.0554 0.0531 0.0488 0.0428 0.0359 0.0291 0.018 0.0042 0.00099 7.6e-05 9.1e-06 3.4e-07 4.7e-09 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0568 0.0568 0.0568 0.0568 0.0567 0.0566 0.056 0.0536 0.0491 0.0429 0.0358 0.0289 0.017 0.004 0.00093 6.9e-05 7.9e-06 2.7e-07 3e-09 0.322 0.322 0.32 0.318 0.316 0.308 0.297 0.283 0.268 0.251 0.233 0.195 0.157 0.123 0.0941 0.0707 0.0531 0.0327 0.0245 0.0231 0.0159 0.00818 0.00378 0.00216 0.0018 0.00078 0.00015 5.1e-05 3.8e-05 1.1e-05 1.2e-06 0.209 0.209 0.209 0.209 0.209 0.209 0.208 0.208 0.207 0.205 0.202 0.194 0.183 0.168 0.15 0.131 0.111 0.0753 0.0366 0.0118 0.00895 0.0086 0.00691 0.0047 0.0016 0.00041 0.00035 0.00011 2.8e-05 2.9e-06 1.2e-07 0.216 0.216 0.216 0.216 0.216 0.216 0.216 0.215 0.213 0.211 0.208 0.199 0.186 0.169 0.15 0.129 0.108 0.0712 0.0333 0.0112 0.00919 0.00862 0.00661 0.0043 0.0014 0.00044 0.00035 9.4e-05 2.2e-05 1.9e-06 6e-08 0.192 0.192 0.192 0.192 0.192 0.192 0.192 0.191 0.191 0.19 0.189 0.185 0.178 0.167 0.154 0.139 0.123 0.0913 0.0525 0.0172 0.00563 0.00304 0.00279 0.00274 0.0021 0.00059 0.00014 1.1e-05 1.3e-06 4.8e-08 6.6e-10 0.193 0.193 0.193 0.193 0.193 0.193 0.193 0.193 0.192 0.192 0.191 0.187 0.179 0.169 0.155 0.14 0.123 0.0908 0.0515 0.0166 0.00542 0.00302 0.00281 0.00275 0.0021 0.00057 0.00014 9.9e-06 1.1e-06 3.8e-08 4.2e-10 1.1 1.09 1.05 0.981 0.897 0.697 0.495 0.326 0.202 0.122 0.0754 0.0424 0.0389 0.038 0.0338 0.0272 0.0202 0.00965 0.00328 0.0023 0.00183 0.000991 0.000444 0.000223 0.00016 7.4e-05 1.4e-05 4.6e-06 3.4e-06 1e-06 1.1e-07 0.836 0.836 0.834 0.827 0.81 0.736 0.614 0.472 0.337 0.228 0.148 0.0567 0.0222 0.0117 0.00963 0.0095 0.00929 0.00748 0.0039 0.000953 0.000481 0.000465 0.000395 0.000278 9.8e-05 2.2e-05 1.9e-05 5.8e-06 1.5e-06 1.5e-07 6.7e-09 +Z 51 17 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 1.0 30479.0 4673.7 4386.0 4130.5 928.98 809.16 761.6899999999999 547.7900000000001 537.85 158.26999999999998 117.02 108.12 41.87 40.559999999999995 15.92 7.73 7.02 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0159 0.0158 0.0158 0.0157 0.0155 0.0153 0.0151 0.0149 0.014 0.013 0.011 0.0068 0.0041 0.0014 0.00021 0.0572 0.0572 0.0572 0.0572 0.0572 0.0572 0.0571 0.0571 0.057 0.0569 0.0568 0.0565 0.0562 0.0558 0.0553 0.0548 0.0543 0.053 0.0508 0.0463 0.0412 0.0358 0.0304 0.0252 0.016 0.0045 0.0016 0.0013 0.00093 0.00029 3.4e-05 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0284 0.0284 0.0282 0.0279 0.0274 0.0267 0.0258 0.023 0.016 0.0089 0.0024 0.00068 7.7e-05 3.7e-06 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0297 0.0297 0.0297 0.0295 0.0291 0.0285 0.0277 0.0266 0.024 0.015 0.0083 0.0021 0.00053 5.1e-05 1.7e-06 0.133 0.133 0.133 0.133 0.133 0.132 0.131 0.13 0.129 0.128 0.126 0.122 0.118 0.113 0.107 0.102 0.0955 0.0827 0.0638 0.0376 0.0208 0.0125 0.00964 0.00909 0.0087 0.0033 0.0007 0.00027 0.0002 6.2e-05 7.1e-06 0.0791 0.0791 0.0791 0.0791 0.0791 0.0791 0.0791 0.0791 0.0791 0.0791 0.079 0.079 0.0788 0.0786 0.0782 0.0777 0.0771 0.0753 0.0711 0.0605 0.047 0.0335 0.0222 0.0139 0.0053 0.0025 0.0021 0.00064 0.00017 1.8e-05 8.3e-07 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0816 0.0815 0.0815 0.0814 0.0812 0.081 0.0806 0.08 0.0793 0.0772 0.0725 0.0607 0.0461 0.0321 0.0207 0.0126 0.0048 0.0027 0.002 0.00057 0.00014 1.2e-05 4e-07 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0546 0.0545 0.0544 0.0539 0.052 0.0482 0.0427 0.0363 0.0298 0.019 0.0046 0.0011 8.9e-05 1.1e-05 4.2e-07 5.7e-09 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0552 0.0551 0.0551 0.0549 0.0544 0.0524 0.0484 0.0428 0.0363 0.0296 0.018 0.0044 0.0011 8.1e-05 9.4e-06 3.3e-07 3.6e-09 0.309 0.308 0.307 0.305 0.303 0.296 0.286 0.274 0.261 0.245 0.229 0.194 0.159 0.127 0.0982 0.0749 0.0568 0.0348 0.0245 0.0232 0.017 0.00925 0.00437 0.00237 0.0018 0.00087 0.00017 5.2e-05 4e-05 1.2e-05 1.4e-06 0.2 0.2 0.2 0.2 0.2 0.2 0.199 0.199 0.198 0.196 0.194 0.188 0.178 0.165 0.15 0.132 0.115 0.0801 0.0409 0.0131 0.00897 0.00875 0.00735 0.00522 0.0019 0.00042 0.00037 0.00012 3.2e-05 3.4e-06 1.5e-07 0.207 0.207 0.207 0.207 0.207 0.207 0.206 0.206 0.204 0.203 0.2 0.193 0.182 0.167 0.15 0.131 0.112 0.0762 0.0374 0.0122 0.00921 0.00885 0.0071 0.00482 0.0017 0.00044 0.00037 0.00011 2.6e-05 2.3e-06 7.3e-08 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.178 0.178 0.175 0.17 0.162 0.152 0.14 0.126 0.0971 0.059 0.021 0.00696 0.00339 0.0029 0.00287 0.0023 0.0007 0.00018 1.4e-05 1.7e-06 6.3e-08 8.7e-10 0.181 0.181 0.181 0.181 0.181 0.18 0.18 0.18 0.18 0.18 0.179 0.176 0.171 0.163 0.153 0.14 0.126 0.0966 0.058 0.0202 0.00667 0.00334 0.00292 0.00289 0.0023 0.00068 0.00017 1.3e-05 1.4e-06 5e-08 5.6e-10 1.0 0.99 0.958 0.907 0.841 0.679 0.508 0.355 0.234 0.149 0.0947 0.0485 0.0404 0.0401 0.0375 0.0319 0.025 0.0129 0.00433 0.00256 0.00218 0.00127 0.000592 0.000285 0.00019 9.4e-05 1.9e-05 5.3e-06 4.1e-06 1.2e-06 1.4e-07 0.737 0.737 0.736 0.732 0.723 0.678 0.596 0.489 0.377 0.275 0.192 0.0849 0.0356 0.0171 0.0119 0.011 0.011 0.00961 0.00558 0.00145 0.000617 0.000579 0.000517 0.000382 0.00015 2.8e-05 2.4e-05 8.1e-06 2.2e-06 2.3e-07 1e-08 0.764 0.764 0.763 0.758 0.747 0.696 0.604 0.487 0.367 0.262 0.178 0.0746 0.0303 0.0153 0.0116 0.0113 0.0111 0.00926 0.00497 0.00122 0.0006 0.000579 0.000492 0.000346 0.00012 2.8e-05 2.4e-05 6.9e-06 1.7e-06 1.5e-07 4.7e-09 +Z 52 17 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 2.0 31805.0 4914.2 4618.2 4339.7 991.08 867.09 814.85 593.74 582.74 174.32999999999998 130.97 120.92 50.71 49.18 18.450000000000003 9.23 8.31 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0155 0.0155 0.0155 0.0154 0.0153 0.0152 0.015 0.0148 0.0146 0.014 0.012 0.01 0.0069 0.0042 0.0015 0.00023 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0558 0.0558 0.0557 0.0556 0.0555 0.0552 0.0549 0.0546 0.0541 0.0537 0.0531 0.052 0.0499 0.0457 0.0408 0.0357 0.0305 0.0255 0.017 0.0048 0.0017 0.0013 0.00096 0.00031 3.8e-05 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0277 0.0276 0.0273 0.0269 0.0262 0.0254 0.023 0.016 0.0092 0.0026 0.00074 8.7e-05 4.2e-06 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.0291 0.029 0.0289 0.0285 0.028 0.0272 0.0263 0.024 0.015 0.0086 0.0022 0.00058 5.7e-05 2e-06 0.13 0.13 0.129 0.129 0.129 0.129 0.128 0.127 0.126 0.125 0.123 0.12 0.116 0.111 0.106 0.1 0.0945 0.0824 0.0644 0.0388 0.0219 0.0131 0.00971 0.00895 0.0087 0.0036 0.00079 0.00026 0.00021 6.7e-05 7.8e-06 0.0769 0.0769 0.0769 0.0769 0.0769 0.0769 0.0769 0.0769 0.0769 0.0769 0.0769 0.0768 0.0767 0.0765 0.0761 0.0757 0.0752 0.0736 0.0698 0.0601 0.0475 0.0346 0.0234 0.015 0.0058 0.0025 0.0021 0.00069 0.00019 2.1e-05 9.7e-07 0.0794 0.0794 0.0794 0.0794 0.0794 0.0794 0.0794 0.0794 0.0794 0.0794 0.0794 0.0793 0.0791 0.0789 0.0785 0.078 0.0774 0.0755 0.0713 0.0604 0.0468 0.0332 0.0219 0.0136 0.0052 0.0027 0.0021 0.00061 0.00016 1.4e-05 4.6e-07 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.0528 0.0524 0.0508 0.0474 0.0425 0.0366 0.0304 0.019 0.005 0.0013 0.0001 1.3e-05 5e-07 7e-09 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0536 0.0535 0.0534 0.053 0.0512 0.0478 0.0427 0.0366 0.0302 0.019 0.0049 0.0012 9.4e-05 1.1e-05 4e-07 4.4e-09 0.296 0.296 0.295 0.293 0.291 0.285 0.276 0.266 0.253 0.239 0.224 0.192 0.16 0.129 0.102 0.0788 0.0605 0.037 0.0247 0.0232 0.018 0.0103 0.00503 0.00263 0.0018 0.00097 0.00021 5.2e-05 4.2e-05 1.4e-05 1.6e-06 0.191 0.191 0.191 0.191 0.191 0.191 0.191 0.191 0.19 0.189 0.187 0.181 0.173 0.162 0.149 0.133 0.117 0.0843 0.0452 0.0146 0.00904 0.00883 0.00772 0.00572 0.0023 0.00043 0.00038 0.00013 3.7e-05 4e-06 1.8e-07 0.198 0.198 0.198 0.198 0.198 0.198 0.198 0.197 0.196 0.195 0.193 0.186 0.177 0.164 0.149 0.132 0.115 0.0807 0.0415 0.0134 0.00924 0.00901 0.00754 0.00533 0.002 0.00045 0.00039 0.00012 3e-05 2.7e-06 8.7e-08 0.168 0.168 0.168 0.168 0.168 0.168 0.168 0.168 0.168 0.168 0.167 0.166 0.162 0.156 0.148 0.138 0.127 0.101 0.0649 0.0249 0.00854 0.00382 0.00301 0.00297 0.0025 0.00082 0.00021 1.7e-05 2.1e-06 8.2e-08 1.1e-09 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.169 0.167 0.163 0.158 0.149 0.139 0.127 0.101 0.0639 0.024 0.00816 0.00374 0.00302 0.00299 0.0025 0.00079 0.0002 1.6e-05 1.8e-06 6.4e-08 7.2e-10 0.92 0.911 0.886 0.845 0.792 0.659 0.512 0.374 0.259 0.173 0.114 0.056 0.042 0.0409 0.0397 0.0355 0.0292 0.0164 0.00565 0.00277 0.0025 0.00156 0.000763 0.000361 0.00021 0.00011 2.4e-05 5.8e-06 4.7e-06 1.5e-06 1.8e-07 0.665 0.665 0.664 0.662 0.656 0.626 0.569 0.489 0.397 0.307 0.227 0.113 0.0513 0.0243 0.0147 0.0123 0.0121 0.0113 0.00732 0.00208 0.000771 0.000678 0.00063 0.000489 0.0002 3.3e-05 3e-05 1.1e-05 2.9e-06 3.1e-07 1.4e-08 0.693 0.693 0.693 0.69 0.682 0.647 0.581 0.49 0.39 0.294 0.212 0.0998 0.0437 0.021 0.0138 0.0124 0.0123 0.0111 0.0066 0.00173 0.000726 0.00068 0.000605 0.000446 0.00017 3.4e-05 2.9e-05 9.1e-06 2.3e-06 2.1e-07 6.6e-09 +Z 53 17 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 3.0 33164.0 5161.9 4857.5 4554.5 1055.3999999999999 927.1999999999999 869.8100000000001 641.4599999999999 629.3100000000001 191.04 145.53 134.21 60.04 58.26 21.01 10.77 9.629999999999999 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0151 0.015 0.0149 0.0147 0.0145 0.0143 0.014 0.012 0.01 0.0069 0.0043 0.0015 0.00025 0.0547 0.0547 0.0547 0.0547 0.0547 0.0546 0.0546 0.0545 0.0544 0.0544 0.0543 0.054 0.0537 0.0534 0.053 0.0526 0.0521 0.051 0.049 0.045 0.0405 0.0356 0.0306 0.0258 0.017 0.0051 0.0017 0.0013 0.00098 0.00033 4.1e-05 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0272 0.0271 0.0271 0.0271 0.027 0.0267 0.0263 0.0257 0.025 0.023 0.016 0.0095 0.0028 0.00081 9.8e-05 4.9e-06 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0284 0.0283 0.028 0.0275 0.0268 0.0259 0.023 0.016 0.0089 0.0024 0.00064 6.4e-05 2.3e-06 0.126 0.126 0.126 0.126 0.126 0.125 0.125 0.124 0.123 0.122 0.12 0.117 0.113 0.109 0.104 0.0989 0.0934 0.0821 0.0649 0.04 0.0229 0.0137 0.00983 0.00883 0.0086 0.0039 0.00089 0.00026 0.00021 7.2e-05 8.7e-06 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0747 0.0746 0.0744 0.0742 0.0738 0.0733 0.0719 0.0685 0.0597 0.048 0.0356 0.0246 0.0161 0.0063 0.0025 0.0021 0.00075 0.00021 2.4e-05 1.1e-06 0.0774 0.0774 0.0774 0.0774 0.0774 0.0774 0.0774 0.0774 0.0774 0.0773 0.0773 0.0772 0.0771 0.0769 0.0766 0.0761 0.0756 0.0739 0.0701 0.0601 0.0473 0.0343 0.0231 0.0146 0.0057 0.0026 0.0022 0.00066 0.00017 1.6e-05 5.4e-07 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0514 0.0511 0.0496 0.0467 0.0423 0.0368 0.0309 0.02 0.0055 0.0014 0.00012 1.5e-05 6.1e-07 8.5e-09 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.0521 0.052 0.0516 0.0501 0.047 0.0424 0.0368 0.0308 0.02 0.0053 0.0013 0.00011 1.3e-05 4.8e-07 5.3e-09 0.285 0.284 0.284 0.282 0.28 0.275 0.267 0.257 0.246 0.233 0.22 0.19 0.16 0.131 0.105 0.0824 0.064 0.0394 0.0251 0.0231 0.0188 0.0114 0.00576 0.00295 0.0018 0.0011 0.00024 5.3e-05 4.4e-05 1.5e-05 1.8e-06 0.184 0.184 0.184 0.184 0.184 0.183 0.183 0.183 0.182 0.181 0.18 0.175 0.168 0.159 0.147 0.133 0.118 0.0879 0.0493 0.0163 0.00919 0.00885 0.00803 0.00619 0.0026 0.00044 0.0004 0.00015 4.3e-05 4.7e-06 2.2e-07 0.19 0.19 0.19 0.19 0.19 0.19 0.19 0.189 0.188 0.187 0.186 0.18 0.172 0.161 0.148 0.133 0.117 0.0846 0.0456 0.0149 0.00932 0.0091 0.00793 0.00583 0.0023 0.00046 0.00041 0.00013 3.4e-05 3.2e-06 1e-07 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.157 0.155 0.15 0.144 0.136 0.126 0.104 0.0699 0.0289 0.0103 0.00438 0.00313 0.00304 0.0027 0.00095 0.00025 2.1e-05 2.7e-06 1e-07 1.5e-09 0.161 0.161 0.161 0.161 0.161 0.161 0.161 0.161 0.161 0.161 0.16 0.159 0.156 0.152 0.145 0.137 0.127 0.104 0.069 0.0279 0.00987 0.00425 0.00314 0.00307 0.0027 0.00091 0.00024 1.9e-05 2.3e-06 8.2e-08 9.3e-10 0.853 0.846 0.826 0.792 0.748 0.637 0.51 0.387 0.279 0.194 0.131 0.0645 0.0441 0.0413 0.0409 0.0381 0.0327 0.0199 0.00725 0.00298 0.00277 0.00186 0.000958 0.000454 0.00022 0.00014 3.1e-05 6.3e-06 5.3e-06 1.8e-06 2.1e-07 0.608 0.608 0.608 0.606 0.602 0.582 0.541 0.479 0.405 0.327 0.254 0.138 0.0683 0.0333 0.0187 0.0139 0.013 0.0126 0.00902 0.00286 0.000958 0.000764 0.000734 0.000597 0.00026 3.9e-05 3.5e-05 1.3e-05 3.8e-06 4.2e-07 1.9e-08 0.637 0.637 0.637 0.635 0.63 0.605 0.556 0.485 0.401 0.317 0.239 0.124 0.0584 0.0281 0.0167 0.0135 0.0131 0.0124 0.00823 0.00237 0.000872 0.000767 0.000711 0.000548 0.00022 3.9e-05 3.5e-05 1.1e-05 2.9e-06 2.7e-07 8.9e-09 +Z 54 17 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 34556.0 5416.9 5103.9 4774.7 1122.0 989.4700000000001 926.56 690.91 677.52 208.37 160.69 147.98 69.83999999999999 67.78 23.61 12.35 10.96 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0148 0.0147 0.0146 0.0144 0.0142 0.014 0.014 0.012 0.01 0.007 0.0044 0.0016 0.00027 0.0535 0.0535 0.0535 0.0535 0.0534 0.0534 0.0534 0.0533 0.0532 0.0532 0.0531 0.0528 0.0526 0.0523 0.0519 0.0515 0.051 0.05 0.0481 0.0444 0.0401 0.0354 0.0306 0.026 0.018 0.0054 0.0018 0.0013 0.00099 0.00034 4.5e-05 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0264 0.0261 0.0258 0.0253 0.0245 0.023 0.016 0.0097 0.003 0.00089 0.00011 5.6e-06 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0279 0.0278 0.0277 0.0274 0.027 0.0263 0.0255 0.023 0.016 0.0092 0.0025 0.00069 7.2e-05 2.6e-06 0.123 0.123 0.123 0.123 0.123 0.122 0.121 0.121 0.12 0.119 0.117 0.114 0.111 0.107 0.102 0.0975 0.0924 0.0816 0.0653 0.0411 0.024 0.0143 0.01 0.00874 0.0085 0.0042 0.001 0.00026 0.00022 7.7e-05 9.5e-06 0.0729 0.0729 0.0729 0.0729 0.0729 0.0729 0.0729 0.0729 0.0729 0.0728 0.0728 0.0728 0.0727 0.0725 0.0723 0.0719 0.0715 0.0702 0.0672 0.0592 0.0483 0.0365 0.0258 0.0172 0.0069 0.0024 0.0022 0.0008 0.00024 2.7e-05 1.3e-06 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0754 0.0753 0.0752 0.075 0.0747 0.0743 0.0738 0.0723 0.0689 0.0598 0.0478 0.0352 0.0242 0.0157 0.0062 0.0026 0.0022 0.00071 0.00019 1.8e-05 6.2e-07 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.0501 0.05 0.0497 0.0485 0.0459 0.0419 0.0369 0.0314 0.021 0.006 0.0016 0.00014 1.8e-05 7.3e-07 1e-08 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0507 0.0506 0.0503 0.049 0.0463 0.0421 0.0369 0.0313 0.021 0.0057 0.0015 0.00013 1.5e-05 5.7e-07 6.4e-09 0.274 0.274 0.273 0.272 0.27 0.265 0.258 0.249 0.239 0.228 0.215 0.188 0.16 0.133 0.108 0.0857 0.0673 0.0418 0.0256 0.0228 0.0195 0.0125 0.00655 0.00333 0.0019 0.0012 0.00028 5.3e-05 4.6e-05 1.6e-05 2e-06 0.176 0.176 0.176 0.176 0.176 0.176 0.176 0.176 0.175 0.175 0.173 0.17 0.164 0.155 0.145 0.133 0.119 0.0909 0.0532 0.0183 0.00944 0.00882 0.00826 0.00662 0.003 0.00046 0.00041 0.00016 4.8e-05 5.5e-06 2.6e-07 0.182 0.182 0.182 0.182 0.182 0.182 0.182 0.182 0.181 0.18 0.179 0.174 0.168 0.158 0.146 0.133 0.118 0.088 0.0496 0.0166 0.00947 0.00915 0.00825 0.00631 0.0026 0.00047 0.00043 0.00015 3.9e-05 3.7e-06 1.2e-07 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.15 0.148 0.145 0.14 0.133 0.125 0.106 0.0742 0.0329 0.0124 0.00507 0.0033 0.0031 0.0029 0.0011 0.0003 2.6e-05 3.3e-06 1.3e-07 1.9e-09 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.152 0.151 0.149 0.146 0.141 0.134 0.126 0.106 0.0733 0.0319 0.0118 0.00488 0.00328 0.00312 0.0029 0.001 0.00028 2.4e-05 2.9e-06 1e-07 1.2e-09 0.797 0.791 0.774 0.747 0.71 0.615 0.505 0.394 0.294 0.211 0.148 0.0738 0.047 0.0415 0.0412 0.0396 0.0354 0.0233 0.00911 0.00319 0.003 0.00216 0.00117 0.000565 0.00024 0.00016 3.9e-05 6.8e-06 5.9e-06 2.1e-06 2.6e-07 0.562 0.562 0.561 0.56 0.558 0.543 0.513 0.466 0.406 0.339 0.273 0.16 0.0855 0.0436 0.0237 0.016 0.0138 0.0135 0.0106 0.00376 0.0012 0.000843 0.000824 0.000701 0.00033 4.5e-05 4e-05 1.6e-05 4.8e-06 5.4e-07 2.5e-08 0.592 0.592 0.591 0.59 0.586 0.568 0.531 0.475 0.405 0.331 0.26 0.145 0.0737 0.0366 0.0204 0.0148 0.0136 0.0133 0.00972 0.00312 0.00104 0.000836 0.0008 0.000645 0.00028 4.4e-05 4e-05 1.4e-05 3.6e-06 3.5e-07 1.2e-08 +Z 55 18 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 1.0 35985.0 5684.9 5363.2 5006.1 1196.4 1059.5 990.6800000000001 747.7 732.98 231.85999999999999 181.97 167.76000000000002 85.61 83.24 30.970000000000002 18.27 16.43 3.69 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0146 0.0145 0.0145 0.0144 0.0143 0.0141 0.014 0.0138 0.013 0.012 0.01 0.007 0.0045 0.0017 0.00029 0.0523 0.0523 0.0523 0.0523 0.0523 0.0522 0.0522 0.0522 0.0521 0.052 0.0519 0.0517 0.0515 0.0512 0.0508 0.0504 0.05 0.049 0.0473 0.0438 0.0397 0.0352 0.0307 0.0262 0.018 0.0058 0.0019 0.0013 0.001 0.00036 4.9e-05 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0258 0.0256 0.0253 0.0248 0.0241 0.022 0.016 0.01 0.0031 0.00097 0.00012 6.4e-06 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0273 0.0271 0.0269 0.0265 0.0259 0.0251 0.023 0.016 0.0094 0.0027 0.00075 7.9e-05 2.9e-06 0.12 0.12 0.12 0.12 0.119 0.119 0.118 0.118 0.117 0.116 0.115 0.112 0.109 0.105 0.101 0.0961 0.0913 0.0811 0.0655 0.0421 0.025 0.0149 0.0102 0.00868 0.0084 0.0044 0.0011 0.00025 0.00022 8.2e-05 1e-05 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.0709 0.0709 0.0708 0.0707 0.0705 0.0702 0.0698 0.0687 0.066 0.0586 0.0485 0.0373 0.0268 0.0182 0.0076 0.0024 0.0022 0.00086 0.00026 3.1e-05 1.5e-06 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0734 0.0733 0.0732 0.0729 0.0726 0.0721 0.0708 0.0677 0.0593 0.0481 0.0361 0.0252 0.0167 0.0067 0.0026 0.0022 0.00077 0.00021 2.1e-05 7.1e-07 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0488 0.0487 0.0485 0.0474 0.0452 0.0416 0.0369 0.0317 0.022 0.0064 0.0018 0.00016 2.1e-05 8.6e-07 1.2e-08 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0494 0.0493 0.0493 0.049 0.0479 0.0455 0.0418 0.037 0.0316 0.021 0.0062 0.0017 0.00014 1.8e-05 6.8e-07 7.7e-09 0.264 0.264 0.263 0.262 0.26 0.256 0.249 0.242 0.232 0.222 0.211 0.186 0.16 0.134 0.11 0.0887 0.0705 0.0443 0.0264 0.0225 0.0201 0.0135 0.00738 0.00378 0.0019 0.0013 0.00033 5.4e-05 4.8e-05 1.8e-05 2.3e-06 0.17 0.17 0.17 0.17 0.17 0.17 0.169 0.169 0.169 0.168 0.167 0.164 0.159 0.152 0.143 0.132 0.12 0.0934 0.0569 0.0204 0.00982 0.00877 0.00842 0.00701 0.0034 0.00048 0.00042 0.00018 5.5e-05 6.4e-06 3.1e-07 0.176 0.176 0.176 0.176 0.176 0.175 0.175 0.175 0.175 0.174 0.173 0.169 0.163 0.155 0.145 0.132 0.119 0.0908 0.0533 0.0184 0.00971 0.00914 0.0085 0.00674 0.003 0.00049 0.00044 0.00016 4.4e-05 4.3e-06 1.5e-07 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.143 0.143 0.141 0.139 0.135 0.13 0.123 0.107 0.0778 0.0368 0.0146 0.00591 0.00351 0.00315 0.003 0.0012 0.00035 3.2e-05 4.1e-06 1.7e-07 2.4e-09 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.144 0.143 0.14 0.136 0.131 0.124 0.107 0.077 0.0358 0.0139 0.00566 0.00348 0.00318 0.003 0.0012 0.00033 2.9e-05 3.5e-06 1.3e-07 1.5e-09 0.72 0.715 0.702 0.682 0.654 0.58 0.492 0.399 0.311 0.234 0.171 0.0896 0.0541 0.0439 0.0428 0.0422 0.0393 0.028 0.0119 0.00366 0.00336 0.00259 0.00149 0.000734 0.00028 0.00019 5e-05 7.6e-06 6.8e-06 2.5e-06 3.2e-07 0.498 0.498 0.498 0.497 0.496 0.488 0.47 0.439 0.398 0.348 0.295 0.192 0.113 0.0615 0.0337 0.0209 0.0162 0.0151 0.0129 0.00522 0.00163 0.000999 0.000976 0.000867 0.00045 5.6e-05 4.8e-05 2.1e-05 6.3e-06 7.4e-07 3.5e-08 0.522 0.522 0.522 0.521 0.519 0.509 0.487 0.451 0.402 0.346 0.287 0.179 0.101 0.0531 0.029 0.0189 0.0158 0.0153 0.0123 0.00443 0.0014 0.000995 0.000971 0.000819 0.00038 5.4e-05 4.9e-05 1.8e-05 4.9e-06 4.8e-07 1.6e-08 2.74 2.55 2.05 1.44 0.891 0.254 0.0867 0.071 0.0681 0.0561 0.0407 0.0172 0.00666 0.00322 0.00248 0.00243 0.00237 0.00181 0.000793 0.000206 0.000181 0.000143 8.29e-05 4.08e-05 1.5e-05 1e-05 2.7e-06 4.1e-07 3.6e-07 1.3e-07 1.7e-08 +Z 56 18 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 2.0 37449.0 5960.799999999999 5630.3 5243.4 1273.4 1132.2 1057.0 806.64 790.49 256.35 204.21 188.35 102.16 99.46 38.38999999999999 24.3 22.0 4.64 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0142 0.0142 0.0141 0.014 0.0139 0.0137 0.0135 0.013 0.012 0.01 0.007 0.0045 0.0018 0.00031 0.0512 0.0512 0.0512 0.0512 0.0512 0.0511 0.0511 0.051 0.051 0.0509 0.0508 0.0506 0.0504 0.0501 0.0498 0.0494 0.049 0.0481 0.0465 0.0432 0.0393 0.035 0.0307 0.0264 0.019 0.0061 0.002 0.0012 0.001 0.00038 5.3e-05 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0253 0.0252 0.0251 0.0248 0.0243 0.0237 0.022 0.016 0.01 0.0033 0.001 0.00014 7.3e-06 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0268 0.0267 0.0266 0.0264 0.026 0.0255 0.0248 0.023 0.016 0.0097 0.0029 0.00081 8.8e-05 3.3e-06 0.117 0.117 0.117 0.117 0.116 0.116 0.116 0.115 0.114 0.113 0.112 0.109 0.106 0.103 0.0989 0.0947 0.0902 0.0806 0.0657 0.043 0.026 0.0156 0.0105 0.00866 0.0083 0.0047 0.0013 0.00025 0.00023 8.7e-05 1.1e-05 0.0692 0.0692 0.0692 0.0692 0.0692 0.0692 0.0692 0.0692 0.0692 0.0692 0.0692 0.0691 0.069 0.0689 0.0687 0.0685 0.0681 0.0671 0.0647 0.058 0.0486 0.038 0.0278 0.0192 0.0083 0.0024 0.0022 0.00091 0.00029 3.5e-05 1.7e-06 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0717 0.0717 0.0717 0.0716 0.0714 0.0712 0.0709 0.0705 0.0693 0.0665 0.0588 0.0483 0.0368 0.0262 0.0176 0.0073 0.0025 0.0023 0.00082 0.00023 2.3e-05 8.1e-07 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0474 0.0472 0.0463 0.0444 0.0411 0.0369 0.032 0.022 0.0069 0.0019 0.00018 2.4e-05 1e-06 1.5e-08 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.0481 0.048 0.0478 0.0469 0.0448 0.0414 0.037 0.0319 0.022 0.0067 0.0018 0.00016 2.1e-05 8e-07 9.2e-09 0.255 0.254 0.254 0.253 0.251 0.247 0.241 0.234 0.226 0.217 0.206 0.183 0.159 0.135 0.112 0.0913 0.0734 0.0468 0.0273 0.0222 0.0204 0.0145 0.00825 0.00429 0.0019 0.0013 0.00038 5.5e-05 4.9e-05 1.9e-05 2.5e-06 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.162 0.161 0.159 0.154 0.148 0.14 0.13 0.12 0.0953 0.0603 0.0227 0.0103 0.00872 0.00852 0.00734 0.0038 0.00051 0.00043 0.0002 6.2e-05 7.4e-06 3.6e-07 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.168 0.168 0.167 0.164 0.159 0.151 0.142 0.131 0.119 0.0931 0.0567 0.0204 0.0101 0.0091 0.00868 0.00714 0.0033 0.00051 0.00046 0.00018 5e-05 5e-06 1.7e-07 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.137 0.136 0.135 0.134 0.131 0.126 0.121 0.107 0.0807 0.0406 0.0169 0.0069 0.0038 0.00321 0.0031 0.0013 0.0004 3.8e-05 5e-06 2.1e-07 3e-09 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.138 0.137 0.135 0.132 0.128 0.122 0.107 0.08 0.0396 0.0162 0.00659 0.00373 0.00323 0.0031 0.0013 0.00038 3.4e-05 4.3e-06 1.6e-07 1.9e-09 0.657 0.653 0.643 0.627 0.605 0.547 0.475 0.397 0.32 0.25 0.19 0.105 0.0624 0.0469 0.0439 0.0437 0.0421 0.0325 0.0152 0.00424 0.00366 0.00302 0.00184 0.000939 0.00032 0.00022 6.3e-05 8.5e-06 7.7e-06 3e-06 3.9e-07 0.452 0.452 0.452 0.452 0.451 0.446 0.433 0.413 0.383 0.345 0.302 0.213 0.136 0.0797 0.0453 0.0272 0.0193 0.0163 0.0149 0.00685 0.00219 0.00116 0.0011 0.00102 0.00057 6.9e-05 5.5e-05 2.6e-05 8.1e-06 9.7e-07 4.8e-08 0.473 0.473 0.473 0.472 0.471 0.464 0.45 0.425 0.39 0.347 0.299 0.203 0.124 0.0703 0.0392 0.0241 0.0183 0.0166 0.0145 0.00592 0.00185 0.00114 0.00112 0.000984 0.00049 6.5e-05 5.7e-05 2.3e-05 6.4e-06 6.3e-07 2.2e-08 2.23 2.12 1.82 1.42 1.01 0.401 0.144 0.0824 0.0774 0.0745 0.064 0.0356 0.0159 0.00702 0.0042 0.00369 0.00367 0.00312 0.00154 0.000367 0.000288 0.000244 0.000151 7.7e-05 2.6e-05 1.7e-05 5e-06 6.6e-07 6e-07 2.3e-07 3.1e-08 +Z 57 19 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 1.0 2.0 38943.0 6241.799999999999 5902.5 5483.799999999999 1350.4 1204.8 1122.6999999999998 864.96 847.28 279.13 224.73 207.07000000000002 116.83 113.75999999999999 43.65 28.330000000000002 25.59 5.58 5.34 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.0139 0.0138 0.0137 0.0136 0.0134 0.0133 0.013 0.012 0.01 0.0071 0.0044 0.0018 0.00033 0.0501 0.0501 0.0501 0.0501 0.0501 0.05 0.05 0.05 0.0499 0.0498 0.0498 0.0496 0.0493 0.0491 0.0488 0.0484 0.0481 0.0472 0.0457 0.0425 0.0389 0.0348 0.0307 0.0265 0.019 0.0064 0.0021 0.0012 0.001 0.0004 5.8e-05 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0247 0.0245 0.0243 0.0239 0.0233 0.022 0.016 0.01 0.0035 0.0011 0.00015 8.2e-06 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0263 0.0262 0.0262 0.0262 0.0262 0.0261 0.0259 0.0256 0.0251 0.0244 0.023 0.016 0.0099 0.003 0.00088 9.7e-05 3.7e-06 0.114 0.114 0.114 0.114 0.114 0.113 0.113 0.112 0.111 0.111 0.109 0.107 0.104 0.101 0.0972 0.0933 0.089 0.08 0.0658 0.0438 0.027 0.0163 0.0108 0.00868 0.0081 0.0049 0.0014 0.00025 0.00023 9.2e-05 1.3e-05 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0674 0.0674 0.0674 0.0673 0.0672 0.0671 0.0668 0.0665 0.0656 0.0634 0.0573 0.0486 0.0385 0.0287 0.0202 0.0089 0.0023 0.0022 0.00097 0.00031 3.9e-05 2e-06 0.0701 0.0701 0.0701 0.0701 0.0701 0.0701 0.0701 0.0701 0.0701 0.0701 0.07 0.07 0.0699 0.0698 0.0696 0.0693 0.0689 0.0679 0.0653 0.0583 0.0485 0.0375 0.0272 0.0186 0.0078 0.0025 0.0023 0.00087 0.00025 2.6e-05 9.2e-07 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0463 0.0461 0.0453 0.0436 0.0407 0.0368 0.0322 0.023 0.0074 0.0021 0.00021 2.8e-05 1.2e-06 1.8e-08 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0468 0.0467 0.0458 0.044 0.041 0.0369 0.0322 0.023 0.0071 0.002 0.00019 2.4e-05 9.4e-07 1.1e-08 0.246 0.246 0.245 0.244 0.243 0.239 0.234 0.227 0.22 0.211 0.202 0.181 0.158 0.135 0.114 0.0936 0.0761 0.0493 0.0283 0.0219 0.0207 0.0153 0.00913 0.00485 0.002 0.0014 0.00043 5.6e-05 5.1e-05 2.1e-05 2.8e-06 0.158 0.158 0.158 0.158 0.158 0.158 0.157 0.157 0.157 0.156 0.156 0.154 0.15 0.144 0.137 0.129 0.119 0.0969 0.0634 0.0251 0.011 0.00868 0.00856 0.00762 0.0042 0.00055 0.00044 0.00021 6.9e-05 8.5e-06 4.3e-07 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.162 0.161 0.158 0.154 0.148 0.14 0.13 0.119 0.095 0.06 0.0225 0.0105 0.00906 0.0088 0.00749 0.0037 0.00053 0.00047 0.00019 5.6e-05 5.7e-06 2e-07 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.13 0.128 0.126 0.123 0.118 0.106 0.0829 0.0443 0.0195 0.00806 0.00417 0.00328 0.0032 0.0015 0.00046 4.5e-05 6.1e-06 2.5e-07 3.7e-09 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.132 0.131 0.13 0.127 0.124 0.119 0.107 0.0824 0.0432 0.0186 0.00767 0.00406 0.0033 0.0032 0.0014 0.00044 4.1e-05 5.2e-06 2e-07 2.3e-09 0.616 0.613 0.604 0.591 0.572 0.522 0.46 0.392 0.323 0.258 0.201 0.116 0.0694 0.0496 0.0442 0.0437 0.043 0.0355 0.0183 0.00489 0.00385 0.00336 0.00217 0.00115 0.00037 0.00025 7.7e-05 9.3e-06 8.4e-06 3.4e-06 4.6e-07 0.424 0.424 0.424 0.424 0.423 0.419 0.41 0.393 0.369 0.338 0.302 0.223 0.15 0.0933 0.0553 0.0333 0.0223 0.0167 0.0159 0.00829 0.00277 0.0013 0.00118 0.00112 0.00067 8.2e-05 6e-05 3e-05 9.7e-06 1.2e-06 6e-08 0.44 0.44 0.44 0.44 0.439 0.434 0.423 0.404 0.377 0.342 0.302 0.217 0.141 0.0846 0.049 0.0296 0.0208 0.0172 0.0159 0.00737 0.00235 0.00127 0.00122 0.00111 0.0006 7.6e-05 6.4e-05 2.7e-05 7.8e-06 7.9e-07 2.8e-08 0.509 0.509 0.509 0.509 0.509 0.504 0.488 0.457 0.412 0.358 0.301 0.198 0.121 0.0695 0.0386 0.021 0.0118 0.0054 0.00455 0.00352 0.00175 0.000712 0.000313 0.000205 0.00019 9.6e-05 3e-05 2.9e-06 3.9e-07 1.6e-08 2.4e-10 2.07 1.98 1.73 1.39 1.03 0.457 0.175 0.088 0.0748 0.074 0.0679 0.0434 0.0217 0.00993 0.0053 0.00407 0.00394 0.00362 0.00202 0.000478 0.000324 0.000291 0.000192 0.000102 3.2e-05 2.1e-05 6.6e-06 7.8e-07 7e-07 2.9e-07 3.9e-08 +Z 58 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 1.0 2.0 2.0 4.0 1.0 2.0 40456.0 6513.299999999999 6165.3 5712.799999999999 1409.8999999999999 1259.9 1170.5 905.49 886.14 285.01 228.58 209.35 115.79 112.44 6.85 6.510000000000001 41.75 26.35 23.59 4.81 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0136 0.0136 0.0135 0.0133 0.0132 0.013 0.013 0.011 0.01 0.0071 0.0047 0.0019 0.00035 0.049 0.049 0.049 0.049 0.049 0.049 0.049 0.0489 0.0489 0.0488 0.0487 0.0486 0.0483 0.0481 0.0478 0.0475 0.0471 0.0463 0.0449 0.0419 0.0384 0.0346 0.0306 0.0266 0.019 0.0068 0.0022 0.0012 0.001 0.00042 6.2e-05 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0242 0.0242 0.024 0.0238 0.0234 0.0229 0.022 0.016 0.011 0.0037 0.0012 0.00017 9.4e-06 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0257 0.0256 0.0254 0.0251 0.0247 0.024 0.022 0.016 0.01 0.0032 0.00095 0.00011 4.2e-06 0.111 0.111 0.111 0.111 0.111 0.111 0.11 0.11 0.109 0.108 0.107 0.105 0.102 0.099 0.0956 0.0919 0.0879 0.0793 0.0659 0.0446 0.0279 0.0171 0.0112 0.00874 0.008 0.0052 0.0016 0.00025 0.00023 9.7e-05 1.4e-05 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0658 0.0657 0.0656 0.0655 0.0653 0.065 0.0642 0.0622 0.0566 0.0485 0.039 0.0296 0.0212 0.0097 0.0024 0.0022 0.001 0.00034 4.4e-05 2.3e-06 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0683 0.0682 0.068 0.0678 0.0674 0.0665 0.0641 0.0577 0.0485 0.0381 0.0281 0.0195 0.0085 0.0025 0.0023 0.00093 0.00027 2.9e-05 1e-06 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0451 0.045 0.0443 0.0428 0.0402 0.0366 0.0323 0.023 0.0079 0.0023 0.00024 3.3e-05 1.4e-06 2.1e-08 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0457 0.0457 0.0455 0.0448 0.0432 0.0405 0.0367 0.0323 0.023 0.0076 0.0022 0.00021 2.8e-05 1.1e-06 1.3e-08 0.239 0.239 0.238 0.238 0.236 0.233 0.228 0.222 0.215 0.207 0.198 0.179 0.157 0.136 0.115 0.0954 0.0782 0.0513 0.0293 0.0215 0.0206 0.0159 0.0099 0.0054 0.0021 0.0015 0.00049 5.7e-05 5.1e-05 2.2e-05 3.1e-06 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.152 0.152 0.15 0.146 0.142 0.135 0.127 0.118 0.0978 0.0658 0.0271 0.0116 0.0086 0.00846 0.00776 0.0045 0.00059 0.00043 0.00023 7.6e-05 9.7e-06 5e-07 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.158 0.158 0.157 0.155 0.151 0.145 0.138 0.129 0.119 0.0962 0.0624 0.0244 0.0109 0.00892 0.00877 0.00769 0.0041 0.00056 0.00047 0.00021 6.2e-05 6.4e-06 2.3e-07 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.126 0.125 0.123 0.12 0.116 0.105 0.0839 0.0468 0.0215 0.00909 0.00451 0.00332 0.0032 0.0016 0.00052 5.2e-05 7.2e-06 3.1e-07 4.5e-09 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.128 0.128 0.126 0.124 0.121 0.117 0.106 0.0835 0.0458 0.0206 0.00865 0.00437 0.00332 0.0032 0.0016 0.00049 4.7e-05 6.1e-06 2.4e-07 2.8e-09 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.14 0.138 0.134 0.128 0.121 0.114 0.0978 0.0743 0.0438 0.0247 0.0138 0.0077 0.00434 0.0014 0.00012 1.4e-05 4.7e-07 3.1e-08 5.1e-10 3.5e-12 0.602 0.599 0.591 0.579 0.561 0.515 0.456 0.391 0.325 0.262 0.206 0.121 0.0722 0.0501 0.0433 0.0424 0.0421 0.036 0.0196 0.00522 0.00375 0.00341 0.00233 0.00129 0.00039 0.00026 8.7e-05 9.4e-06 8.5e-06 3.7e-06 5.1e-07 0.414 0.414 0.414 0.413 0.413 0.409 0.401 0.386 0.364 0.336 0.302 0.227 0.156 0.0993 0.06 0.0362 0.0237 0.0164 0.0157 0.0089 0.00313 0.00136 0.00115 0.00112 0.00072 9e-05 6e-05 3.2e-05 1.1e-05 1.4e-06 6.9e-08 0.431 0.431 0.431 0.431 0.43 0.426 0.416 0.398 0.373 0.34 0.302 0.221 0.146 0.0897 0.0526 0.0316 0.0215 0.0166 0.0157 0.0079 0.0026 0.00128 0.00119 0.00112 0.00064 8e-05 6.3e-05 2.9e-05 8.5e-06 8.9e-07 3.1e-08 0.498 0.498 0.498 0.498 0.498 0.493 0.479 0.45 0.408 0.358 0.304 0.203 0.127 0.0747 0.0424 0.0236 0.0133 0.00564 0.00437 0.00358 0.0019 0.000807 0.00035 0.000212 0.00019 0.0001 3.3e-05 3.4e-06 4.6e-07 2e-08 2.9e-10 2.05 1.96 1.72 1.39 1.04 0.469 0.181 0.088 0.0721 0.0715 0.0666 0.0441 0.0228 0.0106 0.00547 0.00395 0.00373 0.00352 0.0021 0.000509 0.000308 0.000287 0.0002 0.000111 3.3e-05 2.1e-05 7.1e-06 7.7e-07 6.9e-07 3e-07 4.2e-08 +Z 59 19 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 3.0 2.0 42010.0 6799.8 6442.9 5954.400000000001 1480.1000000000001 1325.7 1228.3999999999999 955.98 934.86 299.25 240.64 219.56 122.28 118.59 43.300000000000004 27.26 24.26 4.89 4.89 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0134 0.0134 0.0134 0.0134 0.0134 0.0134 0.0134 0.0133 0.0132 0.0131 0.0129 0.0128 0.012 0.011 0.0099 0.0071 0.0047 0.002 0.00037 0.048 0.048 0.048 0.048 0.048 0.048 0.0479 0.0479 0.0479 0.0478 0.0477 0.0476 0.0474 0.0471 0.0469 0.0466 0.0462 0.0455 0.0441 0.0413 0.038 0.0344 0.0305 0.0267 0.019 0.0071 0.0024 0.0012 0.001 0.00044 6.7e-05 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0237 0.0237 0.0237 0.0235 0.0233 0.023 0.0225 0.021 0.016 0.011 0.0039 0.0013 0.00019 1.1e-05 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0251 0.0249 0.0247 0.0242 0.0237 0.022 0.016 0.01 0.0033 0.001 0.00012 4.7e-06 0.109 0.109 0.109 0.108 0.108 0.108 0.108 0.107 0.106 0.106 0.105 0.103 0.1 0.0972 0.094 0.0905 0.0867 0.0786 0.0658 0.0453 0.0288 0.0178 0.0116 0.00884 0.0078 0.0054 0.0017 0.00025 0.00023 0.0001 1.5e-05 0.0643 0.0643 0.0643 0.0643 0.0643 0.0643 0.0643 0.0643 0.0643 0.0642 0.0642 0.0642 0.0642 0.0641 0.0639 0.0638 0.0635 0.0628 0.061 0.0559 0.0484 0.0394 0.0303 0.0221 0.01 0.0024 0.0022 0.0011 0.00037 4.9e-05 2.6e-06 0.0669 0.0669 0.0669 0.0669 0.0669 0.0669 0.0669 0.0669 0.0669 0.0669 0.0669 0.0668 0.0668 0.0667 0.0665 0.0663 0.066 0.0651 0.063 0.0571 0.0485 0.0386 0.0289 0.0204 0.0091 0.0025 0.0023 0.00098 0.0003 3.2e-05 1.2e-06 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0441 0.0439 0.0434 0.042 0.0396 0.0364 0.0324 0.024 0.0084 0.0026 0.00027 3.8e-05 1.7e-06 2.5e-08 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0447 0.0446 0.0446 0.0445 0.0439 0.0424 0.04 0.0366 0.0324 0.024 0.0081 0.0024 0.00024 3.2e-05 1.3e-06 1.5e-08 0.234 0.234 0.233 0.233 0.232 0.228 0.224 0.218 0.211 0.204 0.195 0.177 0.157 0.136 0.116 0.0968 0.0799 0.0529 0.03 0.021 0.0204 0.0163 0.0106 0.00592 0.0022 0.0015 0.00054 5.9e-05 5.2e-05 2.3e-05 3.4e-06 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.149 0.149 0.148 0.147 0.144 0.139 0.133 0.126 0.118 0.0982 0.0675 0.0289 0.0122 0.00848 0.00828 0.00777 0.0048 0.00064 0.00043 0.00024 8.3e-05 1.1e-05 5.7e-07 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.155 0.155 0.155 0.154 0.152 0.148 0.143 0.136 0.128 0.119 0.0969 0.0642 0.0259 0.0113 0.00874 0.00862 0.00777 0.0044 0.00059 0.00047 0.00022 6.7e-05 7.2e-06 2.6e-07 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.124 0.124 0.123 0.121 0.118 0.115 0.104 0.0842 0.0484 0.023 0.00997 0.00482 0.00334 0.0031 0.0017 0.00056 5.9e-05 8.3e-06 3.6e-07 5.4e-09 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.125 0.124 0.122 0.119 0.115 0.105 0.084 0.0475 0.0222 0.00951 0.00465 0.00331 0.0031 0.0016 0.00053 5.3e-05 7.1e-06 2.8e-07 3.3e-09 0.149 0.149 0.149 0.149 0.149 0.149 0.148 0.148 0.148 0.148 0.147 0.145 0.14 0.135 0.128 0.12 0.112 0.0946 0.0712 0.0421 0.0241 0.0137 0.00778 0.00445 0.0015 0.00013 1.6e-05 5.4e-07 3.7e-08 6e-10 3.8e-12 0.609 0.607 0.599 0.586 0.568 0.52 0.461 0.395 0.327 0.264 0.207 0.121 0.0709 0.0483 0.0411 0.0401 0.0399 0.0345 0.0194 0.00517 0.00345 0.00322 0.00231 0.00133 0.0004 0.00025 9.1e-05 9.2e-06 8e-06 3.6e-06 5.3e-07 0.417 0.417 0.416 0.416 0.416 0.412 0.403 0.388 0.366 0.337 0.303 0.228 0.156 0.099 0.0596 0.0357 0.023 0.0153 0.0147 0.00874 0.00321 0.00133 0.00106 0.00104 0.00072 9.3e-05 5.5e-05 3.2e-05 1.1e-05 1.4e-06 7.5e-08 0.442 0.442 0.442 0.441 0.44 0.436 0.425 0.405 0.378 0.343 0.303 0.218 0.143 0.0865 0.0502 0.0297 0.0199 0.0151 0.0143 0.0075 0.00255 0.00118 0.00105 0.00101 0.00062 7.7e-05 5.7e-05 2.7e-05 8.4e-06 9e-07 3.2e-08 2.15 2.05 1.78 1.42 1.03 0.441 0.162 0.0799 0.0686 0.0677 0.0616 0.0387 0.0192 0.00873 0.0045 0.00328 0.00311 0.00293 0.00178 0.000442 0.000249 0.000237 0.000173 0.0001 3e-05 1.8e-05 6.6e-06 6.6e-07 5.7e-07 2.6e-07 3.8e-08 +Z 60 19 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 2.0 43597.0 7093.3 6727.4 6200.7 1551.8000000000002 1392.8 1287.1 1007.3000000000001 984.3199999999999 313.58 252.76 229.72 128.68 124.62 44.8 28.119999999999997 24.88 24.88 4.96 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0132 0.0131 0.0131 0.013 0.0129 0.0128 0.0127 0.0126 0.012 0.011 0.0098 0.0071 0.0048 0.002 0.00039 0.047 0.047 0.047 0.047 0.047 0.047 0.047 0.0469 0.0469 0.0468 0.0468 0.0466 0.0464 0.0462 0.046 0.0457 0.0454 0.0446 0.0434 0.0407 0.0376 0.0341 0.0304 0.0268 0.02 0.0075 0.0025 0.0012 0.001 0.00046 7.2e-05 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0232 0.0232 0.0232 0.023 0.0228 0.0225 0.0221 0.021 0.016 0.011 0.0041 0.0014 0.0002 1.2e-05 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0247 0.0247 0.0245 0.0242 0.0239 0.0233 0.022 0.016 0.011 0.0035 0.0011 0.00013 5.2e-06 0.106 0.106 0.106 0.106 0.106 0.106 0.105 0.105 0.104 0.103 0.102 0.101 0.0982 0.0954 0.0924 0.0891 0.0856 0.0779 0.0657 0.0459 0.0297 0.0186 0.0121 0.00897 0.0077 0.0055 0.0019 0.00026 0.00023 0.00011 1.6e-05 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0627 0.0627 0.0627 0.0626 0.0625 0.0623 0.0621 0.0614 0.0598 0.0552 0.0482 0.0398 0.031 0.0229 0.011 0.0024 0.0022 0.0011 0.0004 5.5e-05 3e-06 0.0654 0.0654 0.0654 0.0654 0.0654 0.0654 0.0654 0.0654 0.0654 0.0654 0.0654 0.0653 0.0653 0.0652 0.0651 0.0649 0.0646 0.0638 0.0619 0.0564 0.0484 0.039 0.0296 0.0213 0.0098 0.0025 0.0023 0.001 0.00032 3.6e-05 1.3e-06 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0431 0.0429 0.0424 0.0412 0.0391 0.0361 0.0324 0.024 0.0089 0.0028 0.0003 4.3e-05 2e-06 3e-08 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0436 0.0435 0.0429 0.0417 0.0394 0.0363 0.0325 0.024 0.0086 0.0026 0.00027 3.7e-05 1.5e-06 1.8e-08 0.228 0.228 0.228 0.227 0.226 0.223 0.219 0.213 0.207 0.2 0.192 0.175 0.156 0.136 0.116 0.0982 0.0816 0.0548 0.0311 0.0207 0.0202 0.0168 0.0112 0.00651 0.0023 0.0016 0.0006 6.1e-05 5.2e-05 2.5e-05 3.7e-06 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.145 0.145 0.143 0.14 0.136 0.131 0.125 0.117 0.0987 0.0693 0.0309 0.0131 0.0085 0.00814 0.0078 0.0051 0.00071 0.00042 0.00025 9e-05 1.2e-05 6.5e-07 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.151 0.151 0.15 0.148 0.145 0.141 0.134 0.127 0.118 0.0977 0.0662 0.0277 0.0119 0.00867 0.00852 0.00786 0.0047 0.00063 0.00047 0.00023 7.3e-05 8.1e-06 3e-07 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.12 0.119 0.118 0.116 0.112 0.103 0.0847 0.0505 0.0249 0.0111 0.00529 0.00344 0.0031 0.0018 0.00062 6.8e-05 9.7e-06 4.3e-07 6.4e-09 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.122 0.122 0.121 0.119 0.117 0.113 0.104 0.0847 0.0497 0.0241 0.0106 0.00507 0.00339 0.0031 0.0017 0.00058 6.1e-05 8.3e-06 3.3e-07 3.9e-09 0.141 0.141 0.141 0.141 0.141 0.141 0.141 0.141 0.141 0.14 0.14 0.138 0.135 0.13 0.124 0.118 0.11 0.0951 0.0733 0.0448 0.0264 0.0153 0.00889 0.00518 0.0018 0.00016 2.1e-05 7.1e-07 4.9e-08 8.2e-10 4.8e-12 0.597 0.595 0.587 0.575 0.558 0.513 0.457 0.393 0.329 0.267 0.211 0.125 0.0738 0.0491 0.0405 0.039 0.0389 0.0346 0.0205 0.00558 0.00337 0.00322 0.00242 0.00146 0.00044 0.00025 0.0001 9.5e-06 8e-06 3.8e-06 5.7e-07 0.407 0.407 0.407 0.407 0.406 0.403 0.395 0.382 0.361 0.334 0.303 0.231 0.161 0.104 0.0641 0.0387 0.0245 0.0152 0.0143 0.00919 0.00357 0.00143 0.00104 0.00103 0.00075 0.0001 5.5e-05 3.3e-05 1.2e-05 1.6e-06 8.6e-08 0.434 0.434 0.434 0.434 0.433 0.428 0.418 0.4 0.374 0.342 0.303 0.222 0.148 0.091 0.0535 0.0317 0.0206 0.0146 0.014 0.00788 0.00279 0.00121 0.00102 0.000996 0.00065 8.3e-05 5.6e-05 2.9e-05 9.1e-06 9.9e-07 3.7e-08 2.13 2.03 1.77 1.42 1.04 0.452 0.167 0.0799 0.0664 0.0657 0.0606 0.0394 0.0201 0.00929 0.00467 0.00321 0.00295 0.00284 0.00182 0.000474 0.000239 0.000229 0.000176 0.000107 3.2e-05 1.8e-05 7.1e-06 6.7e-07 5.6e-07 2.7e-07 4e-08 +Z 61 19 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 5.0 2.0 45219.0 7394.099999999999 7019.2 6451.9 1625.1 1461.6 1346.9 1059.6 1034.6000000000001 328.07000000000005 265.01 239.87 135.05 130.59 46.27 28.96 25.46 5.03 5.03 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0129 0.0128 0.0128 0.0127 0.0126 0.0125 0.0123 0.012 0.011 0.0097 0.0071 0.0049 0.0021 0.00042 0.0461 0.0461 0.0461 0.0461 0.0461 0.046 0.046 0.046 0.0459 0.0459 0.0458 0.0457 0.0455 0.0453 0.0451 0.0448 0.0445 0.0438 0.0426 0.0401 0.0371 0.0338 0.0303 0.0268 0.02 0.0078 0.0027 0.0011 0.001 0.00048 7.8e-05 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0228 0.0227 0.0227 0.0226 0.0224 0.0221 0.0217 0.021 0.016 0.011 0.0043 0.0015 0.00022 1.3e-05 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0242 0.0241 0.0238 0.0235 0.023 0.022 0.016 0.011 0.0037 0.0012 0.00014 5.8e-06 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.102 0.102 0.101 0.1 0.0985 0.0963 0.0937 0.0909 0.0878 0.0844 0.0772 0.0655 0.0465 0.0306 0.0193 0.0125 0.00914 0.0076 0.0057 0.0021 0.00026 0.00023 0.00011 1.8e-05 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0612 0.0612 0.0611 0.0609 0.0607 0.0601 0.0587 0.0544 0.048 0.04 0.0316 0.0238 0.012 0.0025 0.0021 0.0012 0.00043 6.1e-05 3.4e-06 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.0639 0.0639 0.0638 0.0637 0.0635 0.0632 0.0625 0.0608 0.0558 0.0483 0.0394 0.0303 0.0221 0.01 0.0025 0.0023 0.0011 0.00035 4e-05 1.5e-06 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.0421 0.042 0.0415 0.0405 0.0386 0.0358 0.0324 0.025 0.0093 0.003 0.00034 4.9e-05 2.3e-06 3.5e-08 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0425 0.042 0.0409 0.0389 0.0361 0.0325 0.024 0.0091 0.0029 0.0003 4.2e-05 1.8e-06 2.1e-08 0.223 0.223 0.222 0.221 0.22 0.218 0.214 0.209 0.203 0.196 0.189 0.172 0.154 0.136 0.117 0.0995 0.0833 0.0567 0.0322 0.0204 0.0199 0.0171 0.0119 0.0071 0.0024 0.0016 0.00066 6.4e-05 5.2e-05 2.6e-05 4e-06 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.141 0.14 0.137 0.134 0.129 0.123 0.116 0.0989 0.071 0.0329 0.014 0.00857 0.00799 0.00778 0.0054 0.00079 0.00042 0.00026 9.8e-05 1.4e-05 7.5e-07 0.148 0.148 0.148 0.148 0.148 0.148 0.148 0.148 0.148 0.147 0.147 0.145 0.142 0.138 0.132 0.125 0.117 0.0982 0.068 0.0296 0.0126 0.00863 0.00839 0.00791 0.005 0.00068 0.00047 0.00025 8e-05 9e-06 3.4e-07 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.117 0.117 0.115 0.113 0.11 0.102 0.0851 0.0524 0.0268 0.0123 0.00582 0.00358 0.003 0.0019 0.00068 7.8e-05 1.1e-05 5.1e-07 7.7e-09 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.119 0.118 0.116 0.114 0.111 0.103 0.0851 0.0516 0.026 0.0117 0.00556 0.0035 0.003 0.0018 0.00064 6.9e-05 9.6e-06 3.9e-07 4.7e-09 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.134 0.132 0.13 0.126 0.121 0.115 0.109 0.095 0.0747 0.047 0.0284 0.0169 0.00998 0.00592 0.0021 0.0002 2.6e-05 9.2e-07 6.4e-08 1.1e-09 6.1e-12 0.586 0.584 0.576 0.565 0.549 0.506 0.453 0.392 0.33 0.27 0.216 0.13 0.0767 0.0502 0.0402 0.0379 0.0378 0.0346 0.0215 0.00605 0.0033 0.00318 0.00251 0.00158 0.00048 0.00025 0.00011 1e-05 7.9e-06 4e-06 6.2e-07 0.399 0.399 0.399 0.399 0.398 0.395 0.388 0.375 0.357 0.332 0.302 0.233 0.166 0.11 0.0684 0.0417 0.0262 0.0152 0.014 0.00956 0.00394 0.00154 0.00103 0.00101 0.00078 0.00012 5.4e-05 3.5e-05 1.3e-05 1.8e-06 9.8e-08 0.427 0.427 0.427 0.427 0.426 0.422 0.412 0.396 0.371 0.34 0.304 0.225 0.152 0.0953 0.0567 0.0337 0.0215 0.0143 0.0137 0.0082 0.00305 0.00126 0.00099 0.000975 0.00068 8.9e-05 5.5e-05 3e-05 9.7e-06 1.1e-06 4.1e-08 2.11 2.01 1.76 1.41 1.05 0.462 0.173 0.0802 0.0644 0.0637 0.0596 0.0399 0.021 0.00986 0.00488 0.00318 0.00282 0.00273 0.00186 0.000508 0.000231 0.000221 0.000178 0.000113 3.4e-05 1.7e-05 7.5e-06 6.9e-07 5.4e-07 2.8e-07 4.2e-08 +Z 62 19 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 2.0 46876.0 7702.299999999999 7318.200000000001 6707.900000000001 1700.1 1531.9 1407.7 1112.9 1085.8 342.77 277.43 250.05999999999997 141.4 136.52 47.74 29.790000000000003 26.020000000000003 5.090000000000001 5.090000000000001 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0127 0.0126 0.0126 0.0126 0.0125 0.0125 0.0124 0.0122 0.0121 0.012 0.011 0.0097 0.0071 0.0049 0.0021 0.00044 0.0452 0.0452 0.0452 0.0452 0.0452 0.0451 0.0451 0.0451 0.045 0.045 0.0449 0.0448 0.0446 0.0444 0.0442 0.044 0.0437 0.043 0.0419 0.0395 0.0367 0.0336 0.0302 0.0268 0.02 0.0081 0.0028 0.0011 0.001 0.0005 8.4e-05 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0223 0.0222 0.0221 0.022 0.0217 0.0214 0.02 0.016 0.011 0.0045 0.0016 0.00025 1.5e-05 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0238 0.0238 0.0236 0.0234 0.0231 0.0226 0.021 0.016 0.011 0.0038 0.0012 0.00016 6.5e-06 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.0996 0.099 0.0983 0.0965 0.0944 0.092 0.0894 0.0864 0.0833 0.0764 0.0653 0.047 0.0313 0.02 0.013 0.00935 0.0075 0.0058 0.0023 0.00027 0.00023 0.00012 1.9e-05 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0599 0.0598 0.0597 0.0596 0.0594 0.0589 0.0575 0.0537 0.0477 0.0402 0.0322 0.0245 0.013 0.0025 0.0021 0.0012 0.00046 6.7e-05 3.8e-06 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0626 0.0625 0.0625 0.0623 0.0622 0.062 0.0613 0.0597 0.0551 0.0481 0.0397 0.0309 0.0229 0.011 0.0025 0.0023 0.0011 0.00038 4.4e-05 1.7e-06 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0412 0.0411 0.0407 0.0397 0.038 0.0355 0.0323 0.025 0.0098 0.0033 0.00038 5.6e-05 2.6e-06 4.1e-08 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0417 0.0416 0.0412 0.0402 0.0384 0.0358 0.0324 0.025 0.0095 0.0031 0.00034 4.8e-05 2e-06 2.5e-08 0.217 0.217 0.217 0.216 0.215 0.213 0.209 0.204 0.199 0.193 0.186 0.17 0.153 0.135 0.118 0.101 0.0848 0.0584 0.0333 0.0202 0.0196 0.0173 0.0125 0.0077 0.0026 0.0016 0.00072 6.9e-05 5.2e-05 2.7e-05 4.4e-06 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.138 0.138 0.137 0.134 0.131 0.127 0.121 0.115 0.099 0.0725 0.0348 0.015 0.00871 0.00785 0.00773 0.0056 0.00088 0.00042 0.00028 0.00011 1.5e-05 8.6e-07 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.144 0.144 0.144 0.142 0.139 0.136 0.13 0.124 0.116 0.0986 0.0696 0.0313 0.0134 0.00864 0.00825 0.00792 0.0052 0.00073 0.00046 0.00026 8.7e-05 1e-05 3.8e-07 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.114 0.114 0.112 0.111 0.108 0.101 0.0852 0.0541 0.0287 0.0135 0.00642 0.00377 0.003 0.002 0.00074 8.8e-05 1.3e-05 6e-07 9.2e-09 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.115 0.114 0.112 0.109 0.102 0.0853 0.0533 0.0278 0.0129 0.0061 0.00365 0.003 0.0019 0.0007 7.8e-05 1.1e-05 4.5e-07 5.5e-09 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.128 0.127 0.125 0.122 0.118 0.113 0.107 0.0946 0.0756 0.0489 0.0302 0.0184 0.0111 0.00666 0.0025 0.00024 3.2e-05 1.2e-06 8.2e-08 1.4e-09 7.8e-12 0.575 0.573 0.566 0.555 0.54 0.5 0.449 0.391 0.331 0.273 0.219 0.134 0.0797 0.0514 0.04 0.037 0.0368 0.0343 0.0224 0.00655 0.00325 0.00313 0.00257 0.00169 0.00053 0.00025 0.00012 1.1e-05 7.8e-06 4.2e-06 6.7e-07 0.391 0.391 0.391 0.391 0.39 0.387 0.381 0.369 0.352 0.329 0.301 0.236 0.17 0.114 0.0726 0.0448 0.0281 0.0153 0.0136 0.00987 0.00431 0.00167 0.00103 0.000985 0.00081 0.00013 5.3e-05 3.6e-05 1.4e-05 2e-06 1.1e-07 0.42 0.42 0.42 0.42 0.419 0.416 0.407 0.391 0.368 0.338 0.304 0.228 0.156 0.0993 0.0599 0.0357 0.0225 0.014 0.0133 0.00846 0.0033 0.00132 0.000965 0.00095 0.0007 9.7e-05 5.4e-05 3.1e-05 1e-05 1.2e-06 4.6e-08 2.09 2.0 1.75 1.41 1.05 0.472 0.178 0.0808 0.0626 0.0618 0.0585 0.0403 0.0218 0.0104 0.00512 0.00318 0.00271 0.00263 0.00188 0.000545 0.000226 0.000213 0.000179 0.000119 3.7e-05 1.7e-05 8e-06 7.2e-07 5.2e-07 2.8e-07 4.5e-08 +Z 63 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 1.0 2.0 48568.0 8018.1 7624.8 6968.8 1776.9 1604.0 1469.6 1167.2 1137.8 357.70000000000005 290.04999999999995 260.3 147.76000000000002 142.44 9.77 9.08 49.21 30.61 26.56 5.16 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0123 0.0122 0.0121 0.012 0.0119 0.0119 0.011 0.0096 0.0071 0.005 0.0022 0.00046 0.0443 0.0443 0.0443 0.0443 0.0443 0.0442 0.0442 0.0442 0.0441 0.0441 0.0441 0.0439 0.0438 0.0436 0.0434 0.0431 0.0429 0.0423 0.0412 0.039 0.0363 0.0333 0.0301 0.0268 0.02 0.0085 0.003 0.0011 0.001 0.00052 9e-05 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0218 0.0218 0.0218 0.0218 0.0218 0.0217 0.0215 0.0213 0.021 0.02 0.016 0.011 0.00461 0.0017 0.00027 1.7e-05 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0233 0.0232 0.023 0.0227 0.0223 0.021 0.016 0.011 0.004 0.0013 0.00017 7.2e-06 0.0992 0.0992 0.0992 0.0991 0.099 0.0988 0.0985 0.098 0.0975 0.0969 0.0962 0.0946 0.0927 0.0904 0.0879 0.0851 0.0821 0.0756 0.0651 0.0474 0.0321 0.0208 0.0135 0.00959 0.0074 0.006 0.0024 0.00028 0.00022 0.00012 2.1e-05 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0586 0.0585 0.0585 0.0584 0.0583 0.0581 0.0576 0.0564 0.0529 0.0473 0.0403 0.0326 0.0252 0.013 0.0026 0.0021 0.0013 0.0005 7.4e-05 4.3e-06 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0613 0.0612 0.0612 0.0611 0.0609 0.0607 0.0601 0.0587 0.0544 0.0479 0.0399 0.0315 0.0236 0.012 0.0026 0.0023 0.0012 0.0004 4.9e-05 1.9e-06 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0402 0.0402 0.0398 0.039 0.0374 0.0351 0.0322 0.025 0.01 0.0035 0.00042 6.4e-05 3.1e-06 4.9e-08 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0408 0.0407 0.0403 0.0394 0.0378 0.0354 0.0324 0.025 0.01 0.0033 0.00038 5.5e-05 2.4e-06 2.9e-08 0.212 0.212 0.212 0.211 0.21 0.208 0.205 0.2 0.195 0.189 0.183 0.168 0.152 0.135 0.118 0.101 0.0861 0.0601 0.0346 0.0201 0.0192 0.0174 0.013 0.00829 0.0029 0.0016 0.00078 7.4e-05 5.1e-05 2.9e-05 4.8e-06 0.135 0.135 0.135 0.135 0.135 0.135 0.135 0.135 0.135 0.135 0.135 0.133 0.131 0.129 0.125 0.12 0.114 0.0989 0.0738 0.0368 0.0161 0.00893 0.00772 0.00764 0.0059 0.00098 0.00041 0.00029 0.00011 1.7e-05 9.8e-07 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.141 0.141 0.141 0.14 0.139 0.137 0.133 0.128 0.123 0.115 0.0988 0.0711 0.0331 0.0142 0.0087 0.00811 0.0079 0.0055 0.0008 0.00046 0.00027 9.4e-05 1.1e-05 4.3e-07 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.112 0.111 0.11 0.108 0.106 0.0996 0.0852 0.0557 0.0305 0.0148 0.00708 0.004 0.0029 0.0021 0.00081 9.9e-05 1.5e-05 7e-07 1.1e-08 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.113 0.113 0.112 0.111 0.11 0.107 0.1 0.0854 0.0549 0.0296 0.0141 0.0067 0.00385 0.003 0.002 0.00076 8.8e-05 1.3e-05 5.3e-07 6.5e-09 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.123 0.121 0.118 0.115 0.11 0.105 0.0939 0.0762 0.0505 0.0319 0.0198 0.0121 0.00742 0.0028 0.00029 3.9e-05 1.5e-06 1.1e-07 1.8e-09 9.9e-12 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.128 0.125 0.122 0.117 0.112 0.106 0.093 0.0744 0.0484 0.0303 0.0186 0.0114 0.00693 0.0026 0.00026 3.5e-05 1.3e-06 8.9e-08 1.4e-09 6.6e-12 0.564 0.562 0.556 0.546 0.531 0.493 0.444 0.389 0.331 0.275 0.223 0.138 0.0829 0.0529 0.04 0.0362 0.0358 0.034 0.0232 0.00712 0.00324 0.00308 0.00263 0.0018 0.00059 0.00025 0.00013 1.2e-05 7.8e-06 4.4e-06 7.3e-07 0.384 0.384 0.384 0.383 0.383 0.381 0.375 0.364 0.348 0.326 0.299 0.237 0.174 0.119 0.0767 0.0478 0.03 0.0155 0.0131 0.0101 0.00465 0.00182 0.00104 0.000955 0.00082 0.00015 5.2e-05 3.7e-05 1.5e-05 2.2e-06 1.3e-07 0.413 0.413 0.413 0.413 0.412 0.409 0.4 0.386 0.364 0.336 0.303 0.23 0.16 0.104 0.0635 0.0381 0.0238 0.0139 0.0129 0.00875 0.00358 0.00141 0.000952 0.00093 0.00072 0.00011 5.3e-05 3.2e-05 1.1e-05 1.3e-06 5.1e-08 2.07 1.98 1.74 1.41 1.06 0.482 0.184 0.0817 0.061 0.0599 0.0573 0.0406 0.0226 0.011 0.00541 0.00322 0.00262 0.00252 0.00189 0.000584 0.000223 0.000204 0.000178 0.000123 4e-05 1.7e-05 8.4e-06 7.6e-07 5.1e-07 2.9e-07 4.8e-08 +Z 64 21 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 1.0 1.0 2.0 50303.0 8349.8 7946.999999999999 7242.700000000001 1864.6 1686.9 1541.8000000000002 1231.6 1199.8 381.39 311.29999999999995 278.86 162.16 156.3 17.03 16.2 54.660000000000004 34.83 30.18 5.19 4.8500000000000005 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0122 0.0121 0.0121 0.012 0.0119 0.0118 0.0117 0.011 0.011 0.0095 0.0071 0.005 0.0023 0.00049 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0433 0.0433 0.0433 0.0432 0.0431 0.0429 0.0428 0.0426 0.0423 0.0421 0.0415 0.0405 0.0384 0.0358 0.033 0.0299 0.0268 0.021 0.0088 0.0032 0.0011 0.001 0.00054 9.6e-05 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0214 0.0213 0.0211 0.0209 0.0206 0.02 0.016 0.012 0.0048 0.0018 0.00029 1.9e-05 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.0229 0.0228 0.0226 0.0224 0.022 0.021 0.016 0.011 0.0042 0.0014 0.00018 8e-06 0.0971 0.0971 0.0971 0.097 0.0969 0.0967 0.0964 0.096 0.0955 0.095 0.0943 0.0928 0.0909 0.0888 0.0864 0.0838 0.081 0.0748 0.0648 0.0478 0.0328 0.0215 0.0141 0.00986 0.0073 0.0061 0.0026 0.0003 0.00022 0.00013 2.2e-05 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0572 0.0571 0.057 0.0569 0.0565 0.0554 0.0521 0.047 0.0404 0.0331 0.0259 0.014 0.0028 0.002 0.0013 0.00053 8.2e-05 4.9e-06 0.0601 0.0601 0.0601 0.0601 0.0601 0.0601 0.0601 0.0601 0.0601 0.0601 0.0601 0.06 0.06 0.0599 0.0598 0.0597 0.0595 0.059 0.0577 0.0537 0.0477 0.0401 0.032 0.0243 0.012 0.0026 0.0023 0.0012 0.00043 5.3e-05 2.2e-06 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0394 0.0393 0.039 0.0383 0.0369 0.0348 0.032 0.025 0.011 0.0038 0.00047 7.2e-05 3.5e-06 5.7e-08 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0399 0.0395 0.0387 0.0373 0.0351 0.0322 0.025 0.01 0.0036 0.00042 6.2e-05 2.7e-06 3.4e-08 0.207 0.207 0.206 0.206 0.205 0.203 0.2 0.196 0.191 0.185 0.179 0.166 0.15 0.134 0.118 0.102 0.0875 0.0619 0.036 0.0202 0.0189 0.0176 0.0136 0.00891 0.0031 0.0016 0.00085 8.1e-05 5.1e-05 3e-05 5.2e-06 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.131 0.131 0.13 0.128 0.126 0.122 0.118 0.112 0.0987 0.0751 0.0388 0.0174 0.00928 0.00765 0.00758 0.0061 0.0011 0.00041 0.0003 0.00012 1.9e-05 1.1e-06 0.138 0.138 0.138 0.138 0.138 0.138 0.138 0.138 0.138 0.137 0.137 0.136 0.134 0.13 0.126 0.121 0.114 0.0989 0.0726 0.0351 0.0152 0.00888 0.00801 0.00789 0.0057 0.00089 0.00046 0.00029 0.0001 1.2e-05 4.9e-07 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.109 0.108 0.108 0.108 0.108 0.108 0.107 0.105 0.104 0.098 0.0851 0.0574 0.0326 0.0164 0.00791 0.00433 0.0029 0.0022 0.00088 0.00011 1.7e-05 8.3e-07 1.3e-08 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.109 0.108 0.107 0.105 0.099 0.0854 0.0567 0.0316 0.0156 0.00745 0.00413 0.0029 0.0021 0.00083 0.0001 1.5e-05 6.2e-07 7.7e-09 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.112 0.11 0.108 0.105 0.102 0.0934 0.0785 0.0544 0.0356 0.0226 0.0141 0.0088 0.0034 0.00037 5.1e-05 2e-06 1.4e-07 2.5e-09 1.4e-11 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.115 0.114 0.113 0.11 0.107 0.103 0.0937 0.078 0.0533 0.0345 0.0218 0.0135 0.00839 0.0032 0.00034 4.7e-05 1.8e-06 1.2e-07 2e-09 9.1e-12 0.538 0.536 0.531 0.522 0.509 0.475 0.432 0.382 0.33 0.278 0.229 0.146 0.09 0.0575 0.0421 0.0367 0.0357 0.0347 0.0252 0.00828 0.00345 0.00316 0.00281 0.002 0.00069 0.00026 0.00014 1.3e-05 8e-06 4.8e-06 8.2e-07 0.366 0.366 0.366 0.366 0.366 0.364 0.359 0.35 0.336 0.318 0.295 0.24 0.181 0.128 0.0855 0.0549 0.0349 0.0171 0.0133 0.0109 0.00538 0.00215 0.00113 0.000985 0.00088 0.00017 5.5e-05 4e-05 1.7e-05 2.6e-06 1.5e-07 0.391 0.391 0.391 0.391 0.39 0.388 0.381 0.37 0.352 0.329 0.301 0.236 0.17 0.115 0.073 0.045 0.0282 0.0152 0.0134 0.00977 0.00426 0.00166 0.00102 0.00098 0.0008 0.00013 5.6e-05 3.6e-05 1.3e-05 1.6e-06 6.2e-08 0.468 0.468 0.468 0.467 0.467 0.463 0.452 0.428 0.393 0.351 0.305 0.216 0.144 0.0924 0.0574 0.0348 0.0208 0.00777 0.00337 0.00305 0.00221 0.00122 0.000586 0.000286 0.00015 0.00011 4.7e-05 6.1e-06 9.3e-07 4.4e-08 6.9e-10 1.93 1.85 1.66 1.37 1.06 0.53 0.221 0.0963 0.0633 0.0595 0.0587 0.0461 0.0281 0.0148 0.00744 0.00416 0.00304 0.0028 0.00227 0.00077 0.000269 0.000231 0.00021 0.000152 5.2e-05 1.9e-05 1e-05 9.7e-07 5.8e-07 3.5e-07 5.9e-08 +Z 65 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 3.0 2.0 52060.0 8673.1 8260.9 7505.3 1935.8000000000002 1753.4 1596.8 1279.0 1244.6 388.39 316.0 281.03999999999996 160.59 154.29 10.39 9.53 52.169999999999995 32.24 27.59 5.29 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.0119 0.0119 0.0119 0.0119 0.0118 0.0118 0.0117 0.0116 0.0115 0.011 0.01 0.0094 0.0071 0.0051 0.0023 0.00051 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0425 0.0425 0.0425 0.0424 0.0424 0.0423 0.0421 0.042 0.0418 0.0416 0.0413 0.0408 0.0398 0.0378 0.0354 0.0327 0.0297 0.0267 0.021 0.0091 0.0034 0.0011 0.001 0.00055 0.0001 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.021 0.0209 0.0209 0.0207 0.0205 0.0203 0.019 0.016 0.012 0.005 0.0019 0.00032 2.1e-05 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0226 0.0225 0.0224 0.0223 0.022 0.0217 0.021 0.016 0.011 0.0043 0.0015 0.0002 8.9e-06 0.095 0.095 0.095 0.095 0.0949 0.0947 0.0944 0.094 0.0936 0.093 0.0924 0.091 0.0893 0.0873 0.085 0.0825 0.0799 0.074 0.0644 0.0481 0.0335 0.0222 0.0146 0.0102 0.0072 0.0061 0.0028 0.00032 0.00022 0.00013 2.4e-05 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.0561 0.056 0.056 0.0559 0.0558 0.0557 0.0553 0.0543 0.0513 0.0466 0.0404 0.0334 0.0265 0.015 0.0029 0.002 0.0014 0.00057 9e-05 5.5e-06 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0588 0.0588 0.0587 0.0586 0.0584 0.0579 0.0567 0.053 0.0474 0.0402 0.0324 0.0249 0.013 0.0027 0.0022 0.0013 0.00046 5.9e-05 2.4e-06 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0386 0.0385 0.0385 0.0382 0.0376 0.0363 0.0344 0.0319 0.026 0.011 0.0041 0.00052 8.1e-05 4.1e-06 6.6e-08 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0391 0.0388 0.0381 0.0367 0.0347 0.0321 0.026 0.011 0.0038 0.00046 7e-05 3.1e-06 4e-08 0.203 0.203 0.203 0.202 0.201 0.199 0.196 0.192 0.188 0.183 0.177 0.164 0.149 0.134 0.118 0.103 0.0885 0.0632 0.037 0.0202 0.0185 0.0175 0.0139 0.00943 0.0034 0.0016 0.0009 8.9e-05 5e-05 3.1e-05 5.6e-06 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.129 0.128 0.128 0.126 0.124 0.12 0.116 0.111 0.0984 0.0759 0.0404 0.0185 0.00959 0.00753 0.00741 0.0062 0.0012 0.00041 0.00031 0.00013 2.1e-05 1.3e-06 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.135 0.135 0.135 0.135 0.134 0.132 0.129 0.125 0.12 0.113 0.0988 0.0735 0.0365 0.016 0.009 0.00785 0.00777 0.0059 0.00097 0.00045 0.0003 0.00011 1.4e-05 5.5e-07 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.106 0.106 0.105 0.104 0.102 0.0968 0.0847 0.0583 0.0339 0.0175 0.00856 0.0046 0.0029 0.0022 0.00094 0.00012 2e-05 9.5e-07 1.5e-08 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.107 0.107 0.105 0.103 0.0978 0.085 0.0576 0.0329 0.0166 0.00805 0.00437 0.0029 0.0021 0.00088 0.00011 1.6e-05 7.2e-07 9e-09 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.115 0.114 0.112 0.109 0.106 0.101 0.092 0.0766 0.0529 0.0348 0.0223 0.0141 0.00892 0.0036 0.0004 5.7e-05 2.2e-06 1.7e-07 3e-09 1.6e-11 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.12 0.119 0.118 0.115 0.111 0.107 0.102 0.0918 0.0754 0.0513 0.0334 0.0213 0.0134 0.00842 0.0033 0.00037 5.2e-05 2e-06 1.4e-07 2.3e-09 1e-11 0.544 0.542 0.537 0.528 0.515 0.48 0.436 0.385 0.332 0.279 0.229 0.146 0.0893 0.0564 0.0407 0.0351 0.034 0.0331 0.0245 0.00835 0.00331 0.00294 0.00268 0.00199 0.00072 0.00025 0.00014 1.4e-05 7.5e-06 4.7e-06 8.4e-07 0.37 0.37 0.37 0.37 0.37 0.368 0.363 0.354 0.339 0.32 0.296 0.24 0.181 0.127 0.0845 0.054 0.0342 0.0163 0.0123 0.0103 0.00531 0.00217 0.00109 0.000902 0.00083 0.00018 5.1e-05 3.9e-05 1.7e-05 2.6e-06 1.6e-07 0.4 0.4 0.4 0.4 0.399 0.396 0.389 0.376 0.357 0.332 0.302 0.234 0.168 0.112 0.0704 0.043 0.0267 0.014 0.0122 0.00915 0.00414 0.00162 0.000947 0.000883 0.00075 0.00013 5.1e-05 3.4e-05 1.3e-05 1.6e-06 6.4e-08 2.03 1.94 1.72 1.41 1.07 0.502 0.197 0.0843 0.0584 0.0564 0.0548 0.041 0.024 0.0123 0.00605 0.00339 0.00251 0.00232 0.00189 0.000664 0.000227 0.000187 0.000174 0.000131 4.8e-05 1.6e-05 9.2e-06 8.9e-07 4.7e-07 3e-07 5.3e-08 +Z 66 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 4.0 2.0 53861.0 9012.5 8590.699999999999 7781.0 2018.2 1830.9 1662.1 1336.6000000000001 1299.5 404.2 329.38 291.56 167.07000000000002 160.24 10.62 9.66 53.67 33.059999999999995 28.09 5.35 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0116 0.0116 0.0115 0.0114 0.0113 0.011 0.01 0.0093 0.0071 0.0051 0.0024 0.00054 0.0418 0.0418 0.0418 0.0418 0.0418 0.0417 0.0417 0.0417 0.0417 0.0416 0.0416 0.0415 0.0413 0.0412 0.041 0.0408 0.0406 0.0401 0.0392 0.0373 0.035 0.0324 0.0296 0.0267 0.021 0.0094 0.0036 0.0011 0.001 0.00057 0.00011 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0206 0.0205 0.0205 0.0203 0.0202 0.0199 0.019 0.016 0.012 0.0052 0.002 0.00035 2.4e-05 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0222 0.0221 0.0219 0.0217 0.0213 0.02 0.016 0.011 0.0045 0.0016 0.00022 9.8e-06 0.0931 0.0931 0.093 0.093 0.0929 0.0927 0.0925 0.0921 0.0917 0.0912 0.0906 0.0893 0.0876 0.0857 0.0836 0.0813 0.0788 0.0732 0.0641 0.0483 0.0341 0.0229 0.0151 0.0105 0.0072 0.0062 0.003 0.00034 0.00022 0.00014 2.6e-05 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0548 0.0548 0.0547 0.0546 0.0545 0.0542 0.0533 0.0506 0.0461 0.0403 0.0337 0.027 0.015 0.0031 0.002 0.0014 0.0006 9.9e-05 6.2e-06 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0577 0.0576 0.0575 0.0574 0.0573 0.0568 0.0557 0.0523 0.047 0.0403 0.0328 0.0255 0.014 0.0028 0.0022 0.0013 0.00049 6.4e-05 2.7e-06 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0378 0.0377 0.0377 0.0375 0.0369 0.0357 0.034 0.0317 0.026 0.012 0.0043 0.00057 9.2e-05 4.7e-06 7.7e-08 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0383 0.0383 0.0383 0.038 0.0374 0.0362 0.0343 0.0319 0.026 0.011 0.0041 0.00051 7.8e-05 3.6e-06 4.6e-08 0.199 0.198 0.198 0.198 0.197 0.195 0.192 0.189 0.184 0.18 0.174 0.162 0.148 0.133 0.118 0.104 0.0894 0.0647 0.0383 0.0203 0.0181 0.0174 0.0143 0.00996 0.0037 0.0016 0.00096 9.9e-05 5e-05 3.2e-05 6e-06 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.125 0.123 0.121 0.118 0.114 0.11 0.098 0.0767 0.0421 0.0197 0.01 0.00749 0.00728 0.0063 0.0014 0.00041 0.00032 0.00014 2.3e-05 1.4e-06 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.132 0.132 0.131 0.129 0.126 0.123 0.118 0.112 0.0986 0.0745 0.0381 0.017 0.00923 0.00774 0.00767 0.0061 0.0011 0.00045 0.00031 0.00012 1.5e-05 6.2e-07 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.102 0.1 0.0954 0.0843 0.0594 0.0355 0.0188 0.00937 0.00496 0.0029 0.0023 0.001 0.00014 2.2e-05 1.1e-06 1.8e-08 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.105 0.104 0.103 0.102 0.0965 0.0847 0.0586 0.0344 0.0179 0.00879 0.00469 0.0029 0.0022 0.00094 0.00012 1.9e-05 8.3e-07 1.1e-08 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.112 0.111 0.109 0.107 0.103 0.0996 0.0909 0.0765 0.0538 0.036 0.0235 0.0151 0.00966 0.0039 0.00046 6.7e-05 2.7e-06 2e-07 3.8e-09 2e-11 0.117 0.117 0.117 0.117 0.117 0.117 0.117 0.117 0.117 0.117 0.117 0.116 0.114 0.112 0.109 0.105 0.101 0.0909 0.0756 0.0524 0.0348 0.0225 0.0144 0.00916 0.0037 0.00043 6.1e-05 2.4e-06 1.7e-07 3e-09 1.3e-11 0.535 0.533 0.528 0.519 0.507 0.474 0.432 0.383 0.332 0.281 0.232 0.15 0.0925 0.0583 0.0412 0.0347 0.0332 0.0326 0.025 0.00899 0.0034 0.00286 0.00269 0.00206 0.00079 0.00024 0.00015 1.5e-05 7.4e-06 4.9e-06 9e-07 0.364 0.364 0.364 0.364 0.364 0.362 0.357 0.349 0.335 0.317 0.295 0.241 0.183 0.131 0.0882 0.0571 0.0364 0.0169 0.0119 0.0103 0.00561 0.00236 0.00113 0.000882 0.00082 0.0002 5.1e-05 3.9e-05 1.8e-05 2.9e-06 1.8e-07 0.394 0.394 0.394 0.394 0.393 0.39 0.384 0.372 0.354 0.33 0.301 0.236 0.171 0.115 0.0737 0.0455 0.0283 0.0142 0.0119 0.00928 0.00441 0.00174 0.000956 0.000859 0.00075 0.00014 5.1e-05 3.5e-05 1.3e-05 1.7e-06 7.1e-08 2.01 1.93 1.71 1.4 1.07 0.511 0.203 0.0859 0.0574 0.0547 0.0536 0.041 0.0246 0.0128 0.0064 0.00351 0.00248 0.00222 0.00188 0.000703 0.000232 0.000179 0.00017 0.000133 5.1e-05 1.5e-05 9.5e-06 9.6e-07 4.6e-07 3e-07 5.6e-08 +Z 67 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 5.0 2.0 55699.0 9360.2 8928.699999999999 8061.7 2102.5 1910.4 1728.5 1395.2 1355.3 420.35 343.05 302.2 173.63 166.23000000000002 10.8 9.73 55.19 33.89 28.580000000000002 5.42 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0114 0.0114 0.0113 0.0112 0.0111 0.011 0.01 0.0092 0.0071 0.0051 0.0025 0.00057 0.041 0.041 0.041 0.041 0.041 0.041 0.0409 0.0409 0.0409 0.0408 0.0408 0.0407 0.0406 0.0404 0.0403 0.0401 0.0399 0.0394 0.0385 0.0367 0.0345 0.032 0.0294 0.0266 0.021 0.0097 0.0038 0.0011 0.001 0.00059 0.00012 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0202 0.0201 0.0201 0.02 0.0198 0.0196 0.019 0.016 0.012 0.0054 0.0022 0.00038 2.6e-05 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0219 0.0218 0.0218 0.0218 0.0217 0.0216 0.0213 0.021 0.02 0.016 0.012 0.0046 0.0017 0.00023 1.1e-05 0.0912 0.0912 0.0911 0.0911 0.091 0.0908 0.0906 0.0903 0.0899 0.0894 0.0889 0.0876 0.086 0.0843 0.0823 0.08 0.0777 0.0724 0.0637 0.0485 0.0347 0.0235 0.0157 0.0108 0.0072 0.0062 0.0032 0.00037 0.00021 0.00014 2.7e-05 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0536 0.0535 0.0534 0.0531 0.0523 0.0498 0.0457 0.0403 0.034 0.0275 0.016 0.0033 0.0019 0.0014 0.00064 0.00011 7e-06 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0565 0.0565 0.0564 0.0562 0.0558 0.0548 0.0517 0.0467 0.0403 0.0332 0.0261 0.014 0.0029 0.0022 0.0014 0.00052 7e-05 3e-06 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.0369 0.0367 0.0362 0.0352 0.0336 0.0314 0.026 0.012 0.0046 0.00063 0.0001 5.3e-06 9e-08 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0375 0.0373 0.0367 0.0357 0.034 0.0317 0.026 0.012 0.0044 0.00056 8.7e-05 4.1e-06 5.3e-08 0.194 0.194 0.194 0.194 0.193 0.191 0.188 0.185 0.181 0.176 0.171 0.16 0.147 0.133 0.118 0.104 0.0903 0.066 0.0395 0.0205 0.0178 0.0173 0.0146 0.0105 0.004 0.0016 0.001 0.00011 4.9e-05 3.4e-05 6.5e-06 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.122 0.121 0.119 0.116 0.113 0.108 0.0974 0.0773 0.0438 0.021 0.0105 0.0075 0.00715 0.0064 0.0015 0.00042 0.00032 0.00015 2.5e-05 1.6e-06 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.129 0.128 0.127 0.124 0.121 0.117 0.111 0.0983 0.0754 0.0397 0.018 0.00952 0.00766 0.00756 0.0062 0.0012 0.00045 0.00032 0.00012 1.7e-05 6.9e-07 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.101 0.101 0.0996 0.0982 0.094 0.0838 0.0603 0.037 0.0201 0.0102 0.00538 0.0029 0.0023 0.0011 0.00015 2.5e-05 1.3e-06 2.1e-08 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.102 0.101 0.0997 0.0952 0.0843 0.0596 0.0359 0.0191 0.00956 0.00505 0.0029 0.0023 0.001 0.00014 2.1e-05 9.6e-07 1.2e-08 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.109 0.108 0.106 0.104 0.101 0.0979 0.0898 0.0762 0.0545 0.0371 0.0246 0.016 0.0104 0.0043 0.00053 7.9e-05 3.3e-06 2.5e-07 4.7e-09 2.5e-11 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.114 0.113 0.113 0.113 0.112 0.111 0.109 0.106 0.103 0.0989 0.09 0.0756 0.0533 0.036 0.0237 0.0153 0.00989 0.0041 0.00049 7.3e-05 2.9e-06 2.1e-07 3.7e-09 1.7e-11 0.526 0.524 0.519 0.511 0.499 0.468 0.428 0.381 0.332 0.282 0.235 0.154 0.0957 0.0603 0.042 0.0345 0.0324 0.0319 0.0254 0.00965 0.00352 0.00279 0.00267 0.00213 0.00086 0.00024 0.00016 1.7e-05 7.3e-06 5e-06 9.6e-07 0.358 0.358 0.358 0.358 0.358 0.356 0.352 0.344 0.331 0.314 0.293 0.242 0.186 0.134 0.0918 0.0602 0.0387 0.0176 0.0115 0.0103 0.00589 0.00256 0.00119 0.000868 0.00082 0.00022 5.2e-05 4e-05 1.9e-05 3.1e-06 2e-07 0.388 0.388 0.388 0.388 0.388 0.385 0.379 0.367 0.35 0.328 0.3 0.237 0.174 0.119 0.0769 0.048 0.0299 0.0145 0.0115 0.00937 0.00466 0.00188 0.000974 0.000838 0.00076 0.00015 5e-05 3.6e-05 1.4e-05 1.9e-06 7.9e-08 1.99 1.91 1.7 1.4 1.07 0.52 0.209 0.0877 0.0566 0.0532 0.0524 0.041 0.0252 0.0134 0.00676 0.00365 0.00248 0.00212 0.00186 0.000741 0.000241 0.000171 0.000166 0.000134 5.5e-05 1.5e-05 9.8e-06 1.1e-06 4.4e-07 3e-07 5.9e-08 +Z 68 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 6.0 2.0 57574.0 9716.199999999999 9274.8 8347.4 2188.9 1991.8000000000002 1796.2 1455.0 1412.0 436.85 357.03999999999996 312.96999999999997 180.25 172.26000000000002 10.94 9.76 56.730000000000004 34.730000000000004 29.06 5.48 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0112 0.0112 0.0111 0.011 0.0109 0.0109 0.01 0.0091 0.007 0.0051 0.0025 0.0006 0.0402 0.0402 0.0402 0.0402 0.0402 0.0402 0.0402 0.0402 0.0401 0.0401 0.04 0.04 0.0398 0.0397 0.0395 0.0394 0.0392 0.0387 0.0379 0.0362 0.0341 0.0317 0.0292 0.0265 0.021 0.01 0.004 0.0011 0.00098 0.0006 0.00012 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0197 0.0197 0.0196 0.0194 0.0192 0.019 0.016 0.012 0.0055 0.0023 0.00041 2.9e-05 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0215 0.0214 0.0214 0.0212 0.021 0.0207 0.02 0.016 0.012 0.0048 0.0017 0.00025 1.2e-05 0.0893 0.0893 0.0893 0.0893 0.0892 0.089 0.0888 0.0885 0.0881 0.0877 0.0872 0.086 0.0845 0.0828 0.0809 0.0788 0.0766 0.0716 0.0633 0.0487 0.0352 0.0242 0.0163 0.0112 0.0072 0.0062 0.0033 0.00041 0.00021 0.00014 2.9e-05 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0525 0.0524 0.0523 0.052 0.0513 0.049 0.0452 0.0401 0.0342 0.028 0.017 0.0035 0.0019 0.0015 0.00067 0.00012 7.8e-06 0.0556 0.0556 0.0556 0.0556 0.0556 0.0556 0.0556 0.0556 0.0556 0.0556 0.0556 0.0555 0.0555 0.0555 0.0554 0.0553 0.0552 0.0548 0.0539 0.051 0.0463 0.0403 0.0334 0.0266 0.015 0.003 0.0022 0.0014 0.00056 7.6e-05 3.3e-06 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.036 0.0355 0.0346 0.0332 0.0312 0.026 0.012 0.0049 0.00069 0.00011 6.1e-06 1e-07 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0368 0.0366 0.0361 0.0351 0.0336 0.0315 0.026 0.012 0.0046 0.00062 9.7e-05 4.6e-06 6.1e-08 0.19 0.19 0.19 0.19 0.189 0.187 0.185 0.181 0.178 0.173 0.169 0.158 0.145 0.132 0.118 0.104 0.0911 0.0673 0.0408 0.0207 0.0175 0.0171 0.0148 0.0109 0.0044 0.0016 0.0011 0.00012 4.9e-05 3.5e-05 7e-06 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.12 0.12 0.12 0.118 0.117 0.114 0.111 0.107 0.0968 0.0779 0.0453 0.0223 0.0111 0.00754 0.00702 0.0065 0.0017 0.00043 0.00033 0.00016 2.8e-05 1.8e-06 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.127 0.127 0.127 0.127 0.126 0.124 0.122 0.119 0.115 0.11 0.098 0.0761 0.0412 0.0191 0.00987 0.0076 0.00745 0.0063 0.0013 0.00045 0.00033 0.00013 1.8e-05 7.7e-07 0.0996 0.0996 0.0996 0.0996 0.0996 0.0996 0.0996 0.0996 0.0996 0.0996 0.0996 0.0995 0.0993 0.099 0.0985 0.0976 0.0964 0.0926 0.0833 0.0611 0.0384 0.0214 0.0111 0.00583 0.0029 0.0023 0.0011 0.00017 2.8e-05 1.5e-06 2.4e-08 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.0993 0.098 0.0938 0.0838 0.0604 0.0373 0.0203 0.0104 0.00546 0.0029 0.0023 0.0011 0.00015 2.4e-05 1.1e-06 1.4e-08 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.106 0.106 0.104 0.102 0.0993 0.0961 0.0886 0.0759 0.0551 0.0381 0.0256 0.0169 0.0111 0.0047 0.0006 9.2e-05 4e-06 3e-07 5.8e-09 3.2e-11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.109 0.108 0.106 0.104 0.101 0.0972 0.0889 0.0754 0.0541 0.037 0.0247 0.0163 0.0106 0.0045 0.00056 8.5e-05 3.5e-06 2.6e-07 4.6e-09 2.1e-11 0.517 0.516 0.511 0.503 0.492 0.462 0.424 0.379 0.331 0.283 0.237 0.157 0.0989 0.0624 0.0429 0.0344 0.0318 0.0313 0.0257 0.0103 0.00367 0.00273 0.00265 0.00218 0.00094 0.00023 0.00017 1.9e-05 7.2e-06 5.1e-06 1e-06 0.353 0.353 0.353 0.353 0.352 0.351 0.347 0.339 0.327 0.311 0.291 0.242 0.188 0.138 0.0954 0.0633 0.0411 0.0184 0.0113 0.0102 0.00615 0.00277 0.00126 0.00086 0.0008 0.00024 5.3e-05 4e-05 1.9e-05 3.4e-06 2.2e-07 0.383 0.383 0.383 0.383 0.382 0.38 0.374 0.363 0.347 0.325 0.299 0.239 0.176 0.122 0.08 0.0505 0.0316 0.0149 0.0112 0.00942 0.00491 0.00202 0.001 0.000819 0.00076 0.00017 5e-05 3.7e-05 1.5e-05 2e-06 8.7e-08 1.97 1.9 1.69 1.4 1.08 0.528 0.215 0.0897 0.0559 0.0517 0.0511 0.0409 0.0257 0.014 0.00714 0.00382 0.00249 0.00204 0.00183 0.000778 0.000251 0.000165 0.000161 0.000135 5.9e-05 1.4e-05 1e-05 1.2e-06 4.3e-07 3.1e-07 6.2e-08 +Z 69 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 7.0 2.0 59488.0 10081.0 9629.4 8638.099999999999 2277.4 2075.2000000000003 1865.1 1516.0 1469.8 453.73 371.37 323.86999999999995 186.95 178.33 11.03 9.74 58.300000000000004 35.58 29.54 5.55 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.011 0.011 0.0109 0.0108 0.0107 0.0107 0.0098 0.009 0.007 0.0052 0.0026 0.00062 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0394 0.0394 0.0394 0.0394 0.0393 0.0392 0.0391 0.039 0.0388 0.0387 0.0385 0.038 0.0373 0.0356 0.0337 0.0314 0.029 0.0264 0.021 0.01 0.0042 0.0011 0.00097 0.00062 0.00013 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0194 0.0193 0.0192 0.0191 0.0189 0.018 0.016 0.012 0.0057 0.0024 0.00044 3.2e-05 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.0211 0.021 0.0209 0.0207 0.0204 0.02 0.016 0.012 0.005 0.0018 0.00027 1.3e-05 0.0876 0.0876 0.0875 0.0875 0.0874 0.0873 0.0871 0.0868 0.0864 0.086 0.0855 0.0844 0.083 0.0814 0.0796 0.0776 0.0755 0.0707 0.0628 0.0488 0.0357 0.0248 0.0168 0.0116 0.0072 0.0062 0.0035 0.00044 0.00021 0.00015 3.1e-05 0.0516 0.0516 0.0516 0.0516 0.0516 0.0516 0.0516 0.0516 0.0516 0.0516 0.0515 0.0515 0.0515 0.0515 0.0514 0.0514 0.0513 0.051 0.0503 0.0482 0.0447 0.04 0.0343 0.0284 0.017 0.0037 0.0019 0.0015 0.00071 0.00013 8.7e-06 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0545 0.0544 0.0544 0.0543 0.0542 0.0538 0.053 0.0503 0.046 0.0402 0.0337 0.027 0.016 0.0032 0.0021 0.0015 0.00059 8.3e-05 3.7e-06 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0353 0.0349 0.0341 0.0328 0.0309 0.026 0.013 0.0052 0.00075 0.00013 6.9e-06 1.2e-07 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0362 0.0361 0.036 0.0355 0.0346 0.0332 0.0312 0.026 0.013 0.0049 0.00067 0.00011 5.2e-06 7.1e-08 0.186 0.186 0.186 0.186 0.185 0.183 0.181 0.178 0.175 0.171 0.166 0.155 0.144 0.131 0.118 0.105 0.0917 0.0685 0.042 0.0211 0.0172 0.0169 0.0149 0.0113 0.0048 0.0016 0.0011 0.00014 4.8e-05 3.6e-05 7.5e-06 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.117 0.116 0.114 0.112 0.109 0.106 0.0961 0.0783 0.0468 0.0236 0.0118 0.00764 0.0069 0.0065 0.0018 0.00044 0.00034 0.00017 3.1e-05 2e-06 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.124 0.122 0.12 0.117 0.114 0.109 0.0976 0.0767 0.0426 0.0202 0.0103 0.00757 0.00732 0.0064 0.0014 0.00045 0.00034 0.00014 2e-05 8.6e-07 0.0975 0.0975 0.0975 0.0975 0.0975 0.0975 0.0975 0.0975 0.0975 0.0975 0.0975 0.0974 0.0973 0.097 0.0965 0.0957 0.0946 0.0912 0.0826 0.0617 0.0397 0.0227 0.012 0.00632 0.0029 0.0024 0.0012 0.00019 3.2e-05 1.7e-06 2.8e-08 0.0994 0.0994 0.0994 0.0994 0.0994 0.0994 0.0994 0.0994 0.0994 0.0994 0.0994 0.0993 0.0992 0.0989 0.0983 0.0975 0.0963 0.0925 0.0832 0.0611 0.0386 0.0216 0.0112 0.00589 0.0029 0.0023 0.0011 0.00017 2.7e-05 1.3e-06 1.7e-08 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.102 0.0998 0.0974 0.0944 0.0875 0.0755 0.0556 0.039 0.0266 0.0178 0.0118 0.0052 0.00068 0.00011 4.7e-06 3.7e-07 7.1e-09 4e-11 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.107 0.106 0.104 0.102 0.0988 0.0955 0.0879 0.0752 0.0547 0.038 0.0257 0.0171 0.0113 0.0049 0.00064 9.9e-05 4.2e-06 3.2e-07 5.6e-09 2.6e-11 0.509 0.507 0.503 0.495 0.485 0.456 0.419 0.377 0.331 0.284 0.239 0.16 0.102 0.0646 0.0439 0.0344 0.0312 0.0306 0.0259 0.011 0.00387 0.00267 0.00261 0.00223 0.001 0.00023 0.00017 2.1e-05 7.1e-06 5.2e-06 1.1e-06 0.347 0.347 0.347 0.347 0.347 0.345 0.341 0.334 0.323 0.308 0.289 0.243 0.19 0.141 0.0988 0.0664 0.0435 0.0194 0.011 0.0101 0.00639 0.00298 0.00135 0.000861 0.00079 0.00026 5.5e-05 4e-05 2e-05 3.7e-06 2.4e-07 0.378 0.378 0.378 0.377 0.377 0.375 0.369 0.359 0.344 0.323 0.298 0.24 0.179 0.125 0.0831 0.053 0.0334 0.0153 0.0109 0.00943 0.00514 0.00217 0.00104 0.000803 0.00075 0.00018 5e-05 3.8e-05 1.6e-05 2.2e-06 9.6e-08 1.95 1.88 1.68 1.39 1.08 0.537 0.222 0.0919 0.0554 0.0503 0.0499 0.0408 0.0262 0.0146 0.00753 0.00401 0.00253 0.00196 0.0018 0.000813 0.000264 0.00016 0.000156 0.000135 6.3e-05 1.4e-05 1e-05 1.3e-06 4.2e-07 3.1e-07 6.5e-08 +Z 70 20 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 2.0 61441.0 10454.0 9992.6 8933.800000000001 2368.1000000000004 2160.7000000000003 1935.2 1578.1000000000001 1528.5 471.0 386.03999999999996 334.92 193.73 184.44 11.09 9.67 59.9 36.44 30.009999999999998 5.609999999999999 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0109 0.0108 0.0108 0.0107 0.0106 0.0105 0.01 0.0097 0.0089 0.007 0.0052 0.0026 0.00065 0.0388 0.0388 0.0388 0.0388 0.0387 0.0387 0.0387 0.0387 0.0387 0.0386 0.0386 0.0385 0.0384 0.0383 0.0381 0.038 0.0378 0.0374 0.0367 0.0351 0.0332 0.0311 0.0287 0.0263 0.021 0.011 0.0044 0.0011 0.00095 0.00063 0.00014 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.019 0.0189 0.0189 0.0187 0.0186 0.018 0.016 0.012 0.0058 0.0025 0.00048 3.6e-05 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0208 0.0207 0.0207 0.0206 0.0204 0.0201 0.019 0.016 0.012 0.0051 0.0019 0.00029 1.4e-05 0.0859 0.0859 0.0858 0.0858 0.0857 0.0856 0.0854 0.0851 0.0848 0.0844 0.0839 0.0828 0.0815 0.08 0.0783 0.0765 0.0744 0.0699 0.0624 0.0489 0.0361 0.0254 0.0174 0.012 0.0072 0.0062 0.0037 0.00049 0.0002 0.00015 3.3e-05 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0504 0.0504 0.0503 0.05 0.0494 0.0475 0.0442 0.0398 0.0345 0.0287 0.018 0.0039 0.0019 0.0015 0.00074 0.00014 9.7e-06 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0535 0.0534 0.0533 0.0532 0.0529 0.0521 0.0496 0.0456 0.0402 0.0339 0.0275 0.016 0.0033 0.0021 0.0015 0.00062 9e-05 4.1e-06 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0347 0.0343 0.0335 0.0323 0.0306 0.026 0.013 0.0055 0.00082 0.00014 7.8e-06 1.4e-07 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0353 0.0349 0.0341 0.0328 0.031 0.026 0.013 0.0052 0.00073 0.00012 5.9e-06 8.1e-08 0.183 0.183 0.182 0.182 0.181 0.18 0.178 0.175 0.172 0.168 0.163 0.153 0.142 0.13 0.117 0.105 0.0923 0.0696 0.0432 0.0215 0.0169 0.0167 0.0151 0.0117 0.0051 0.0015 0.0012 0.00015 4.8e-05 3.6e-05 8e-06 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.116 0.115 0.115 0.115 0.114 0.112 0.11 0.108 0.104 0.0954 0.0785 0.0481 0.0249 0.0124 0.00778 0.0068 0.0065 0.002 0.00046 0.00034 0.00018 3.3e-05 2.3e-06 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.123 0.122 0.122 0.121 0.12 0.118 0.116 0.112 0.108 0.0971 0.0772 0.044 0.0213 0.0107 0.00758 0.0072 0.0065 0.0015 0.00045 0.00035 0.00015 2.2e-05 9.6e-07 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0954 0.0953 0.095 0.0946 0.0939 0.0929 0.0898 0.0819 0.0623 0.041 0.0239 0.0129 0.00685 0.003 0.0024 0.0013 0.00021 3.6e-05 1.9e-06 3.3e-08 0.0974 0.0974 0.0974 0.0974 0.0974 0.0974 0.0974 0.0974 0.0974 0.0974 0.0974 0.0973 0.0972 0.0969 0.0964 0.0957 0.0946 0.0911 0.0826 0.0617 0.0398 0.0228 0.012 0.00637 0.0029 0.0024 0.0012 0.00018 3e-05 1.4e-06 1.9e-08 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.102 0.101 0.0996 0.0978 0.0955 0.0928 0.0863 0.075 0.0559 0.0397 0.0274 0.0186 0.0125 0.0056 0.00077 0.00012 5.6e-06 4.4e-07 8.7e-09 4.9e-11 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.104 0.104 0.103 0.102 0.0995 0.0969 0.0939 0.0868 0.0748 0.0552 0.0389 0.0267 0.018 0.012 0.0053 0.00072 0.00011 5e-06 3.8e-07 6.9e-09 3.2e-11 0.501 0.499 0.495 0.488 0.478 0.451 0.415 0.374 0.33 0.285 0.241 0.163 0.105 0.0669 0.045 0.0346 0.0308 0.0299 0.026 0.0116 0.00409 0.00263 0.00257 0.00225 0.0011 0.00023 0.00018 2.4e-05 7e-06 5.3e-06 1.2e-06 0.342 0.342 0.342 0.342 0.341 0.34 0.336 0.33 0.32 0.305 0.287 0.243 0.192 0.144 0.102 0.0695 0.0459 0.0205 0.0109 0.00999 0.0066 0.0032 0.00144 0.000871 0.00077 0.00028 5.8e-05 4e-05 2.1e-05 4e-06 2.7e-07 0.373 0.373 0.373 0.372 0.372 0.37 0.364 0.355 0.34 0.321 0.297 0.24 0.181 0.128 0.0861 0.0555 0.0352 0.0158 0.0106 0.00941 0.00535 0.00232 0.00108 0.000792 0.00074 0.0002 5e-05 3.8e-05 1.7e-05 2.4e-06 1.1e-07 1.94 1.87 1.67 1.39 1.08 0.545 0.228 0.0943 0.0551 0.0489 0.0486 0.0406 0.0266 0.0151 0.00793 0.00421 0.00258 0.00188 0.00176 0.000846 0.000278 0.000156 0.00015 0.000134 6.6e-05 1.3e-05 1e-05 1.4e-06 4.1e-07 3.1e-07 6.8e-08 +Z 71 21 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 1.0 2.0 63442.0 10845.0 10373.0 9243.2 2470.5 2258.0 2016.1 1650.8 1597.8 497.84999999999997 410.19 355.05 209.38 199.32000000000002 18.96 17.32 66.34 41.52 34.22 4.45 4.03 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0107 0.0106 0.0106 0.0105 0.0104 0.0104 0.01 0.0095 0.0088 0.007 0.0052 0.0027 0.00068 0.0381 0.0381 0.0381 0.0381 0.038 0.038 0.038 0.038 0.038 0.0379 0.0379 0.0378 0.0377 0.0376 0.0375 0.0373 0.0372 0.0368 0.0361 0.0346 0.0328 0.0308 0.0285 0.0261 0.021 0.011 0.0046 0.0011 0.00094 0.00064 0.00015 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0186 0.0186 0.0185 0.0184 0.0182 0.018 0.015 0.012 0.006 0.0026 0.00051 3.9e-05 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0205 0.0204 0.0204 0.0204 0.0202 0.0201 0.0198 0.019 0.016 0.012 0.0053 0.002 0.00031 1.6e-05 0.0842 0.0842 0.0842 0.0841 0.0841 0.084 0.0838 0.0835 0.0832 0.0828 0.0824 0.0814 0.0801 0.0787 0.0771 0.0753 0.0734 0.0691 0.0619 0.049 0.0366 0.026 0.0179 0.0124 0.0073 0.0062 0.0038 0.00053 0.0002 0.00015 3.5e-05 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0495 0.0494 0.0494 0.0493 0.0491 0.0485 0.0467 0.0437 0.0396 0.0345 0.029 0.019 0.0042 0.0019 0.0015 0.00078 0.00015 1.1e-05 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0526 0.0525 0.0525 0.0525 0.0524 0.0523 0.052 0.0513 0.049 0.0452 0.04 0.0341 0.0278 0.017 0.0035 0.0021 0.0015 0.00065 9.7e-05 4.5e-06 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.034 0.0337 0.033 0.0319 0.0303 0.026 0.014 0.0057 0.00089 0.00016 8.9e-06 1.6e-07 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0349 0.0348 0.0347 0.0343 0.0336 0.0324 0.0307 0.026 0.013 0.0054 0.0008 0.00013 6.7e-06 9.3e-08 0.179 0.179 0.178 0.178 0.177 0.176 0.174 0.171 0.168 0.165 0.16 0.151 0.141 0.129 0.117 0.105 0.0928 0.0707 0.0445 0.022 0.0167 0.0165 0.0152 0.0121 0.0056 0.0015 0.0012 0.00017 4.8e-05 3.7e-05 8.5e-06 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.112 0.111 0.11 0.108 0.106 0.103 0.0945 0.0788 0.0495 0.0263 0.0133 0.00801 0.00675 0.0065 0.0022 0.00049 0.00034 0.00019 3.6e-05 2.5e-06 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.119 0.118 0.116 0.114 0.11 0.106 0.0965 0.0777 0.0454 0.0225 0.0113 0.00765 0.00712 0.0065 0.0017 0.00046 0.00035 0.00016 2.4e-05 1.1e-06 0.0931 0.0931 0.0931 0.0931 0.0931 0.0931 0.0931 0.0931 0.0931 0.0931 0.0931 0.093 0.0929 0.0927 0.0924 0.0918 0.0909 0.0882 0.0811 0.0629 0.0423 0.0253 0.0139 0.00748 0.0031 0.0024 0.0013 0.00023 4e-05 2.2e-06 3.8e-08 0.0951 0.0951 0.0951 0.0951 0.0951 0.0951 0.0951 0.0951 0.0951 0.095 0.095 0.095 0.0949 0.0946 0.0942 0.0936 0.0926 0.0896 0.0819 0.0624 0.0412 0.0241 0.013 0.00693 0.003 0.0024 0.0013 0.0002 3.4e-05 1.6e-06 2.2e-08 0.0953 0.0953 0.0953 0.0953 0.0953 0.0953 0.0953 0.0953 0.0953 0.0952 0.0952 0.095 0.0947 0.094 0.093 0.0915 0.0896 0.0846 0.0752 0.0578 0.042 0.0295 0.0203 0.0138 0.0063 0.0009 0.00015 6.9e-06 5.6e-07 1.1e-08 6.4e-11 0.0967 0.0967 0.0967 0.0967 0.0967 0.0967 0.0967 0.0967 0.0967 0.0967 0.0967 0.0965 0.0961 0.0954 0.0942 0.0927 0.0906 0.0854 0.0755 0.0575 0.0415 0.029 0.0198 0.0134 0.0061 0.00085 0.00014 6.2e-06 4.8e-07 8.9e-09 4.2e-11 0.48 0.478 0.474 0.468 0.459 0.435 0.403 0.366 0.326 0.284 0.243 0.169 0.112 0.0724 0.0487 0.0365 0.0315 0.03 0.027 0.013 0.00461 0.00272 0.00263 0.00238 0.0012 0.00023 0.00019 2.8e-05 7.3e-06 5.7e-06 1.3e-06 0.327 0.327 0.327 0.327 0.327 0.326 0.323 0.317 0.309 0.297 0.281 0.242 0.196 0.15 0.11 0.0767 0.0519 0.0235 0.0115 0.0104 0.00723 0.00366 0.00166 0.000947 0.0008 0.00032 6.5e-05 4.2e-05 2.3e-05 4.5e-06 3.2e-07 0.354 0.354 0.354 0.354 0.354 0.352 0.348 0.34 0.328 0.312 0.292 0.242 0.188 0.137 0.0952 0.0632 0.0409 0.0183 0.0111 0.0101 0.00605 0.00272 0.00124 0.000847 0.00079 0.00023 5.5e-05 4.1e-05 1.9e-05 2.8e-06 1.3e-07 0.489 0.489 0.489 0.489 0.488 0.482 0.465 0.433 0.389 0.34 0.291 0.203 0.136 0.0895 0.0578 0.0369 0.0233 0.00921 0.00282 0.00177 0.00161 0.00113 0.000664 0.000356 0.00012 7.9e-05 4.6e-05 7.9e-06 1.4e-06 7.7e-08 1.3e-09 1.77 1.72 1.56 1.33 1.07 0.594 0.276 0.121 0.0647 0.0513 0.0502 0.0456 0.033 0.0202 0.0113 0.00609 0.00356 0.00223 0.00212 0.00111 0.000375 0.00019 0.000178 0.000164 8.6e-05 1.6e-05 1.3e-05 1.9e-06 4.9e-07 3.8e-07 8.7e-08 +Z 72 21 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 2.0 2.0 65482.0 11245.0 10763.0 9558.300000000001 2576.0 2358.1 2099.0 1725.5 1668.7 525.6899999999999 435.27000000000004 375.82 225.58999999999997 214.71 27.26 25.400000000000002 72.56 46.34 38.099999999999994 5.75 5.180000000000001 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0105 0.0104 0.0104 0.0103 0.0103 0.0102 0.01 0.0094 0.0087 0.0069 0.0052 0.0027 0.00071 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0373 0.0373 0.0373 0.0373 0.0372 0.0372 0.0371 0.037 0.0368 0.0367 0.0365 0.0362 0.0355 0.0341 0.0324 0.0304 0.0283 0.026 0.021 0.011 0.0048 0.0011 0.00092 0.00065 0.00015 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0183 0.0182 0.0181 0.0179 0.017 0.015 0.012 0.0062 0.0027 0.00055 4.3e-05 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.0201 0.02 0.0199 0.0198 0.0196 0.019 0.016 0.012 0.0054 0.0021 0.00033 1.7e-05 0.0826 0.0826 0.0826 0.0826 0.0825 0.0824 0.0822 0.0819 0.0816 0.0813 0.0809 0.0799 0.0788 0.0774 0.0759 0.0742 0.0724 0.0683 0.0614 0.049 0.0369 0.0265 0.0185 0.0129 0.0074 0.0061 0.004 0.00059 0.0002 0.00016 3.7e-05 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0486 0.0485 0.0485 0.0485 0.0484 0.0484 0.0482 0.0476 0.046 0.0432 0.0393 0.0346 0.0293 0.019 0.0045 0.0019 0.0015 0.00081 0.00016 1.2e-05 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0516 0.0516 0.0516 0.0515 0.0515 0.0514 0.0511 0.0504 0.0483 0.0447 0.0399 0.0342 0.0282 0.017 0.0037 0.0021 0.0016 0.00069 0.00011 5e-06 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0335 0.0334 0.0331 0.0325 0.0315 0.03 0.026 0.014 0.006 0.00097 0.00017 1e-05 1.8e-07 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0343 0.0342 0.0342 0.0341 0.0338 0.0331 0.032 0.0304 0.026 0.014 0.0057 0.00086 0.00015 7.5e-06 1.1e-07 0.175 0.175 0.174 0.174 0.174 0.172 0.17 0.168 0.165 0.161 0.158 0.149 0.139 0.128 0.116 0.105 0.0932 0.0717 0.0458 0.0226 0.0166 0.0162 0.0152 0.0125 0.006 0.0015 0.0012 0.00019 4.9e-05 3.8e-05 9.1e-06 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.109 0.108 0.106 0.104 0.101 0.0935 0.0788 0.0508 0.0277 0.0141 0.00831 0.00672 0.0065 0.0024 0.00052 0.00035 0.0002 4e-05 2.8e-06 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.118 0.117 0.117 0.117 0.117 0.115 0.114 0.112 0.109 0.105 0.0958 0.0781 0.0468 0.0237 0.0119 0.00777 0.00704 0.0066 0.0018 0.00047 0.00036 0.00017 2.6e-05 1.2e-06 0.0908 0.0908 0.0908 0.0908 0.0908 0.0908 0.0908 0.0908 0.0908 0.0908 0.0907 0.0907 0.0906 0.0905 0.0902 0.0897 0.0889 0.0865 0.0802 0.0634 0.0436 0.0267 0.015 0.00817 0.0032 0.0025 0.0014 0.00025 4.5e-05 2.5e-06 4.4e-08 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0927 0.0926 0.0924 0.092 0.0915 0.0907 0.088 0.0811 0.063 0.0425 0.0255 0.0141 0.00755 0.0031 0.0024 0.0013 0.00022 3.8e-05 1.9e-06 2.6e-08 0.0898 0.0898 0.0898 0.0898 0.0898 0.0898 0.0898 0.0898 0.0898 0.0898 0.0898 0.0897 0.0895 0.0891 0.0885 0.0875 0.0862 0.0824 0.0747 0.0591 0.044 0.0315 0.022 0.0152 0.0071 0.0011 0.00018 8.5e-06 7e-07 1.4e-08 8.2e-11 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0907 0.0906 0.0904 0.0901 0.0894 0.0884 0.087 0.0832 0.0752 0.0591 0.0437 0.0311 0.0216 0.0148 0.0068 0.001 0.00017 7.7e-06 6e-07 1.1e-08 5.4e-11 0.461 0.459 0.456 0.45 0.442 0.42 0.392 0.358 0.321 0.283 0.245 0.174 0.118 0.0776 0.0524 0.0385 0.0323 0.0299 0.0278 0.0144 0.00522 0.00284 0.00268 0.00249 0.0014 0.00024 0.0002 3.2e-05 7.7e-06 6e-06 1.4e-06 0.314 0.314 0.314 0.314 0.314 0.313 0.311 0.306 0.299 0.288 0.275 0.24 0.198 0.156 0.116 0.0834 0.0578 0.0268 0.0121 0.0106 0.00784 0.00416 0.00192 0.00104 0.00082 0.00036 7.3e-05 4.4e-05 2.5e-05 5.2e-06 3.7e-07 0.338 0.338 0.338 0.338 0.338 0.336 0.333 0.327 0.317 0.303 0.286 0.242 0.193 0.145 0.103 0.0704 0.0467 0.021 0.0116 0.0106 0.00675 0.00315 0.00142 0.000909 0.00083 0.00027 6e-05 4.5e-05 2.1e-05 3.2e-06 1.5e-07 0.423 0.423 0.423 0.423 0.423 0.42 0.412 0.396 0.371 0.339 0.302 0.229 0.165 0.115 0.0779 0.0519 0.034 0.0142 0.00424 0.00224 0.0021 0.00154 0.000937 0.000515 0.00016 0.0001 6.3e-05 1.1e-05 2.1e-06 1.1e-07 2e-09 1.68 1.63 1.5 1.3 1.07 0.621 0.308 0.141 0.0727 0.0526 0.0496 0.0472 0.0366 0.024 0.0141 0.00785 0.00453 0.00247 0.00231 0.00134 0.00047 0.000217 0.000195 0.000185 0.0001 1.7e-05 1.5e-05 2.4e-06 5.5e-07 4.3e-07 1e-07 +Z 73 21 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 3.0 2.0 67565.0 11656.0 11163.0 9879.199999999999 2684.7 2461.4 2184.1 1802.3 1741.6000000000001 554.65 461.40999999999997 397.35999999999996 242.48 230.72 36.14 34.04 78.81 51.150000000000006 41.89 7.01 6.3 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0103 0.0102 0.0102 0.0101 0.01 0.0098 0.0093 0.0086 0.0069 0.0052 0.0028 0.00074 0.0367 0.0367 0.0367 0.0367 0.0367 0.0367 0.0367 0.0367 0.0366 0.0366 0.0366 0.0365 0.0364 0.0363 0.0362 0.0361 0.0359 0.0356 0.0349 0.0336 0.032 0.0301 0.028 0.0259 0.021 0.011 0.005 0.0011 0.0009 0.00066 0.00016 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.018 0.0179 0.0179 0.0178 0.0176 0.017 0.015 0.012 0.0063 0.0029 0.00059 4.8e-05 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0198 0.0197 0.0196 0.0195 0.0193 0.019 0.016 0.012 0.0055 0.0022 0.00036 1.9e-05 0.0811 0.0811 0.081 0.081 0.081 0.0808 0.0806 0.0804 0.0801 0.0798 0.0794 0.0785 0.0774 0.0761 0.0747 0.0731 0.0713 0.0675 0.0609 0.049 0.0373 0.0271 0.019 0.0133 0.0075 0.0061 0.0041 0.00065 0.0002 0.00016 4e-05 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0476 0.0475 0.0475 0.0473 0.0468 0.0453 0.0427 0.0391 0.0345 0.0295 0.02 0.0048 0.0019 0.0016 0.00085 0.00018 1.3e-05 0.0508 0.0508 0.0508 0.0508 0.0508 0.0508 0.0508 0.0508 0.0508 0.0508 0.0508 0.0507 0.0507 0.0507 0.0507 0.0506 0.0505 0.0503 0.0496 0.0476 0.0443 0.0398 0.0343 0.0285 0.018 0.0039 0.002 0.0016 0.00072 0.00011 5.5e-06 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.033 0.0329 0.0329 0.0328 0.0326 0.032 0.0311 0.0297 0.026 0.014 0.0063 0.001 0.00019 1.1e-05 2.1e-07 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0337 0.0336 0.0336 0.0335 0.0332 0.0326 0.0316 0.0301 0.026 0.014 0.006 0.00093 0.00016 8.4e-06 1.2e-07 0.171 0.171 0.171 0.17 0.17 0.168 0.167 0.164 0.162 0.158 0.155 0.147 0.137 0.127 0.116 0.105 0.0935 0.0727 0.0471 0.0232 0.0165 0.016 0.0152 0.0128 0.0064 0.0015 0.0013 0.00022 4.9e-05 3.9e-05 9.7e-06 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.107 0.107 0.105 0.104 0.102 0.0993 0.0925 0.0788 0.052 0.0292 0.0151 0.00867 0.00673 0.0064 0.0025 0.00056 0.00035 0.00021 4.3e-05 3.2e-06 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.115 0.114 0.113 0.112 0.11 0.107 0.104 0.0951 0.0784 0.0482 0.025 0.0126 0.00794 0.00698 0.0066 0.002 0.00049 0.00037 0.00018 2.8e-05 1.3e-06 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0885 0.0884 0.0882 0.088 0.0876 0.0869 0.0849 0.0792 0.0637 0.0449 0.0281 0.0162 0.00891 0.0034 0.0025 0.0015 0.00027 5e-05 2.9e-06 5.2e-08 0.0905 0.0905 0.0905 0.0905 0.0905 0.0905 0.0905 0.0905 0.0905 0.0905 0.0905 0.0904 0.0904 0.0902 0.0899 0.0894 0.0887 0.0864 0.0802 0.0635 0.0438 0.0269 0.0151 0.00822 0.0032 0.0025 0.0014 0.00024 4.2e-05 2.1e-06 3e-08 0.0853 0.0853 0.0853 0.0853 0.0853 0.0853 0.0853 0.0853 0.0853 0.0853 0.0852 0.0852 0.0851 0.0848 0.0844 0.0837 0.0828 0.08 0.0737 0.0599 0.0456 0.0333 0.0236 0.0165 0.0079 0.0012 0.00021 1e-05 8.6e-07 1.8e-08 1e-10 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0858 0.0857 0.0855 0.0851 0.0844 0.0835 0.0807 0.0743 0.0601 0.0455 0.033 0.0233 0.0162 0.0076 0.0012 0.0002 9.3e-06 7.5e-07 1.4e-08 6.9e-11 0.443 0.442 0.439 0.434 0.427 0.407 0.381 0.35 0.316 0.281 0.245 0.178 0.123 0.0827 0.0561 0.0408 0.0333 0.0298 0.0284 0.0158 0.00591 0.00299 0.00273 0.00259 0.0015 0.00025 0.00021 3.8e-05 8.1e-06 6.3e-06 1.6e-06 0.302 0.302 0.302 0.302 0.302 0.301 0.299 0.295 0.289 0.28 0.268 0.237 0.2 0.16 0.122 0.0896 0.0635 0.0304 0.013 0.0108 0.00841 0.00468 0.0022 0.00115 0.00084 0.0004 8.3e-05 4.6e-05 2.8e-05 5.8e-06 4.3e-07 0.324 0.324 0.324 0.324 0.324 0.323 0.32 0.315 0.306 0.295 0.28 0.241 0.196 0.151 0.11 0.0773 0.0525 0.0239 0.0121 0.0111 0.00745 0.00363 0.00163 0.000981 0.00087 0.0003 6.6e-05 4.8e-05 2.3e-05 3.6e-06 1.7e-07 0.382 0.382 0.382 0.382 0.382 0.381 0.376 0.367 0.35 0.328 0.301 0.241 0.182 0.133 0.0941 0.0651 0.0441 0.0195 0.00587 0.0026 0.00249 0.00191 0.00121 0.00068 0.00021 0.00012 7.8e-05 1.5e-05 2.7e-06 1.6e-07 2.8e-09 1.61 1.56 1.44 1.27 1.06 0.64 0.333 0.159 0.0806 0.0542 0.0487 0.0472 0.0388 0.0269 0.0166 0.00961 0.00556 0.00271 0.00242 0.00154 0.00057 0.000245 0.000208 0.000201 0.00012 1.9e-05 1.6e-05 2.9e-06 6.1e-07 4.8e-07 1.2e-07 +Z 74 21 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 2.0 69689.0 12077.0 11573.0 10206.0 2796.5 2567.7999999999997 2271.2000000000003 1881.1 1816.2 584.6999999999999 488.61 419.62 260.05 247.33999999999997 45.61 43.25 85.14 56.02 45.65 8.27 7.41 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.0101 0.01 0.00998 0.00992 0.00985 0.0097 0.0091 0.0085 0.0068 0.0052 0.0028 0.00077 0.0361 0.0361 0.0361 0.0361 0.0361 0.036 0.036 0.036 0.036 0.036 0.0359 0.0359 0.0358 0.0357 0.0356 0.0354 0.0353 0.035 0.0344 0.0331 0.0316 0.0298 0.0278 0.0257 0.021 0.012 0.0053 0.0012 0.00089 0.00067 0.00017 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0177 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0175 0.0174 0.0173 0.017 0.015 0.012 0.0064 0.003 0.00063 5.3e-05 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0195 0.0194 0.0194 0.0192 0.019 0.018 0.016 0.012 0.0057 0.0023 0.00038 2e-05 0.0796 0.0796 0.0795 0.0795 0.0795 0.0793 0.0792 0.0789 0.0787 0.0784 0.078 0.0771 0.0761 0.0749 0.0735 0.072 0.0703 0.0667 0.0604 0.0489 0.0376 0.0276 0.0195 0.0137 0.0077 0.006 0.0042 0.00071 0.0002 0.00016 4.2e-05 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0466 0.0466 0.0464 0.046 0.0446 0.0422 0.0388 0.0345 0.0297 0.02 0.0051 0.0019 0.0016 0.00088 0.00019 1.5e-05 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0499 0.0498 0.0498 0.0497 0.0497 0.0494 0.0489 0.047 0.0439 0.0396 0.0344 0.0288 0.018 0.0041 0.002 0.0016 0.00075 0.00012 6e-06 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0323 0.0323 0.032 0.0315 0.0307 0.0294 0.026 0.015 0.0066 0.0011 0.00021 1.3e-05 2.4e-07 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.033 0.0329 0.0327 0.0321 0.0312 0.0298 0.026 0.014 0.0062 0.001 0.00018 9.4e-06 1.4e-07 0.167 0.167 0.167 0.166 0.166 0.165 0.163 0.161 0.158 0.155 0.152 0.144 0.135 0.125 0.115 0.104 0.0937 0.0735 0.0483 0.0239 0.0165 0.0158 0.0152 0.013 0.0068 0.0015 0.0013 0.00024 5.1e-05 4e-05 1e-05 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.105 0.104 0.103 0.102 0.1 0.0977 0.0914 0.0787 0.0531 0.0306 0.016 0.00909 0.00678 0.0064 0.0027 0.0006 0.00035 0.00021 4.7e-05 3.6e-06 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.113 0.112 0.112 0.112 0.111 0.11 0.108 0.105 0.102 0.0943 0.0786 0.0494 0.0263 0.0133 0.00815 0.00694 0.0067 0.0021 0.00051 0.00038 0.00019 3e-05 1.5e-06 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0863 0.0862 0.0861 0.0859 0.0855 0.085 0.0832 0.0782 0.0639 0.046 0.0295 0.0173 0.00969 0.0036 0.0025 0.0015 0.0003 5.6e-05 3.3e-06 6e-08 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0883 0.0882 0.0881 0.0878 0.0874 0.0868 0.0848 0.0792 0.0638 0.045 0.0282 0.0162 0.00893 0.0034 0.0025 0.0015 0.00027 4.7e-05 2.4e-06 3.4e-08 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0813 0.0812 0.0811 0.0808 0.0803 0.0796 0.0775 0.0724 0.0603 0.0469 0.0349 0.0252 0.0178 0.0087 0.0014 0.00025 1.2e-05 1.1e-06 2.2e-08 1.3e-10 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0817 0.0816 0.0815 0.0812 0.0808 0.0801 0.0781 0.073 0.0606 0.047 0.0347 0.0249 0.0175 0.0084 0.0013 0.00023 1.1e-05 9.2e-07 1.8e-08 8.7e-11 0.427 0.426 0.423 0.418 0.412 0.394 0.371 0.342 0.311 0.278 0.245 0.182 0.128 0.0875 0.0599 0.0432 0.0345 0.0297 0.0287 0.0171 0.00668 0.00317 0.00276 0.00268 0.0016 0.00026 0.00022 4.3e-05 8.6e-06 6.6e-06 1.7e-06 0.291 0.291 0.291 0.291 0.291 0.29 0.289 0.285 0.28 0.272 0.262 0.234 0.2 0.163 0.127 0.0954 0.0691 0.0341 0.014 0.0109 0.00894 0.00522 0.00253 0.00128 0.00085 0.00044 9.5e-05 4.7e-05 3e-05 6.5e-06 4.9e-07 0.311 0.311 0.311 0.311 0.311 0.31 0.308 0.303 0.296 0.286 0.273 0.239 0.198 0.156 0.117 0.0837 0.0581 0.0271 0.0128 0.0114 0.00811 0.00413 0.00187 0.00106 0.0009 0.00035 7.3e-05 5.1e-05 2.5e-05 4.1e-06 2e-07 0.352 0.352 0.352 0.352 0.352 0.351 0.349 0.342 0.331 0.315 0.295 0.245 0.194 0.147 0.108 0.0769 0.0537 0.025 0.00777 0.00293 0.0028 0.00225 0.00147 0.000854 0.00027 0.00014 9.3e-05 1.9e-05 3.5e-06 2e-07 3.7e-09 1.55 1.51 1.4 1.24 1.04 0.654 0.354 0.174 0.0885 0.0562 0.0478 0.0465 0.04 0.0291 0.0188 0.0113 0.00666 0.00299 0.00248 0.00172 0.000677 0.000275 0.000217 0.000213 0.00014 2.1e-05 1.7e-05 3.4e-06 6.7e-07 5.1e-07 1.3e-07 +Z 75 22 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 1.0 2.0 71856.0 12508.0 11993.0 10538.0 2911.6 2677.4 2360.5 1961.8000000000002 1892.7 615.83 516.83 442.59 278.26 264.54 55.64 52.99 91.57000000000001 60.97 49.4 9.52 8.5 8.06 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00997 0.00996 0.00996 0.00996 0.00996 0.00995 0.00994 0.00993 0.0099 0.00986 0.00981 0.00975 0.00968 0.0095 0.009 0.0083 0.0068 0.0053 0.0029 0.0008 0.0354 0.0354 0.0354 0.0354 0.0354 0.0354 0.0354 0.0354 0.0354 0.0353 0.0353 0.0353 0.0352 0.0351 0.035 0.0348 0.0347 0.0344 0.0338 0.0326 0.0311 0.0294 0.0276 0.0255 0.021 0.012 0.0055 0.0012 0.00087 0.00068 0.00018 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0173 0.0172 0.0171 0.017 0.017 0.015 0.012 0.0066 0.0031 0.00068 5.8e-05 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0192 0.0191 0.0191 0.0189 0.0188 0.018 0.016 0.012 0.0058 0.0024 0.00041 2.2e-05 0.0781 0.0781 0.0781 0.078 0.078 0.0779 0.0777 0.0775 0.0773 0.077 0.0766 0.0758 0.0748 0.0737 0.0724 0.0709 0.0694 0.0658 0.0599 0.0489 0.0379 0.028 0.0201 0.0142 0.0079 0.0059 0.0043 0.00078 0.0002 0.00016 4.4e-05 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0458 0.0457 0.0457 0.0455 0.0451 0.0439 0.0417 0.0385 0.0344 0.0299 0.021 0.0054 0.0019 0.0016 0.00091 0.0002 1.6e-05 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.0491 0.049 0.049 0.049 0.049 0.0489 0.0488 0.0486 0.0481 0.0464 0.0435 0.0394 0.0344 0.029 0.019 0.0043 0.002 0.0016 0.00079 0.00013 6.6e-06 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0317 0.0315 0.031 0.0302 0.0291 0.026 0.015 0.0069 0.0012 0.00023 1.4e-05 2.7e-07 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0324 0.0322 0.0316 0.0308 0.0295 0.026 0.015 0.0065 0.0011 0.00019 1.1e-05 1.6e-07 0.163 0.163 0.163 0.163 0.162 0.161 0.16 0.158 0.155 0.152 0.149 0.142 0.133 0.124 0.114 0.104 0.0939 0.0743 0.0495 0.0247 0.0165 0.0155 0.0151 0.0132 0.0073 0.0015 0.0013 0.00027 5.3e-05 4e-05 1.1e-05 0.103 0.103 0.103 0.103 0.103 0.103 0.103 0.103 0.103 0.103 0.103 0.103 0.102 0.101 0.0999 0.0982 0.096 0.0903 0.0785 0.0541 0.0319 0.0171 0.00956 0.00686 0.0063 0.0029 0.00066 0.00035 0.00022 5.1e-05 4e-06 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.109 0.109 0.108 0.106 0.104 0.101 0.0934 0.0787 0.0506 0.0276 0.0141 0.00841 0.00693 0.0067 0.0023 0.00053 0.00038 0.0002 3.3e-05 1.6e-06 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0841 0.084 0.0838 0.0835 0.0831 0.0815 0.0771 0.064 0.047 0.0308 0.0185 0.0105 0.0038 0.0025 0.0016 0.00033 6.3e-05 3.7e-06 6.9e-08 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0862 0.0861 0.086 0.0858 0.0854 0.0849 0.0831 0.0782 0.064 0.0461 0.0296 0.0174 0.00969 0.0036 0.0025 0.0015 0.00029 5.2e-05 2.8e-06 3.9e-08 0.0777 0.0777 0.0777 0.0777 0.0777 0.0777 0.0777 0.0777 0.0777 0.0777 0.0777 0.0776 0.0776 0.0775 0.0773 0.077 0.0765 0.075 0.0709 0.0605 0.0481 0.0364 0.0267 0.0191 0.0095 0.0016 0.00029 1.5e-05 1.3e-06 2.7e-08 1.7e-10 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0781 0.0779 0.0776 0.0771 0.0756 0.0715 0.0608 0.0481 0.0362 0.0264 0.0188 0.0092 0.0015 0.00027 1.3e-05 1.1e-06 2.2e-08 1.1e-10 0.412 0.411 0.408 0.404 0.398 0.382 0.36 0.335 0.306 0.275 0.244 0.184 0.132 0.0921 0.0637 0.0458 0.0359 0.0297 0.0289 0.0185 0.00754 0.00341 0.0028 0.00275 0.0018 0.00028 0.00023 4.9e-05 9.2e-06 6.9e-06 1.9e-06 0.279 0.279 0.279 0.279 0.279 0.279 0.277 0.274 0.27 0.263 0.255 0.231 0.2 0.166 0.132 0.101 0.0751 0.0384 0.0155 0.011 0.00949 0.00584 0.00291 0.00146 0.00088 0.00049 0.00011 4.9e-05 3.2e-05 7.4e-06 5.7e-07 0.3 0.3 0.3 0.3 0.3 0.299 0.297 0.293 0.287 0.279 0.267 0.237 0.199 0.16 0.122 0.0895 0.0634 0.0304 0.0136 0.0116 0.00872 0.00464 0.00213 0.00116 0.00093 0.00039 8.1e-05 5.3e-05 2.8e-05 4.7e-06 2.3e-07 0.327 0.327 0.327 0.327 0.327 0.327 0.325 0.321 0.313 0.302 0.286 0.246 0.201 0.157 0.119 0.0878 0.0632 0.031 0.0101 0.00329 0.00309 0.00259 0.00176 0.00105 0.00033 0.00016 0.00011 2.3e-05 4.4e-06 2.6e-07 4.8e-09 0.346 0.346 0.346 0.346 0.346 0.346 0.343 0.337 0.327 0.312 0.292 0.245 0.195 0.149 0.11 0.0795 0.0561 0.0266 0.00838 0.00308 0.00294 0.00238 0.00156 0.000905 0.00029 0.00015 9.9e-05 1.9e-05 3.4e-06 1.8e-07 2.6e-09 1.49 1.46 1.36 1.21 1.03 0.666 0.374 0.191 0.0978 0.0593 0.0476 0.0455 0.0409 0.0312 0.0211 0.0132 0.00792 0.00337 0.00253 0.00191 0.0008 0.000314 0.000228 0.000224 0.00015 2.2e-05 1.9e-05 4e-06 7.4e-07 5.5e-07 1.5e-07 +Z 76 22 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 2.0 2.0 74066.0 12950.0 12424.0 10877.0 3030.0 2790.2000000000003 2451.7 2044.4999999999998 1970.8999999999999 648.03 546.0699999999999 466.22999999999996 297.08000000000004 282.28999999999996 66.21000000000001 63.26 98.12 66.01 53.15 10.79 9.6 8.389999999999999 0.0098 0.0098 0.0098 0.0098 0.0098 0.00979 0.00979 0.00979 0.00979 0.00979 0.00979 0.00979 0.00979 0.00979 0.00978 0.00978 0.00978 0.00977 0.00976 0.00973 0.00969 0.00964 0.00958 0.00952 0.0094 0.0089 0.0082 0.0068 0.0053 0.0029 0.00083 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0348 0.0347 0.0347 0.0346 0.0346 0.0345 0.0344 0.0343 0.0341 0.0338 0.0333 0.0321 0.0307 0.0291 0.0273 0.0254 0.021 0.012 0.0057 0.0013 0.00086 0.00069 0.00019 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.017 0.0169 0.0168 0.0167 0.016 0.015 0.012 0.0067 0.0032 0.00072 6.3e-05 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0189 0.0188 0.0187 0.0185 0.018 0.016 0.012 0.0059 0.0025 0.00043 2.4e-05 0.0767 0.0767 0.0767 0.0766 0.0766 0.0765 0.0763 0.0761 0.0759 0.0756 0.0753 0.0745 0.0736 0.0725 0.0713 0.0699 0.0684 0.065 0.0593 0.0488 0.0381 0.0285 0.0206 0.0146 0.008 0.0058 0.0044 0.00085 0.00021 0.00016 4.7e-05 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.0449 0.0449 0.0449 0.0447 0.0444 0.0432 0.0411 0.0381 0.0343 0.03 0.021 0.0058 0.0019 0.0016 0.00094 0.00022 1.8e-05 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0481 0.0481 0.0479 0.0474 0.0458 0.043 0.0392 0.0344 0.0293 0.019 0.0046 0.002 0.0017 0.00082 0.00014 7.2e-06 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.0312 0.031 0.0305 0.0298 0.0288 0.026 0.015 0.0072 0.0013 0.00025 1.6e-05 3.1e-07 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.032 0.0319 0.0319 0.0316 0.0312 0.0304 0.0292 0.026 0.015 0.0068 0.0012 0.00021 1.2e-05 1.8e-07 0.16 0.16 0.16 0.159 0.159 0.158 0.156 0.154 0.152 0.15 0.147 0.14 0.132 0.123 0.113 0.104 0.0939 0.075 0.0506 0.0255 0.0166 0.0153 0.015 0.0134 0.0077 0.0015 0.0013 0.00029 5.5e-05 4.1e-05 1.2e-05 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.0998 0.099 0.0979 0.0964 0.0944 0.0892 0.0782 0.055 0.0332 0.0181 0.0101 0.00699 0.0062 0.0031 0.00072 0.00035 0.00023 5.5e-05 4.4e-06 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.108 0.107 0.107 0.105 0.104 0.102 0.0993 0.0924 0.0786 0.0517 0.0288 0.0149 0.00872 0.00693 0.0066 0.0025 0.00056 0.00039 0.00021 3.6e-05 1.8e-06 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0821 0.0821 0.0819 0.0816 0.0812 0.0799 0.076 0.064 0.0479 0.0321 0.0197 0.0114 0.004 0.0025 0.0017 0.00035 7e-05 4.2e-06 8e-08 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0842 0.0841 0.0841 0.0841 0.084 0.0838 0.0835 0.083 0.0815 0.0771 0.0641 0.0471 0.0309 0.0185 0.0105 0.0038 0.0025 0.0016 0.00032 5.8e-05 3.1e-06 4.5e-08 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0744 0.0743 0.0742 0.074 0.0737 0.0725 0.0693 0.0603 0.049 0.0377 0.0281 0.0204 0.01 0.0018 0.00034 1.8e-05 1.5e-06 3.4e-08 2.1e-10 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.075 0.0749 0.0747 0.0743 0.0732 0.0699 0.0606 0.049 0.0375 0.0277 0.02 0.01 0.0017 0.00031 1.6e-05 1.3e-06 2.7e-08 1.4e-10 0.397 0.397 0.394 0.39 0.385 0.37 0.351 0.327 0.301 0.272 0.243 0.186 0.136 0.0964 0.0675 0.0485 0.0374 0.0297 0.0289 0.0197 0.00846 0.0037 0.00285 0.00281 0.0019 0.00029 0.00024 5.6e-05 9.9e-06 7.1e-06 2.1e-06 0.268 0.268 0.268 0.268 0.268 0.268 0.267 0.264 0.261 0.255 0.247 0.227 0.199 0.168 0.137 0.107 0.0807 0.0428 0.0171 0.0111 0.00997 0.00645 0.00334 0.00166 0.0009 0.00055 0.00013 5.1e-05 3.5e-05 8.3e-06 6.6e-07 0.29 0.29 0.29 0.29 0.29 0.289 0.287 0.284 0.279 0.271 0.261 0.234 0.2 0.163 0.127 0.0948 0.0685 0.0338 0.0145 0.0117 0.00928 0.00518 0.00242 0.00127 0.00095 0.00043 9e-05 5.6e-05 3e-05 5.2e-06 2.6e-07 0.307 0.307 0.307 0.307 0.307 0.307 0.306 0.303 0.298 0.289 0.277 0.244 0.205 0.165 0.128 0.0973 0.0719 0.037 0.0126 0.00368 0.00332 0.0029 0.00205 0.00126 0.00041 0.00017 0.00012 2.7e-05 5.4e-06 3.3e-07 6.1e-09 0.324 0.324 0.324 0.324 0.324 0.324 0.322 0.318 0.311 0.299 0.284 0.245 0.201 0.158 0.12 0.0894 0.0647 0.0322 0.0106 0.00341 0.00319 0.00269 0.00184 0.00109 0.00035 0.00017 0.00011 2.3e-05 4.2e-06 2.3e-07 3.3e-09 1.44 1.41 1.32 1.19 1.02 0.676 0.392 0.207 0.107 0.0629 0.0477 0.0443 0.0412 0.0328 0.0231 0.0149 0.00921 0.0038 0.00255 0.00206 0.000929 0.000359 0.000238 0.000233 0.00017 2.4e-05 2e-05 4.7e-06 8.1e-07 5.8e-07 1.7e-07 +Z 77 22 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 3.0 2.0 76314.0 13396.0 12859.0 11214.0 3145.7 2900.2 2539.0 2123.2 2044.7999999999997 675.3199999999999 570.3499999999999 484.55 310.52 294.58000000000004 71.33 68.06 99.14 65.67999999999999 51.66 7.989999999999999 6.79 6.79 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00962 0.00961 0.00961 0.00961 0.0096 0.00959 0.00956 0.00952 0.00948 0.00942 0.00936 0.0092 0.0087 0.0081 0.0067 0.0053 0.0029 0.00086 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0342 0.0341 0.0341 0.0341 0.034 0.0339 0.0338 0.0337 0.0336 0.0333 0.0328 0.0317 0.0303 0.0288 0.027 0.0252 0.021 0.012 0.0059 0.0013 0.00084 0.00069 0.0002 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0166 0.0165 0.0164 0.016 0.015 0.012 0.0068 0.0033 0.00077 6.9e-05 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0187 0.0186 0.0186 0.0185 0.0184 0.0183 0.018 0.016 0.012 0.0061 0.0026 0.00046 2.6e-05 0.0753 0.0753 0.0753 0.0753 0.0752 0.0751 0.075 0.0748 0.0746 0.0743 0.074 0.0732 0.0724 0.0713 0.0702 0.0688 0.0674 0.0642 0.0588 0.0487 0.0383 0.0289 0.021 0.0151 0.0082 0.0057 0.0045 0.00092 0.00021 0.00016 4.9e-05 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0441 0.0441 0.0441 0.044 0.0439 0.0436 0.0425 0.0406 0.0378 0.0342 0.0301 0.021 0.0061 0.002 0.0016 0.00097 0.00023 2e-05 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0475 0.0474 0.0474 0.0474 0.0474 0.0473 0.0473 0.0471 0.0466 0.0451 0.0426 0.0389 0.0344 0.0294 0.02 0.0048 0.002 0.0017 0.00085 0.00015 7.9e-06 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0307 0.0306 0.0305 0.0301 0.0294 0.0285 0.026 0.015 0.0074 0.0014 0.00028 1.8e-05 3.5e-07 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0312 0.0307 0.03 0.0289 0.026 0.015 0.007 0.0012 0.00023 1.3e-05 2e-07 0.156 0.156 0.156 0.156 0.156 0.155 0.153 0.151 0.149 0.147 0.144 0.137 0.13 0.121 0.112 0.103 0.0938 0.0756 0.0517 0.0263 0.0167 0.0151 0.0149 0.0136 0.0081 0.0015 0.0013 0.00032 5.8e-05 4.1e-05 1.2e-05 0.0986 0.0986 0.0986 0.0986 0.0986 0.0986 0.0986 0.0985 0.0985 0.0985 0.0984 0.0981 0.0977 0.097 0.0959 0.0946 0.0928 0.088 0.0778 0.0558 0.0345 0.0192 0.0107 0.00717 0.0061 0.0033 0.00079 0.00035 0.00024 5.9e-05 4.9e-06 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.106 0.105 0.105 0.104 0.103 0.102 0.1 0.0978 0.0915 0.0785 0.0527 0.0301 0.0158 0.00908 0.00697 0.0066 0.0027 0.0006 0.00039 0.00022 3.8e-05 2e-06 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0802 0.0802 0.08 0.0798 0.0795 0.0783 0.0748 0.0639 0.0487 0.0333 0.0208 0.0122 0.0043 0.0025 0.0017 0.00038 7.7e-05 4.8e-06 9.2e-08 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0822 0.0821 0.0821 0.0819 0.0817 0.0813 0.0799 0.076 0.0641 0.0479 0.0321 0.0196 0.0113 0.004 0.0025 0.0017 0.00034 6.4e-05 3.5e-06 5.2e-08 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0716 0.0715 0.0714 0.0713 0.071 0.0702 0.0676 0.06 0.0496 0.0389 0.0294 0.0216 0.011 0.002 0.00039 2.1e-05 1.9e-06 4.1e-08 2.6e-10 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0723 0.0722 0.0722 0.072 0.0718 0.0709 0.0682 0.0603 0.0496 0.0387 0.029 0.0212 0.011 0.0019 0.00036 1.9e-05 1.6e-06 3.3e-08 1.7e-10 0.384 0.383 0.381 0.378 0.373 0.36 0.342 0.32 0.295 0.269 0.242 0.188 0.14 0.1 0.0711 0.0513 0.0391 0.0298 0.0288 0.0208 0.00943 0.00404 0.0029 0.00285 0.0021 0.00031 0.00025 6.4e-05 1.1e-05 7.4e-06 2.2e-06 0.258 0.258 0.258 0.258 0.258 0.258 0.257 0.255 0.252 0.247 0.241 0.222 0.198 0.17 0.14 0.111 0.0858 0.0472 0.019 0.0112 0.0104 0.00705 0.00379 0.0019 0.00093 0.0006 0.00014 5.2e-05 3.7e-05 9.3e-06 7.6e-07 0.281 0.281 0.281 0.28 0.28 0.28 0.278 0.276 0.271 0.264 0.255 0.231 0.2 0.165 0.131 0.0996 0.0733 0.0372 0.0155 0.0118 0.00978 0.00572 0.00274 0.0014 0.00097 0.00047 0.0001 5.8e-05 3.3e-05 5.8e-06 3e-07 0.291 0.291 0.291 0.291 0.291 0.29 0.29 0.288 0.283 0.277 0.267 0.24 0.207 0.17 0.136 0.105 0.0798 0.043 0.0154 0.00413 0.0035 0.00317 0.00233 0.00147 0.00049 0.00019 0.00014 3.2e-05 6.5e-06 4e-07 7.6e-09 0.306 0.306 0.306 0.306 0.306 0.306 0.305 0.302 0.296 0.287 0.275 0.243 0.204 0.165 0.129 0.098 0.0727 0.0378 0.013 0.00378 0.0034 0.00298 0.00211 0.00129 0.00042 0.00018 0.00013 2.7e-05 5.1e-06 2.8e-07 4.1e-09 1.4 1.37 1.29 1.16 1.01 0.683 0.407 0.221 0.116 0.067 0.0483 0.0429 0.0409 0.0339 0.0247 0.0166 0.0105 0.00431 0.00257 0.00218 0.00106 0.000411 0.000249 0.000239 0.00018 2.7e-05 2.1e-05 5.3e-06 9e-07 6.1e-07 1.8e-07 +Z 78 22 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 5.0 1.0 78615.0 13862.0 13313.0 11567.0 3273.2 3022.0 2636.9 2212.3999999999996 2129.0 712.21 604.19 512.04 333.1 315.96 85.49 81.87 108.44 73.34 57.74 11.02 9.540000000000001 8.07 0.00946 0.00946 0.00946 0.00946 0.00946 0.00946 0.00946 0.00946 0.00946 0.00945 0.00945 0.00945 0.00945 0.00945 0.00945 0.00944 0.00944 0.00943 0.00942 0.00939 0.00936 0.00932 0.00927 0.00921 0.0091 0.0086 0.008 0.0067 0.0053 0.003 0.00089 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0336 0.0335 0.0335 0.0334 0.0333 0.0332 0.0331 0.033 0.0327 0.0322 0.0312 0.0299 0.0284 0.0268 0.025 0.021 0.012 0.0061 0.0014 0.00083 0.0007 0.00021 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0164 0.0163 0.0163 0.0162 0.016 0.014 0.012 0.0069 0.0035 0.00082 7.5e-05 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0184 0.0183 0.0183 0.0182 0.018 0.018 0.015 0.012 0.0062 0.0027 0.00049 2.8e-05 0.074 0.074 0.0739 0.0739 0.0739 0.0738 0.0736 0.0735 0.0733 0.073 0.0727 0.072 0.0712 0.0702 0.0691 0.0678 0.0665 0.0634 0.0582 0.0485 0.0385 0.0293 0.0215 0.0155 0.0085 0.0056 0.0046 0.001 0.00022 0.00017 5.1e-05 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0433 0.0433 0.0433 0.0433 0.0432 0.0431 0.0428 0.0418 0.0401 0.0374 0.0341 0.0302 0.022 0.0065 0.002 0.0015 0.001 0.00025 2.2e-05 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0467 0.0466 0.0466 0.0466 0.0465 0.0464 0.0459 0.0445 0.0421 0.0387 0.0344 0.0296 0.02 0.0051 0.002 0.0017 0.00088 0.00016 8.6e-06 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0302 0.0301 0.03 0.0296 0.029 0.0281 0.025 0.016 0.0077 0.0015 0.0003 2e-05 3.9e-07 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0307 0.0303 0.0296 0.0286 0.026 0.015 0.0073 0.0013 0.00025 1.4e-05 2.2e-07 0.153 0.153 0.153 0.153 0.152 0.151 0.15 0.148 0.146 0.144 0.141 0.135 0.128 0.12 0.112 0.103 0.0937 0.0761 0.0527 0.0271 0.0169 0.0149 0.0148 0.0136 0.0085 0.0016 0.0014 0.00036 6.2e-05 4.1e-05 1.3e-05 0.0964 0.0964 0.0964 0.0964 0.0964 0.0964 0.0964 0.0964 0.0964 0.0963 0.0962 0.096 0.0956 0.095 0.094 0.0928 0.0912 0.0867 0.0773 0.0565 0.0358 0.0203 0.0113 0.00738 0.0061 0.0035 0.00087 0.00034 0.00025 6.4e-05 5.4e-06 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.104 0.103 0.103 0.103 0.102 0.102 0.1 0.0985 0.0963 0.0904 0.0783 0.0536 0.0313 0.0167 0.00948 0.00703 0.0066 0.0028 0.00064 0.0004 0.00023 4.1e-05 2.2e-06 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0784 0.0783 0.0782 0.078 0.0777 0.0767 0.0736 0.0637 0.0494 0.0345 0.022 0.0131 0.0047 0.0025 0.0018 0.00042 8.5e-05 5.4e-06 1.1e-07 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0803 0.0802 0.0801 0.0798 0.0795 0.0783 0.0748 0.064 0.0487 0.0333 0.0208 0.0122 0.0043 0.0025 0.0017 0.00037 7.1e-05 4e-06 6e-08 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.069 0.0689 0.0688 0.0686 0.0679 0.0659 0.0594 0.05 0.0399 0.0306 0.0228 0.012 0.0023 0.00044 2.5e-05 2.2e-06 5e-08 3.1e-10 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0698 0.0697 0.0696 0.0694 0.0687 0.0666 0.0597 0.05 0.0397 0.0302 0.0224 0.012 0.0021 0.00041 2.2e-05 1.9e-06 3.9e-08 2e-10 0.375 0.374 0.372 0.369 0.365 0.352 0.335 0.315 0.291 0.266 0.24 0.189 0.142 0.103 0.0739 0.0534 0.0405 0.0298 0.0284 0.0216 0.0103 0.00439 0.00294 0.00285 0.0022 0.00034 0.00025 7.1e-05 1.2e-05 7.5e-06 2.4e-06 0.25 0.25 0.25 0.25 0.25 0.25 0.249 0.247 0.245 0.24 0.235 0.218 0.196 0.17 0.142 0.115 0.0899 0.051 0.0208 0.0112 0.0106 0.00758 0.00424 0.00215 0.00096 0.00064 0.00016 5.3e-05 4e-05 1e-05 8.6e-07 0.274 0.274 0.274 0.274 0.274 0.273 0.272 0.269 0.265 0.259 0.251 0.228 0.199 0.166 0.133 0.103 0.0769 0.04 0.0164 0.0117 0.0101 0.00617 0.00305 0.00153 0.00097 0.00051 0.00011 5.9e-05 3.5e-05 6.4e-06 3.3e-07 0.287 0.287 0.287 0.287 0.287 0.286 0.286 0.283 0.279 0.273 0.263 0.237 0.204 0.17 0.137 0.107 0.0824 0.0458 0.0172 0.00439 0.00346 0.00323 0.00246 0.00161 0.00055 0.00019 0.00015 3.5e-05 7.3e-06 4.6e-07 8.9e-09 0.304 0.304 0.304 0.304 0.304 0.303 0.302 0.299 0.293 0.284 0.272 0.239 0.202 0.164 0.129 0.0995 0.0749 0.0402 0.0145 0.00392 0.00333 0.00302 0.00222 0.0014 0.00046 0.00018 0.00013 3e-05 5.7e-06 3.2e-07 4.7e-09 1.45 1.41 1.32 1.19 1.03 0.682 0.398 0.211 0.108 0.0612 0.0437 0.0388 0.037 0.0307 0.0227 0.0154 0.00994 0.00412 0.00229 0.002 0.00104 0.000413 0.000232 0.000215 0.00017 2.6e-05 1.9e-05 5.4e-06 8.9e-07 5.6e-07 1.8e-07 +Z 79 22 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 1.0 80960.0 14336.0 13776.0 11922.0 3401.4 3144.3 2734.0 2300.7000000000003 2212.2000000000003 747.4 636.28 537.39 353.47999999999996 335.05 97.37 93.39 115.23 78.55 61.370000000000005 12.16 10.459999999999999 8.3 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00929 0.00928 0.00928 0.00928 0.00927 0.00926 0.00923 0.0092 0.00916 0.00911 0.00906 0.0089 0.0085 0.0079 0.0066 0.0053 0.003 0.00092 0.0331 0.0331 0.0331 0.0331 0.0331 0.0331 0.033 0.033 0.033 0.033 0.033 0.0329 0.0329 0.0328 0.0327 0.0326 0.0325 0.0322 0.0317 0.0308 0.0295 0.0281 0.0265 0.0248 0.021 0.013 0.0063 0.0014 0.00082 0.0007 0.00022 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.0161 0.016 0.016 0.0159 0.0159 0.014 0.012 0.007 0.0036 0.00087 8.2e-05 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.0181 0.018 0.0179 0.0178 0.017 0.015 0.012 0.0063 0.0028 0.00052 3.1e-05 0.0727 0.0727 0.0726 0.0726 0.0726 0.0725 0.0724 0.0722 0.072 0.0717 0.0715 0.0708 0.07 0.0691 0.068 0.0668 0.0655 0.0627 0.0577 0.0483 0.0387 0.0297 0.022 0.0159 0.0087 0.0056 0.0046 0.0011 0.00023 0.00017 5.4e-05 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0425 0.0425 0.0425 0.0424 0.0421 0.0412 0.0395 0.0371 0.0339 0.0302 0.022 0.0069 0.0021 0.0015 0.001 0.00027 2.4e-05 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0459 0.0458 0.0458 0.0456 0.0452 0.0439 0.0417 0.0384 0.0344 0.0297 0.02 0.0053 0.002 0.0017 0.00092 0.00017 9.4e-06 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0297 0.0296 0.0295 0.0292 0.0286 0.0278 0.025 0.016 0.008 0.0016 0.00033 2.2e-05 4.5e-07 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0302 0.0299 0.0292 0.0283 0.026 0.016 0.0076 0.0014 0.00027 1.6e-05 2.5e-07 0.15 0.15 0.15 0.149 0.149 0.148 0.147 0.145 0.143 0.141 0.139 0.133 0.126 0.119 0.111 0.102 0.0935 0.0765 0.0537 0.028 0.0171 0.0147 0.0146 0.0137 0.0089 0.0016 0.0014 0.00039 6.7e-05 4.1e-05 1.4e-05 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0943 0.0942 0.0942 0.094 0.0936 0.093 0.0922 0.091 0.0896 0.0855 0.0767 0.0571 0.0369 0.0214 0.012 0.00765 0.006 0.0037 0.00095 0.00034 0.00026 6.8e-05 6e-06 0.102 0.102 0.102 0.102 0.102 0.102 0.101 0.101 0.101 0.101 0.101 0.101 0.1 0.0996 0.0985 0.0969 0.0948 0.0894 0.0781 0.0545 0.0325 0.0176 0.00992 0.00713 0.0065 0.003 0.00069 0.0004 0.00024 4.5e-05 2.4e-06 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0766 0.0766 0.0765 0.0763 0.0761 0.0752 0.0724 0.0634 0.05 0.0355 0.0231 0.0141 0.005 0.0025 0.0019 0.00045 9.4e-05 6.1e-06 1.2e-07 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0784 0.0784 0.0783 0.0781 0.0778 0.0768 0.0737 0.0638 0.0494 0.0344 0.0219 0.0131 0.0046 0.0025 0.0018 0.0004 7.9e-05 4.5e-06 6.8e-08 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0666 0.0665 0.0664 0.0659 0.0642 0.0587 0.0503 0.0407 0.0317 0.0239 0.013 0.0025 0.0005 2.9e-05 2.6e-06 6e-08 3.8e-10 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0675 0.0674 0.0674 0.0672 0.0667 0.0649 0.059 0.0503 0.0405 0.0313 0.0235 0.013 0.0024 0.00047 2.6e-05 2.3e-06 4.7e-08 2.5e-10 0.363 0.363 0.361 0.358 0.354 0.342 0.327 0.308 0.286 0.263 0.239 0.19 0.145 0.107 0.0773 0.0562 0.0424 0.0302 0.0281 0.0225 0.0113 0.00485 0.00303 0.00287 0.0023 0.00037 0.00026 7.9e-05 1.3e-05 7.7e-06 2.6e-06 0.242 0.242 0.242 0.242 0.242 0.241 0.241 0.239 0.237 0.233 0.228 0.214 0.194 0.17 0.144 0.118 0.0942 0.0552 0.023 0.0113 0.0108 0.00812 0.00474 0.00244 0.001 0.00069 0.00019 5.4e-05 4.2e-05 1.1e-05 9.9e-07 0.266 0.266 0.266 0.266 0.266 0.265 0.264 0.262 0.258 0.253 0.245 0.225 0.198 0.168 0.136 0.107 0.0812 0.0435 0.0178 0.0117 0.0105 0.0067 0.00342 0.00171 0.00099 0.00056 0.00012 6.1e-05 3.7e-05 7e-06 3.8e-07 0.273 0.273 0.273 0.273 0.273 0.272 0.272 0.27 0.267 0.262 0.254 0.232 0.204 0.173 0.142 0.114 0.089 0.0514 0.0203 0.00501 0.0036 0.00344 0.00272 0.00183 0.00065 0.0002 0.00016 4.1e-05 8.6e-06 5.5e-07 1.1e-08 0.288 0.288 0.288 0.288 0.288 0.288 0.287 0.285 0.281 0.273 0.263 0.236 0.203 0.169 0.136 0.106 0.0817 0.0456 0.0172 0.0044 0.00346 0.00323 0.00246 0.00161 0.00055 0.00019 0.00015 3.4e-05 6.7e-06 3.8e-07 5.7e-09 1.41 1.38 1.3 1.17 1.02 0.688 0.41 0.223 0.116 0.0648 0.0443 0.0374 0.0363 0.0311 0.0237 0.0166 0.011 0.00462 0.00231 0.00206 0.00115 0.00047 0.000245 0.000218 0.00018 2.9e-05 1.9e-05 6e-06 9.8e-07 5.8e-07 1.9e-07 +Z 80 22 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 83353.0 14826.0 14254.0 12287.0 3536.8 3273.9 2836.8999999999996 2394.7999999999997 2300.8 787.44 673.17 567.13 378.21000000000004 358.41999999999996 113.5 109.13 125.73 87.34 68.30000000000001 15.979999999999999 13.96 9.55 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00913 0.00912 0.00912 0.00912 0.00911 0.0091 0.00908 0.00904 0.009 0.00896 0.00891 0.0088 0.0084 0.0078 0.0066 0.0052 0.0031 0.00095 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0325 0.0324 0.0324 0.0324 0.0323 0.0322 0.0321 0.032 0.0319 0.0317 0.0312 0.0303 0.0291 0.0278 0.0263 0.0246 0.021 0.013 0.0065 0.0015 0.00081 0.0007 0.00023 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0157 0.0156 0.015 0.014 0.012 0.0071 0.0037 0.00092 9e-05 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0179 0.0178 0.0178 0.0178 0.0177 0.0175 0.017 0.015 0.012 0.0064 0.0029 0.00055 3.3e-05 0.0714 0.0714 0.0714 0.0714 0.0713 0.0712 0.0711 0.0709 0.0708 0.0705 0.0703 0.0696 0.0689 0.068 0.067 0.0659 0.0646 0.0619 0.0571 0.0482 0.0388 0.03 0.0224 0.0164 0.0089 0.0055 0.0047 0.0012 0.00024 0.00016 5.6e-05 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0417 0.0416 0.0414 0.0405 0.039 0.0367 0.0337 0.0302 0.022 0.0072 0.0022 0.0015 0.0011 0.00028 2.6e-05 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0451 0.0451 0.0449 0.0446 0.0434 0.0412 0.0382 0.0343 0.0299 0.021 0.0056 0.0021 0.0017 0.00095 0.00018 1e-05 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.0292 0.029 0.0287 0.0282 0.0275 0.025 0.016 0.0082 0.0017 0.00035 2.4e-05 5e-07 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.0299 0.0299 0.0297 0.0294 0.0289 0.028 0.025 0.016 0.0078 0.0015 0.0003 1.8e-05 2.8e-07 0.147 0.147 0.146 0.146 0.146 0.145 0.144 0.142 0.141 0.139 0.136 0.131 0.124 0.117 0.11 0.101 0.0932 0.0768 0.0546 0.0288 0.0174 0.0146 0.0144 0.0137 0.0093 0.0017 0.0014 0.00042 7.2e-05 4.1e-05 1.4e-05 0.0923 0.0923 0.0923 0.0923 0.0923 0.0923 0.0923 0.0923 0.0923 0.0922 0.0922 0.092 0.0916 0.0911 0.0904 0.0893 0.088 0.0843 0.0761 0.0576 0.038 0.0225 0.0127 0.00796 0.0059 0.0038 0.001 0.00034 0.00026 7.3e-05 6.6e-06 0.0995 0.0995 0.0995 0.0995 0.0995 0.0995 0.0995 0.0995 0.0994 0.0994 0.0993 0.099 0.0985 0.0978 0.0967 0.0953 0.0934 0.0884 0.0777 0.0552 0.0336 0.0185 0.0104 0.00725 0.0065 0.0032 0.00074 0.0004 0.00024 4.8e-05 2.6e-06 0.075 0.075 0.075 0.075 0.075 0.075 0.075 0.075 0.075 0.075 0.075 0.075 0.0749 0.0749 0.0748 0.0747 0.0745 0.0737 0.0712 0.063 0.0504 0.0365 0.0242 0.015 0.0054 0.0025 0.0019 0.00048 0.0001 6.9e-06 1.4e-07 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0768 0.0767 0.0767 0.0766 0.0764 0.0762 0.0753 0.0725 0.0635 0.05 0.0355 0.023 0.014 0.005 0.0025 0.0019 0.00043 8.7e-05 5.1e-06 7.8e-08 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0645 0.0644 0.0644 0.0643 0.0639 0.0626 0.0579 0.0503 0.0414 0.0327 0.025 0.014 0.0028 0.00057 3.3e-05 3.1e-06 7.2e-08 4.7e-10 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0653 0.0652 0.0651 0.0647 0.0633 0.0583 0.0504 0.0412 0.0323 0.0246 0.013 0.0026 0.00053 3e-05 2.7e-06 5.7e-08 3e-10 0.35 0.349 0.347 0.345 0.341 0.331 0.317 0.299 0.28 0.259 0.236 0.191 0.148 0.111 0.0813 0.0596 0.0449 0.0309 0.028 0.0234 0.0125 0.00541 0.00317 0.00291 0.0025 0.00041 0.00026 8.9e-05 1.5e-05 7.9e-06 2.8e-06 0.233 0.233 0.233 0.233 0.233 0.232 0.232 0.231 0.229 0.226 0.221 0.209 0.192 0.17 0.146 0.122 0.0986 0.0597 0.0256 0.0116 0.0111 0.00868 0.00528 0.00279 0.0011 0.00074 0.00021 5.6e-05 4.4e-05 1.3e-05 1.1e-06 0.256 0.256 0.256 0.256 0.256 0.255 0.254 0.253 0.249 0.245 0.239 0.221 0.197 0.169 0.14 0.112 0.0862 0.0477 0.0196 0.0119 0.0109 0.00731 0.00386 0.00192 0.001 0.00061 0.00014 6.4e-05 4e-05 7.9e-06 4.3e-07 0.252 0.252 0.252 0.252 0.252 0.252 0.252 0.251 0.249 0.246 0.241 0.225 0.204 0.178 0.15 0.123 0.0989 0.0598 0.025 0.00606 0.0039 0.00379 0.00311 0.00217 0.0008 0.00022 0.00018 4.9e-05 1e-05 6.9e-07 1.4e-08 0.265 0.265 0.265 0.265 0.265 0.265 0.264 0.263 0.261 0.256 0.25 0.231 0.205 0.176 0.146 0.117 0.0925 0.054 0.0215 0.0053 0.00379 0.00362 0.00286 0.00193 0.00068 0.00021 0.00017 4.1e-05 8.3e-06 4.8e-07 7.4e-09 1.29 1.27 1.21 1.1 0.976 0.696 0.443 0.258 0.143 0.0812 0.0526 0.0391 0.0386 0.0349 0.0281 0.0207 0.0142 0.00616 0.0027 0.00239 0.00144 0.000609 0.000298 0.000249 0.00022 3.6e-05 2.2e-05 7.6e-06 1.2e-06 6.7e-07 2.4e-07 +Z 81 23 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 1.0 85798.0 15330.0 14746.0 12660.0 3678.7 3409.7 2944.6 2493.7000000000003 2393.9 831.43 713.9699999999999 600.32 406.34999999999997 385.13 132.95000000000002 128.16 139.16 99.03 77.96000000000001 22.4 20.01 12.36 5.46 0.00898 0.00898 0.00898 0.00898 0.00898 0.00898 0.00898 0.00897 0.00897 0.00897 0.00897 0.00897 0.00897 0.00897 0.00897 0.00896 0.00896 0.00896 0.00894 0.00892 0.00889 0.00885 0.00881 0.00876 0.0086 0.0083 0.0077 0.0065 0.0052 0.0031 0.00098 0.032 0.032 0.032 0.032 0.032 0.032 0.0319 0.0319 0.0319 0.0319 0.0319 0.0318 0.0318 0.0317 0.0316 0.0315 0.0314 0.0312 0.0308 0.0299 0.0288 0.0275 0.026 0.0244 0.021 0.013 0.0067 0.0016 0.0008 0.0007 0.00024 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0155 0.0154 0.0154 0.015 0.014 0.012 0.0072 0.0038 0.00097 9.7e-05 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0176 0.0175 0.0174 0.0173 0.017 0.015 0.012 0.0065 0.003 0.00058 3.6e-05 0.0702 0.0701 0.0701 0.0701 0.0701 0.07 0.0699 0.0697 0.0695 0.0693 0.0691 0.0685 0.0678 0.0669 0.066 0.0649 0.0637 0.0611 0.0566 0.0479 0.0389 0.0303 0.0228 0.0168 0.0092 0.0054 0.0047 0.0013 0.00025 0.00016 5.9e-05 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.041 0.041 0.041 0.0409 0.0407 0.0399 0.0385 0.0363 0.0335 0.0302 0.023 0.0076 0.0023 0.0015 0.0011 0.0003 2.8e-05 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0445 0.0444 0.0444 0.0443 0.0439 0.0428 0.0408 0.0379 0.0342 0.0299 0.021 0.0059 0.0021 0.0017 0.00098 0.00019 1.1e-05 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0287 0.0286 0.0283 0.0279 0.0271 0.025 0.016 0.0085 0.0018 0.00038 2.7e-05 5.7e-07 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0295 0.0294 0.0293 0.029 0.0285 0.0277 0.025 0.016 0.0081 0.0016 0.00032 2e-05 3.2e-07 0.144 0.144 0.143 0.143 0.143 0.142 0.141 0.14 0.138 0.136 0.134 0.129 0.123 0.116 0.108 0.101 0.0929 0.0771 0.0554 0.0297 0.0177 0.0144 0.0142 0.0137 0.0096 0.0018 0.0013 0.00046 7.9e-05 4.1e-05 1.5e-05 0.0903 0.0903 0.0903 0.0903 0.0903 0.0903 0.0903 0.0903 0.0903 0.0903 0.0902 0.0901 0.0898 0.0893 0.0886 0.0876 0.0864 0.083 0.0755 0.058 0.0391 0.0236 0.0135 0.00832 0.0059 0.004 0.0011 0.00033 0.00027 7.8e-05 7.3e-06 0.0976 0.0976 0.0976 0.0976 0.0976 0.0976 0.0976 0.0975 0.0975 0.0975 0.0974 0.0971 0.0967 0.096 0.095 0.0937 0.092 0.0873 0.0773 0.0558 0.0347 0.0194 0.0109 0.00741 0.0064 0.0034 0.00079 0.0004 0.00025 5.2e-05 2.9e-06 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0733 0.0732 0.0731 0.0729 0.0722 0.07 0.0626 0.0508 0.0374 0.0253 0.0159 0.0059 0.0025 0.002 0.00052 0.00011 7.7e-06 1.6e-07 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.0751 0.075 0.075 0.0748 0.0746 0.0738 0.0714 0.0631 0.0504 0.0364 0.0241 0.0149 0.0054 0.0025 0.0019 0.00047 9.5e-05 5.7e-06 8.8e-08 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0624 0.0623 0.062 0.061 0.057 0.0503 0.042 0.0335 0.026 0.015 0.003 0.00064 3.9e-05 3.6e-06 8.6e-08 5.6e-10 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0633 0.0632 0.0631 0.0628 0.0617 0.0575 0.0504 0.0418 0.0332 0.0256 0.014 0.0029 0.0006 3.5e-05 3.1e-06 6.8e-08 3.7e-10 0.337 0.337 0.335 0.333 0.329 0.32 0.307 0.292 0.274 0.254 0.233 0.191 0.15 0.114 0.0851 0.0629 0.0475 0.0318 0.0278 0.0242 0.0136 0.00603 0.00334 0.00294 0.0026 0.00045 0.00027 9.9e-05 1.6e-05 8.1e-06 3e-06 0.224 0.224 0.224 0.224 0.224 0.223 0.223 0.222 0.22 0.218 0.214 0.204 0.188 0.169 0.148 0.125 0.103 0.0643 0.0285 0.0119 0.0113 0.00922 0.00585 0.00317 0.0011 0.0008 0.00024 5.7e-05 4.7e-05 1.4e-05 1.3e-06 0.246 0.246 0.246 0.246 0.246 0.246 0.245 0.243 0.241 0.237 0.232 0.216 0.195 0.17 0.143 0.116 0.0911 0.0521 0.0216 0.012 0.0113 0.00793 0.00434 0.00218 0.0011 0.00066 0.00016 6.6e-05 4.3e-05 8.8e-06 4.9e-07 0.235 0.235 0.235 0.235 0.235 0.235 0.235 0.234 0.233 0.231 0.228 0.217 0.2 0.179 0.155 0.131 0.107 0.0678 0.0299 0.00731 0.0042 0.0041 0.00349 0.00251 0.00096 0.00024 0.00021 5.7e-05 1.3e-05 8.5e-07 1.7e-08 0.244 0.244 0.244 0.244 0.244 0.244 0.244 0.243 0.242 0.239 0.235 0.223 0.203 0.18 0.153 0.127 0.103 0.0629 0.0265 0.00645 0.00413 0.00401 0.00329 0.00228 0.00083 0.00024 0.00019 5e-05 1e-05 6e-07 9.4e-09 1.15 1.13 1.08 1.01 0.913 0.693 0.477 0.304 0.182 0.108 0.0686 0.0437 0.0422 0.0402 0.0343 0.0265 0.0189 0.00855 0.00337 0.00286 0.00186 0.00082 0.000382 0.000297 0.00027 4.8e-05 2.7e-05 1e-05 1.6e-06 8.1e-07 3e-07 0.913 0.913 0.91 0.899 0.874 0.771 0.613 0.444 0.298 0.189 0.115 0.0401 0.0163 0.0106 0.01 0.0099 0.00927 0.00673 0.00304 0.000765 0.0006 0.000531 0.000353 0.000194 6.4e-05 4.3e-05 1.3e-05 3e-06 2.5e-06 7.4e-07 6.8e-08 +Z 82 23 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 88290.0 15847.0 15251.0 13040.0 3824.3 3549.3 3054.6000000000004 2594.7000000000003 2489.0 876.72 756.0200000000001 634.3 435.23 412.49 153.04000000000002 147.81 152.83 110.91 87.64 28.81 26.03 15.05 7.0 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00882 0.00881 0.00881 0.00881 0.0088 0.00879 0.00877 0.00874 0.00871 0.00866 0.00862 0.0085 0.0081 0.0076 0.0065 0.0052 0.0031 0.001 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0314 0.0313 0.0313 0.0312 0.0312 0.0311 0.031 0.0309 0.0307 0.0303 0.0294 0.0284 0.0271 0.0257 0.0242 0.021 0.013 0.0069 0.0016 0.00079 0.0007 0.00024 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0153 0.0152 0.0152 0.0152 0.0151 0.015 0.014 0.012 0.0073 0.0039 0.001 0.00011 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0174 0.0173 0.0173 0.0172 0.0171 0.017 0.015 0.012 0.0067 0.0031 0.00061 3.8e-05 0.0689 0.0689 0.0689 0.0689 0.0689 0.0688 0.0687 0.0685 0.0684 0.0682 0.0679 0.0674 0.0667 0.0659 0.065 0.064 0.0628 0.0603 0.056 0.0477 0.039 0.0306 0.0233 0.0172 0.0095 0.0053 0.0047 0.0014 0.00027 0.00016 6.1e-05 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0403 0.0402 0.04 0.0392 0.0379 0.0359 0.0333 0.0301 0.023 0.008 0.0024 0.0015 0.0011 0.00032 3.1e-05 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0438 0.0437 0.0436 0.0433 0.0422 0.0403 0.0376 0.0341 0.03 0.021 0.0062 0.0021 0.0017 0.001 0.00021 1.2e-05 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0283 0.0282 0.0281 0.0279 0.0275 0.0268 0.025 0.016 0.0088 0.0019 0.00042 2.9e-05 6.4e-07 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.029 0.0289 0.0286 0.0281 0.0274 0.025 0.016 0.0083 0.0017 0.00035 2.2e-05 3.6e-07 0.141 0.141 0.14 0.14 0.14 0.139 0.138 0.137 0.135 0.133 0.131 0.126 0.121 0.114 0.107 0.1 0.0925 0.0773 0.0562 0.0306 0.0181 0.0144 0.014 0.0136 0.0099 0.0019 0.0013 0.0005 8.6e-05 4.1e-05 1.6e-05 0.0884 0.0884 0.0884 0.0884 0.0884 0.0884 0.0884 0.0884 0.0884 0.0884 0.0883 0.0882 0.0879 0.0875 0.0869 0.086 0.0849 0.0818 0.0748 0.0584 0.0401 0.0246 0.0143 0.00873 0.0058 0.0042 0.0013 0.00033 0.00027 8.3e-05 8e-06 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0957 0.0956 0.0956 0.0955 0.0953 0.0949 0.0943 0.0934 0.0921 0.0905 0.0862 0.0769 0.0564 0.0358 0.0204 0.0115 0.0076 0.0064 0.0035 0.00086 0.0004 0.00026 5.5e-05 3.2e-06 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0718 0.0717 0.0717 0.0717 0.0716 0.0714 0.0708 0.0689 0.0621 0.0511 0.0383 0.0263 0.0169 0.0063 0.0024 0.002 0.00056 0.00012 8.6e-06 1.8e-07 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0735 0.0734 0.0733 0.0731 0.0724 0.0702 0.0627 0.0508 0.0373 0.0251 0.0158 0.0058 0.0025 0.002 0.0005 0.0001 6.3e-06 1e-07 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0605 0.0603 0.0595 0.0561 0.0501 0.0424 0.0343 0.0269 0.015 0.0033 0.00072 4.5e-05 4.3e-06 1e-07 6.8e-10 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0614 0.0613 0.0611 0.0602 0.0566 0.0502 0.0423 0.034 0.0265 0.015 0.0032 0.00067 4e-05 3.7e-06 8.1e-08 4.4e-10 0.325 0.325 0.323 0.321 0.318 0.31 0.298 0.284 0.267 0.249 0.23 0.191 0.152 0.117 0.0886 0.0662 0.0501 0.0329 0.0276 0.0248 0.0148 0.00673 0.00355 0.00298 0.0027 0.0005 0.00027 0.00011 1.9e-05 8.3e-06 3.2e-06 0.215 0.215 0.215 0.215 0.215 0.215 0.214 0.214 0.212 0.21 0.207 0.198 0.185 0.168 0.148 0.127 0.106 0.0688 0.0316 0.0124 0.0114 0.00973 0.00644 0.0036 0.0012 0.00085 0.00028 5.8e-05 5e-05 1.5e-05 1.5e-06 0.237 0.237 0.237 0.237 0.237 0.236 0.236 0.235 0.232 0.229 0.225 0.211 0.193 0.17 0.145 0.12 0.0956 0.0565 0.0239 0.0122 0.0116 0.00854 0.00485 0.00247 0.0011 0.00072 0.00018 6.9e-05 4.6e-05 9.7e-06 5.5e-07 0.221 0.221 0.221 0.221 0.221 0.221 0.221 0.221 0.22 0.219 0.216 0.208 0.196 0.178 0.158 0.136 0.114 0.0749 0.035 0.00875 0.00451 0.00435 0.00383 0.00285 0.0011 0.00026 0.00023 6.7e-05 1.5e-05 1e-06 2.1e-08 0.227 0.227 0.227 0.227 0.227 0.227 0.227 0.227 0.226 0.225 0.222 0.213 0.199 0.18 0.158 0.134 0.111 0.0711 0.0318 0.00778 0.00446 0.00434 0.00369 0.00264 0.001 0.00026 0.00022 5.9e-05 1.2e-05 7.4e-07 1.2e-08 1.04 1.03 0.992 0.934 0.859 0.679 0.494 0.334 0.214 0.133 0.0848 0.0485 0.0442 0.0434 0.0389 0.0315 0.0236 0.0113 0.00412 0.00325 0.00227 0.00105 0.000476 0.000342 0.00031 6e-05 3e-05 1.2e-05 2.1e-06 9.3e-07 3.6e-07 0.808 0.808 0.806 0.8 0.785 0.719 0.608 0.474 0.345 0.237 0.156 0.0623 0.0254 0.0142 0.0119 0.0118 0.0115 0.00904 0.00445 0.00109 0.000757 0.000697 0.000489 0.000279 8.8e-05 5.7e-05 1.9e-05 3.9e-06 3.3e-06 1e-06 9.8e-08 +Z 83 24 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 1.0 90832.0 16376.000000000002 15768.0 13425.0 3973.8999999999996 3692.7000000000003 3166.8999999999996 2698.0 2586.0 923.4300000000001 799.43 669.16 464.95 440.61 173.86999999999998 168.17000000000002 166.86 123.12 97.46000000000001 35.370000000000005 32.17 17.689999999999998 8.600000000000001 6.3500000000000005 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00867 0.00866 0.00866 0.00866 0.00866 0.00865 0.00864 0.00862 0.00859 0.00856 0.00852 0.00847 0.0084 0.008 0.0075 0.0064 0.0052 0.0031 0.001 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0309 0.0308 0.0308 0.0308 0.0307 0.0307 0.0306 0.0305 0.0304 0.0302 0.0298 0.029 0.028 0.0268 0.0255 0.024 0.021 0.013 0.0071 0.0017 0.00079 0.0007 0.00025 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.0149 0.0149 0.0148 0.0148 0.014 0.012 0.0074 0.004 0.0011 0.00011 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.0171 0.017 0.017 0.0169 0.0169 0.015 0.012 0.0068 0.0032 0.00064 4.1e-05 0.0678 0.0678 0.0678 0.0677 0.0677 0.0676 0.0675 0.0674 0.0672 0.067 0.0668 0.0663 0.0656 0.0649 0.064 0.063 0.062 0.0596 0.0554 0.0475 0.039 0.0309 0.0236 0.0177 0.0098 0.0052 0.0047 0.0015 0.00029 0.00016 6.4e-05 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0396 0.0395 0.0393 0.0386 0.0374 0.0355 0.0331 0.0301 0.023 0.0084 0.0025 0.0015 0.0011 0.00034 3.4e-05 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0432 0.0431 0.0431 0.0431 0.0431 0.0429 0.0426 0.0417 0.0399 0.0373 0.034 0.0301 0.022 0.0065 0.0022 0.0017 0.001 0.00022 1.3e-05 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0277 0.0275 0.0271 0.0265 0.025 0.017 0.009 0.002 0.00045 3.2e-05 7.1e-07 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0286 0.0285 0.0282 0.0278 0.0271 0.025 0.016 0.0086 0.0018 0.00037 2.4e-05 4e-07 0.138 0.138 0.138 0.137 0.137 0.136 0.135 0.134 0.133 0.131 0.129 0.124 0.119 0.113 0.106 0.0993 0.0921 0.0775 0.0569 0.0314 0.0185 0.0143 0.0138 0.0136 0.01 0.002 0.0013 0.00053 9.5e-05 4.1e-05 1.7e-05 0.0866 0.0866 0.0866 0.0866 0.0866 0.0866 0.0866 0.0866 0.0866 0.0865 0.0865 0.0864 0.0861 0.0857 0.0852 0.0844 0.0834 0.0805 0.0741 0.0586 0.041 0.0257 0.0151 0.00918 0.0058 0.0043 0.0014 0.00033 0.00028 8.9e-05 8.8e-06 0.0939 0.0939 0.0939 0.0939 0.0939 0.0939 0.0939 0.0938 0.0938 0.0938 0.0937 0.0935 0.0931 0.0926 0.0917 0.0906 0.0891 0.0851 0.0764 0.0569 0.0368 0.0213 0.0121 0.00782 0.0063 0.0037 0.00093 0.0004 0.00027 5.9e-05 3.5e-06 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0702 0.0702 0.0702 0.0701 0.0699 0.0694 0.0677 0.0615 0.0513 0.039 0.0273 0.0178 0.0068 0.0024 0.0021 0.00059 0.00014 9.6e-06 2e-07 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.072 0.0719 0.0718 0.0716 0.071 0.0691 0.0622 0.0511 0.0381 0.0261 0.0167 0.0062 0.0025 0.002 0.00053 0.00011 7.1e-06 1.1e-07 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0588 0.0586 0.058 0.0551 0.0498 0.0427 0.035 0.0277 0.016 0.0036 0.0008 5.1e-05 5e-06 1.2e-07 8.1e-10 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0597 0.0596 0.0596 0.0596 0.0594 0.0587 0.0556 0.05 0.0426 0.0348 0.0274 0.016 0.0035 0.00075 4.6e-05 4.3e-06 9.6e-08 5.3e-10 0.314 0.313 0.312 0.31 0.307 0.3 0.289 0.276 0.261 0.245 0.227 0.19 0.153 0.12 0.0919 0.0695 0.0528 0.0341 0.0275 0.0253 0.0159 0.00748 0.00382 0.00302 0.0028 0.00056 0.00027 0.00012 2.1e-05 8.4e-06 3.5e-06 0.207 0.207 0.207 0.207 0.207 0.207 0.207 0.206 0.205 0.203 0.201 0.193 0.181 0.166 0.149 0.129 0.109 0.0729 0.0347 0.0129 0.0115 0.0102 0.00702 0.00405 0.0013 0.00089 0.00031 6e-05 5.2e-05 1.7e-05 1.7e-06 0.228 0.228 0.228 0.228 0.228 0.228 0.227 0.226 0.224 0.222 0.218 0.206 0.19 0.17 0.147 0.123 0.0997 0.0609 0.0264 0.0125 0.0119 0.00914 0.00539 0.00279 0.0012 0.00078 0.0002 7.1e-05 4.9e-05 1.1e-05 6.3e-07 0.208 0.208 0.208 0.208 0.208 0.208 0.208 0.208 0.208 0.207 0.205 0.2 0.19 0.176 0.159 0.139 0.12 0.0819 0.0404 0.0105 0.00487 0.0046 0.00418 0.00321 0.0013 0.00028 0.00025 7.7e-05 1.8e-05 1.3e-06 2.6e-08 0.214 0.214 0.214 0.214 0.214 0.214 0.214 0.214 0.214 0.213 0.211 0.205 0.194 0.178 0.159 0.139 0.117 0.0783 0.037 0.0093 0.00478 0.00461 0.00405 0.003 0.0012 0.00028 0.00024 6.8e-05 1.5e-05 9e-07 1.4e-08 0.955 0.945 0.916 0.87 0.809 0.661 0.501 0.356 0.24 0.156 0.102 0.0544 0.0458 0.0454 0.0425 0.0361 0.0282 0.0143 0.00506 0.00359 0.00269 0.00132 0.000587 0.000389 0.00036 7.5e-05 3.4e-05 1.5e-05 2.6e-06 1e-06 4.3e-07 0.713 0.713 0.712 0.709 0.7 0.66 0.586 0.487 0.381 0.282 0.199 0.09 0.0389 0.0197 0.0145 0.0138 0.0137 0.0116 0.00626 0.00154 0.000937 0.000889 0.000656 0.000389 0.00012 7.4e-05 2.6e-05 4.9e-06 4.3e-06 1.4e-06 1.4e-07 0.832 0.832 0.83 0.823 0.807 0.733 0.612 0.468 0.333 0.223 0.142 0.0538 0.0224 0.0143 0.0133 0.0131 0.0123 0.0088 0.00377 0.000981 0.000839 0.000696 0.000428 0.000221 8.2e-05 5.5e-05 1.4e-05 4.9e-06 3.4e-06 7.4e-07 4.3e-08 +Z 84 24 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 2.0 93424.0 16918.0 16296.999999999998 13817.0 4127.6 3840.2000000000003 3281.5 2803.5 2685.1000000000004 971.64 844.3 704.96 495.56000000000006 469.54 195.5 189.29999999999998 181.34 135.73 107.52 42.160000000000004 38.510000000000005 20.330000000000002 10.25 7.4399999999999995 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00852 0.00851 0.00851 0.00851 0.00851 0.0085 0.00848 0.00845 0.00842 0.00838 0.00834 0.0082 0.0079 0.0074 0.0064 0.0052 0.0032 0.0011 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0304 0.0303 0.0303 0.0303 0.0302 0.0302 0.0301 0.03 0.0299 0.0297 0.0294 0.0286 0.0276 0.0265 0.0252 0.0238 0.021 0.013 0.0073 0.0018 0.00079 0.00069 0.00026 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0146 0.0146 0.014 0.013 0.012 0.0075 0.0041 0.0011 0.00012 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0169 0.0168 0.0167 0.0166 0.016 0.015 0.012 0.0069 0.0033 0.00067 4.4e-05 0.0666 0.0666 0.0666 0.0666 0.0666 0.0665 0.0664 0.0663 0.0661 0.0659 0.0657 0.0652 0.0646 0.0639 0.063 0.0621 0.0611 0.0588 0.0548 0.0472 0.0391 0.0311 0.024 0.0181 0.01 0.0051 0.0047 0.0016 0.00031 0.00016 6.7e-05 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.0389 0.0389 0.0389 0.0389 0.0389 0.0388 0.0386 0.038 0.0369 0.0352 0.0328 0.03 0.023 0.0088 0.0027 0.0014 0.0011 0.00035 3.7e-05 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0425 0.0424 0.0423 0.042 0.0411 0.0395 0.037 0.0338 0.0301 0.022 0.0068 0.0022 0.0017 0.0011 0.00023 1.4e-05 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0273 0.0271 0.0267 0.0262 0.024 0.017 0.0092 0.0021 0.00048 3.5e-05 8e-07 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0282 0.0281 0.028 0.0278 0.0274 0.0268 0.025 0.017 0.0088 0.0019 0.0004 2.6e-05 4.4e-07 0.135 0.135 0.135 0.135 0.134 0.134 0.133 0.132 0.13 0.129 0.127 0.122 0.117 0.111 0.105 0.0985 0.0916 0.0775 0.0576 0.0323 0.0189 0.0143 0.0136 0.0135 0.01 0.0021 0.0013 0.00057 0.0001 4.1e-05 1.8e-05 0.0848 0.0848 0.0848 0.0848 0.0848 0.0848 0.0848 0.0848 0.0848 0.0848 0.0847 0.0846 0.0844 0.084 0.0835 0.0828 0.0819 0.0792 0.0733 0.0587 0.0418 0.0267 0.016 0.00966 0.0058 0.0044 0.0015 0.00032 0.00028 9.4e-05 9.7e-06 0.0921 0.0921 0.0921 0.0921 0.0921 0.0921 0.0921 0.0921 0.0921 0.092 0.092 0.0918 0.0914 0.0909 0.0901 0.0891 0.0878 0.084 0.0759 0.0573 0.0377 0.0222 0.0127 0.00808 0.0062 0.0039 0.001 0.0004 0.00028 6.3e-05 3.8e-06 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0688 0.0687 0.0686 0.0685 0.068 0.0665 0.061 0.0514 0.0397 0.0282 0.0187 0.0073 0.0024 0.0021 0.00063 0.00015 1.1e-05 2.3e-07 0.0706 0.0706 0.0706 0.0706 0.0706 0.0706 0.0706 0.0706 0.0706 0.0706 0.0706 0.0705 0.0705 0.0705 0.0705 0.0704 0.0702 0.0697 0.068 0.0617 0.0513 0.0389 0.0271 0.0176 0.0067 0.0025 0.0021 0.00057 0.00012 7.9e-06 1.3e-07 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0573 0.0572 0.0572 0.0571 0.0565 0.0541 0.0494 0.0429 0.0356 0.0285 0.017 0.0039 0.00089 5.8e-05 5.8e-06 1.4e-07 9.7e-10 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.0578 0.0572 0.0546 0.0497 0.0429 0.0354 0.0282 0.017 0.0038 0.00083 5.3e-05 5e-06 1.1e-07 6.3e-10 0.303 0.303 0.302 0.3 0.297 0.29 0.281 0.269 0.255 0.24 0.224 0.189 0.155 0.123 0.095 0.0726 0.0555 0.0355 0.0275 0.0257 0.017 0.00829 0.00413 0.00308 0.0029 0.00063 0.00028 0.00013 2.4e-05 8.6e-06 3.7e-06 0.2 0.2 0.2 0.2 0.2 0.2 0.199 0.199 0.198 0.196 0.194 0.188 0.178 0.164 0.148 0.13 0.112 0.0767 0.038 0.0137 0.0115 0.0105 0.00758 0.00452 0.0015 0.00094 0.00035 6.1e-05 5.4e-05 1.8e-05 1.9e-06 0.22 0.22 0.22 0.22 0.22 0.22 0.219 0.218 0.217 0.215 0.211 0.201 0.187 0.169 0.147 0.125 0.103 0.0651 0.0291 0.0128 0.0122 0.00971 0.00595 0.00314 0.0012 0.00084 0.00023 7.3e-05 5.3e-05 1.2e-05 7.1e-07 0.197 0.197 0.197 0.197 0.197 0.197 0.197 0.197 0.197 0.196 0.195 0.191 0.184 0.173 0.158 0.142 0.124 0.088 0.0457 0.0125 0.00529 0.00481 0.00449 0.00356 0.0016 0.0003 0.00027 8.8e-05 2.1e-05 1.5e-06 3.2e-08 0.203 0.203 0.203 0.203 0.203 0.203 0.203 0.203 0.203 0.202 0.201 0.196 0.188 0.175 0.159 0.141 0.122 0.0846 0.0422 0.011 0.00512 0.00484 0.00439 0.00335 0.0014 0.0003 0.00026 7.8e-05 1.7e-05 1.1e-06 1.7e-08 0.887 0.878 0.855 0.817 0.767 0.641 0.502 0.371 0.26 0.176 0.118 0.0609 0.0473 0.0464 0.0448 0.0397 0.0322 0.0176 0.00617 0.00386 0.0031 0.00161 0.000714 0.000437 0.0004 9.1e-05 3.7e-05 1.8e-05 3.2e-06 1.1e-06 5e-07 0.645 0.645 0.645 0.643 0.637 0.611 0.559 0.485 0.398 0.31 0.232 0.116 0.0538 0.0266 0.0173 0.0153 0.0152 0.0138 0.00815 0.00209 0.0011 0.00106 0.000823 0.000509 0.00016 9e-05 3.5e-05 5.8e-06 5.2e-06 1.8e-06 1.8e-07 0.753 0.753 0.752 0.747 0.736 0.687 0.598 0.483 0.366 0.261 0.178 0.0747 0.0316 0.0178 0.015 0.0148 0.0144 0.0111 0.00519 0.00128 0.001 0.000872 0.000562 0.000299 0.0001 6.9e-05 1.9e-05 5.9e-06 4.3e-06 9.7e-07 5.8e-08 +Z 85 24 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 3.0 96068.0 17473.0 16840.0 14215.0 4285.5 3991.8 3398.5 2911.4 2786.2 1021.4 890.65 741.71 527.0799999999999 499.28 217.93 211.20000000000002 196.26999999999998 148.78 117.82 49.2 45.06 23.01 11.94 8.54 0.00838 0.00838 0.00838 0.00838 0.00838 0.00838 0.00838 0.00838 0.00838 0.00838 0.00838 0.00837 0.00837 0.00837 0.00837 0.00837 0.00837 0.00836 0.00835 0.00833 0.00831 0.00828 0.00824 0.0082 0.0081 0.0078 0.0074 0.0063 0.0052 0.0032 0.0011 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0299 0.0298 0.0298 0.0298 0.0297 0.0297 0.0296 0.0295 0.0295 0.0293 0.0289 0.0282 0.0272 0.0262 0.0249 0.0236 0.021 0.013 0.0075 0.0019 0.00079 0.00069 0.00027 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0144 0.0144 0.0143 0.014 0.013 0.012 0.0076 0.0043 0.0012 0.00013 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0167 0.0166 0.0166 0.0165 0.0164 0.016 0.015 0.012 0.0069 0.0034 0.00071 4.8e-05 0.0655 0.0655 0.0655 0.0655 0.0655 0.0654 0.0653 0.0652 0.065 0.0648 0.0646 0.0642 0.0636 0.0629 0.0621 0.0612 0.0602 0.0581 0.0543 0.047 0.0391 0.0314 0.0244 0.0185 0.01 0.0051 0.0047 0.0017 0.00033 0.00016 6.9e-05 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0383 0.0382 0.0382 0.0382 0.038 0.0374 0.0364 0.0347 0.0326 0.0299 0.024 0.0091 0.0028 0.0014 0.0011 0.00037 4e-05 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0418 0.0418 0.0417 0.0414 0.0406 0.039 0.0367 0.0337 0.0301 0.022 0.0071 0.0023 0.0017 0.0011 0.00025 1.5e-05 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.0269 0.0267 0.0264 0.0259 0.024 0.017 0.0095 0.0023 0.00052 3.9e-05 8.9e-07 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0278 0.0277 0.0276 0.0274 0.0271 0.0265 0.025 0.017 0.0091 0.002 0.00043 2.8e-05 4.9e-07 0.132 0.132 0.132 0.132 0.132 0.131 0.13 0.129 0.128 0.126 0.124 0.12 0.115 0.11 0.104 0.0977 0.0911 0.0776 0.0582 0.0331 0.0194 0.0143 0.0134 0.0133 0.011 0.0022 0.0013 0.00061 0.00012 4e-05 1.8e-05 0.0831 0.0831 0.0831 0.0831 0.0831 0.0831 0.0831 0.0831 0.0831 0.0831 0.083 0.0829 0.0827 0.0824 0.0819 0.0813 0.0804 0.078 0.0725 0.0588 0.0426 0.0277 0.0168 0.0102 0.0058 0.0045 0.0016 0.00032 0.00029 0.0001 1.1e-05 0.0904 0.0904 0.0904 0.0904 0.0904 0.0904 0.0904 0.0904 0.0903 0.0903 0.0903 0.0901 0.0898 0.0893 0.0886 0.0876 0.0864 0.0829 0.0753 0.0577 0.0386 0.0232 0.0133 0.00837 0.0062 0.004 0.0011 0.0004 0.00029 6.7e-05 4.1e-06 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0674 0.0673 0.0673 0.0672 0.0667 0.0654 0.0603 0.0515 0.0403 0.0291 0.0196 0.0078 0.0024 0.0021 0.00067 0.00016 1.2e-05 2.6e-07 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.0691 0.069 0.0688 0.0684 0.0668 0.0611 0.0515 0.0396 0.028 0.0185 0.0071 0.0025 0.0021 0.00061 0.00013 8.7e-06 1.5e-07 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0558 0.0557 0.0557 0.0557 0.0556 0.0552 0.0531 0.049 0.043 0.0361 0.0292 0.018 0.0043 0.00099 6.7e-05 6.6e-06 1.7e-07 1.2e-09 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0564 0.0563 0.0559 0.0537 0.0492 0.043 0.0359 0.0289 0.017 0.0041 0.00092 6e-05 5.7e-06 1.3e-07 7.4e-10 0.293 0.293 0.292 0.29 0.288 0.281 0.273 0.262 0.249 0.235 0.22 0.188 0.155 0.125 0.0978 0.0755 0.0582 0.037 0.0275 0.026 0.018 0.00915 0.0045 0.00316 0.0029 0.00071 0.00028 0.00014 2.7e-05 8.7e-06 4e-06 0.193 0.193 0.193 0.193 0.193 0.193 0.193 0.192 0.191 0.19 0.188 0.183 0.174 0.162 0.147 0.131 0.114 0.0802 0.0412 0.0145 0.0116 0.0109 0.00812 0.00502 0.0016 0.00098 0.00039 6.3e-05 5.6e-05 2e-05 2.1e-06 0.212 0.212 0.212 0.212 0.212 0.212 0.212 0.211 0.21 0.208 0.205 0.196 0.184 0.167 0.148 0.127 0.106 0.069 0.0319 0.0132 0.0124 0.0102 0.00653 0.00353 0.0013 0.00089 0.00025 7.5e-05 5.6e-05 1.3e-05 8e-07 0.188 0.188 0.188 0.188 0.188 0.188 0.188 0.188 0.187 0.187 0.186 0.183 0.178 0.169 0.157 0.142 0.126 0.093 0.0509 0.0147 0.00577 0.00498 0.00476 0.00389 0.0018 0.00032 0.00029 9.9e-05 2.4e-05 1.8e-06 3.9e-08 0.194 0.194 0.194 0.194 0.194 0.194 0.194 0.194 0.193 0.193 0.192 0.188 0.182 0.172 0.158 0.142 0.125 0.0899 0.0472 0.013 0.00552 0.00503 0.00468 0.00369 0.0016 0.00032 0.00028 8.8e-05 2e-05 1.3e-06 2.1e-08 0.83 0.823 0.803 0.771 0.729 0.622 0.5 0.38 0.276 0.193 0.132 0.068 0.049 0.0468 0.0461 0.0423 0.0357 0.0209 0.00748 0.00409 0.00347 0.00191 0.00086 0.000491 0.00043 0.00011 4e-05 2.1e-05 3.9e-06 1.2e-06 5.6e-07 0.593 0.593 0.593 0.591 0.588 0.569 0.532 0.474 0.404 0.328 0.256 0.14 0.0695 0.0347 0.0209 0.0168 0.0163 0.0155 0.0101 0.00275 0.00127 0.00121 0.000988 0.000639 0.0002 0.00011 4.3e-05 6.7e-06 6e-06 2.2e-06 2.3e-07 0.692 0.692 0.692 0.689 0.681 0.646 0.578 0.486 0.385 0.289 0.207 0.0954 0.0421 0.022 0.0166 0.016 0.0158 0.0132 0.00671 0.00162 0.00115 0.00104 0.0007 0.000385 0.00013 8.4e-05 2.4e-05 6.9e-06 5.2e-06 1.2e-06 7.4e-08 +Z 86 24 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 98764.0 18042.0 17396.0 14619.0 4447.7 4147.6 3517.9 3021.6000000000004 2889.3 1072.7 938.51 779.39 559.5 529.8199999999999 241.16 233.87 211.69 162.29 128.37 56.49 51.839999999999996 25.720000000000002 13.69 9.639999999999999 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00823 0.00822 0.00822 0.00821 0.00819 0.00817 0.00814 0.0081 0.00806 0.008 0.0077 0.0073 0.0063 0.0052 0.0032 0.0011 0.0294 0.0294 0.0294 0.0294 0.0294 0.0294 0.0294 0.0294 0.0294 0.0294 0.0293 0.0293 0.0293 0.0292 0.0291 0.0291 0.029 0.0288 0.0285 0.0278 0.0269 0.0258 0.0247 0.0234 0.021 0.013 0.0077 0.002 0.0008 0.00068 0.00028 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0142 0.0141 0.0141 0.014 0.013 0.012 0.0076 0.0044 0.0013 0.00015 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0165 0.0164 0.0164 0.0164 0.0164 0.0163 0.0162 0.016 0.015 0.012 0.007 0.0034 0.00074 5.1e-05 0.0644 0.0644 0.0644 0.0644 0.0644 0.0643 0.0642 0.0641 0.064 0.0638 0.0636 0.0631 0.0626 0.0619 0.0612 0.0603 0.0594 0.0573 0.0537 0.0467 0.0391 0.0316 0.0247 0.0189 0.011 0.005 0.0047 0.0017 0.00036 0.00015 7.2e-05 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0376 0.0375 0.0374 0.0368 0.0359 0.0343 0.0323 0.0297 0.024 0.0095 0.003 0.0014 0.0012 0.00039 4.3e-05 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0413 0.0412 0.0412 0.0412 0.0411 0.0409 0.04 0.0386 0.0364 0.0335 0.0301 0.022 0.0074 0.0024 0.0017 0.0011 0.00026 1.7e-05 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0265 0.0265 0.0263 0.026 0.0255 0.024 0.017 0.0097 0.0024 0.00056 4.3e-05 9.9e-07 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0274 0.0273 0.0273 0.0271 0.0267 0.0262 0.024 0.017 0.0093 0.0021 0.00046 3.1e-05 5.5e-07 0.13 0.13 0.129 0.129 0.129 0.129 0.128 0.127 0.125 0.124 0.122 0.118 0.114 0.109 0.103 0.0968 0.0905 0.0775 0.0588 0.0339 0.0199 0.0144 0.0133 0.0132 0.011 0.0024 0.0013 0.00065 0.00013 4e-05 1.9e-05 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0814 0.0812 0.0811 0.0808 0.0803 0.0798 0.079 0.0768 0.0717 0.0588 0.0433 0.0287 0.0177 0.0108 0.0058 0.0046 0.0017 0.00032 0.00029 0.00011 1.2e-05 0.0887 0.0887 0.0887 0.0887 0.0887 0.0887 0.0887 0.0887 0.0887 0.0887 0.0886 0.0885 0.0882 0.0877 0.0871 0.0862 0.0851 0.0819 0.0747 0.058 0.0395 0.0241 0.014 0.00869 0.0062 0.0042 0.0012 0.0004 0.0003 7.2e-05 4.5e-06 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.0661 0.066 0.066 0.066 0.0659 0.0658 0.0655 0.0643 0.0597 0.0515 0.0409 0.03 0.0205 0.0084 0.0024 0.0022 0.00072 0.00017 1.3e-05 3e-07 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0678 0.0677 0.0676 0.0675 0.0671 0.0657 0.0606 0.0515 0.0402 0.0289 0.0193 0.0076 0.0025 0.0021 0.00065 0.00015 9.7e-06 1.6e-07 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0543 0.0542 0.0539 0.0521 0.0484 0.043 0.0365 0.0299 0.019 0.0046 0.0011 7.6e-05 7.7e-06 2e-07 1.4e-09 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.055 0.0549 0.0545 0.0527 0.0488 0.043 0.0364 0.0296 0.018 0.0044 0.001 6.8e-05 6.6e-06 1.5e-07 8.8e-10 0.284 0.283 0.282 0.281 0.279 0.273 0.265 0.255 0.243 0.23 0.216 0.186 0.156 0.126 0.1 0.0783 0.0608 0.0386 0.0276 0.0261 0.019 0.01 0.00492 0.00327 0.003 0.00079 0.00029 0.00016 3.1e-05 8.8e-06 4.2e-06 0.187 0.187 0.187 0.187 0.187 0.187 0.186 0.186 0.185 0.184 0.183 0.178 0.17 0.159 0.146 0.131 0.115 0.0833 0.0444 0.0155 0.0116 0.0111 0.00864 0.00552 0.0018 0.001 0.00043 6.5e-05 5.8e-05 2.2e-05 2.4e-06 0.205 0.205 0.205 0.205 0.205 0.205 0.205 0.204 0.203 0.201 0.199 0.191 0.18 0.165 0.148 0.129 0.109 0.0727 0.0348 0.0137 0.0125 0.0107 0.00711 0.00395 0.0014 0.00095 0.00028 7.7e-05 5.9e-05 1.4e-05 9e-07 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.179 0.178 0.176 0.172 0.164 0.155 0.142 0.128 0.0972 0.0558 0.017 0.00635 0.00514 0.00499 0.00421 0.0021 0.00034 0.00031 0.00011 2.7e-05 2.1e-06 4.6e-08 0.185 0.185 0.185 0.185 0.185 0.185 0.185 0.185 0.185 0.185 0.184 0.181 0.176 0.168 0.156 0.143 0.127 0.0943 0.052 0.0151 0.00598 0.00519 0.00494 0.00401 0.0018 0.00034 0.0003 9.9e-05 2.3e-05 1.5e-06 2.5e-08 0.782 0.776 0.759 0.732 0.696 0.602 0.494 0.386 0.288 0.207 0.146 0.0755 0.0512 0.0469 0.0466 0.0441 0.0386 0.0241 0.00899 0.00428 0.00381 0.00223 0.00103 0.000553 0.00046 0.00013 4.3e-05 2.4e-05 4.7e-06 1.3e-06 6.3e-07 0.551 0.551 0.55 0.549 0.547 0.534 0.505 0.461 0.403 0.338 0.273 0.16 0.0852 0.0439 0.0252 0.0186 0.0172 0.0167 0.0119 0.00353 0.00144 0.00135 0.00115 0.000775 0.00025 0.00012 5.3e-05 7.6e-06 6.8e-06 2.6e-06 2.8e-07 0.644 0.644 0.643 0.641 0.636 0.609 0.557 0.483 0.396 0.308 0.23 0.115 0.0535 0.0271 0.0185 0.0169 0.0168 0.0148 0.00828 0.00203 0.00127 0.00119 0.00084 0.000478 0.00015 9.8e-05 3e-05 7.8e-06 6e-06 1.5e-06 9.1e-08 +Z 87 25 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 1.0 101520.0 18630.0 17971.0 15034.0 4619.1 4312.5 3644.5 3138.9 2999.2 1130.3000000000002 992.69 822.8000000000001 597.6 565.9499999999999 269.95 262.07 232.33999999999997 181.0 143.91 68.73 63.52 32.64 19.279999999999998 14.14 3.8 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00809 0.00808 0.00808 0.00807 0.00805 0.00803 0.008 0.00797 0.00793 0.0078 0.0075 0.0072 0.0062 0.0051 0.0032 0.0012 0.0289 0.0289 0.0289 0.0289 0.0289 0.0289 0.0289 0.0289 0.0289 0.0289 0.0289 0.0288 0.0288 0.0287 0.0287 0.0286 0.0285 0.0284 0.028 0.0274 0.0265 0.0255 0.0244 0.0232 0.021 0.014 0.0079 0.0021 0.0008 0.00068 0.00029 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.0139 0.0139 0.0139 0.0139 0.013 0.011 0.0077 0.0045 0.0013 0.00016 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0162 0.0161 0.016 0.016 0.014 0.012 0.0071 0.0035 0.00078 5.5e-05 0.0634 0.0634 0.0633 0.0633 0.0633 0.0632 0.0632 0.0631 0.0629 0.0628 0.0626 0.0621 0.0616 0.061 0.0603 0.0595 0.0586 0.0566 0.0531 0.0464 0.039 0.0317 0.025 0.0192 0.011 0.0049 0.0047 0.0018 0.00039 0.00015 7.4e-05 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.037 0.0369 0.0369 0.0367 0.0363 0.0353 0.0339 0.032 0.0296 0.024 0.0099 0.0032 0.0014 0.0012 0.00041 4.7e-05 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0407 0.0406 0.0406 0.0405 0.0403 0.0395 0.0382 0.0361 0.0333 0.03 0.023 0.0077 0.0024 0.0017 0.0011 0.00027 1.8e-05 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0261 0.0259 0.0257 0.0252 0.024 0.017 0.0099 0.0025 0.0006 4.7e-05 1.1e-06 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.0269 0.0267 0.0264 0.0259 0.024 0.017 0.0095 0.0022 0.0005 3.4e-05 6.1e-07 0.127 0.127 0.127 0.127 0.127 0.126 0.125 0.124 0.123 0.122 0.12 0.116 0.112 0.107 0.102 0.0959 0.0899 0.0774 0.0592 0.0348 0.0204 0.0144 0.0131 0.013 0.011 0.0026 0.0013 0.00068 0.00014 3.9e-05 2e-05 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0797 0.0796 0.0795 0.0792 0.0788 0.0783 0.0776 0.0755 0.0708 0.0588 0.0439 0.0296 0.0185 0.0113 0.0059 0.0047 0.0019 0.00032 0.00029 0.00011 1.3e-05 0.0871 0.0871 0.0871 0.0871 0.0871 0.0871 0.0871 0.0871 0.0871 0.0871 0.087 0.0869 0.0866 0.0862 0.0856 0.0848 0.0837 0.0808 0.0741 0.0582 0.0403 0.025 0.0146 0.00904 0.0061 0.0043 0.0013 0.0004 0.00031 7.6e-05 4.9e-06 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0647 0.0647 0.0647 0.0647 0.0646 0.0646 0.0642 0.0632 0.059 0.0514 0.0413 0.0308 0.0214 0.009 0.0024 0.0022 0.00076 0.00019 1.5e-05 3.4e-07 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0665 0.0664 0.0664 0.0664 0.0663 0.0659 0.0647 0.0599 0.0515 0.0407 0.0297 0.0202 0.0082 0.0025 0.0022 0.00069 0.00016 1.1e-05 1.8e-07 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.053 0.0529 0.0529 0.0526 0.0511 0.0479 0.0429 0.0368 0.0305 0.019 0.005 0.0012 8.5e-05 8.8e-06 2.3e-07 1.6e-09 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0537 0.0536 0.0536 0.0533 0.0517 0.0483 0.043 0.0367 0.0302 0.019 0.0047 0.0011 7.7e-05 7.6e-06 1.8e-07 1e-09 0.275 0.274 0.273 0.272 0.27 0.265 0.258 0.248 0.238 0.226 0.213 0.185 0.156 0.128 0.103 0.0809 0.0633 0.0402 0.0277 0.0262 0.0199 0.011 0.0054 0.0034 0.003 0.00088 0.00029 0.00017 3.5e-05 8.8e-06 4.5e-06 0.181 0.181 0.181 0.181 0.181 0.18 0.18 0.18 0.179 0.178 0.177 0.173 0.166 0.157 0.145 0.131 0.116 0.086 0.0475 0.0166 0.0116 0.0113 0.00912 0.00604 0.002 0.001 0.00048 6.7e-05 6e-05 2.4e-05 2.7e-06 0.199 0.199 0.199 0.199 0.199 0.198 0.198 0.198 0.197 0.195 0.193 0.187 0.177 0.163 0.148 0.13 0.111 0.0761 0.0376 0.0143 0.0126 0.0112 0.00767 0.00438 0.0015 0.001 0.00032 7.9e-05 6.3e-05 1.6e-05 1e-06 0.172 0.172 0.172 0.172 0.172 0.172 0.172 0.172 0.171 0.171 0.171 0.169 0.166 0.16 0.152 0.141 0.129 0.101 0.0603 0.0196 0.00703 0.00529 0.00519 0.0045 0.0023 0.00037 0.00032 0.00012 3.1e-05 2.4e-06 5.5e-08 0.177 0.177 0.177 0.177 0.177 0.177 0.177 0.177 0.177 0.177 0.176 0.174 0.17 0.163 0.154 0.142 0.128 0.0982 0.0567 0.0174 0.00654 0.00535 0.00518 0.00433 0.0021 0.00036 0.00032 0.00011 2.6e-05 1.7e-06 3e-08 0.714 0.709 0.696 0.675 0.646 0.572 0.483 0.39 0.302 0.226 0.165 0.0883 0.0567 0.0488 0.0483 0.047 0.0427 0.0286 0.0113 0.00468 0.0043 0.00269 0.00127 0.000655 0.00051 0.00016 4.8e-05 2.8e-05 5.8e-06 1.4e-06 7.4e-07 0.496 0.496 0.496 0.496 0.494 0.486 0.468 0.437 0.395 0.345 0.291 0.187 0.108 0.0587 0.0331 0.0224 0.0192 0.0187 0.0144 0.00473 0.00174 0.00155 0.00138 0.000974 0.00032 0.00014 6.7e-05 9.1e-06 8.1e-06 3.2e-06 3.6e-07 0.571 0.571 0.57 0.569 0.566 0.551 0.518 0.468 0.404 0.333 0.264 0.148 0.0748 0.038 0.0235 0.0195 0.0191 0.0178 0.0109 0.0028 0.00153 0.00146 0.00108 0.000639 0.0002 0.00012 4e-05 9.5e-06 7.5e-06 1.9e-06 1.2e-07 2.65 2.47 2.01 1.44 0.908 0.274 0.0952 0.0754 0.0732 0.0617 0.0458 0.02 0.00794 0.00403 0.00326 0.00322 0.00309 0.00223 0.000893 0.000298 0.000275 0.000176 8.37e-05 4.2e-05 3.2e-05 1e-05 3e-06 1.7e-06 3.6e-07 9e-08 4.6e-08 +Z 88 25 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 2.0 104320.0 19232.0 18560.0 15456.0 4795.1 4482.0 3773.7000000000003 3258.7 3111.3 1189.6999999999998 1048.6 867.3100000000001 636.7700000000001 603.06 299.70000000000005 291.19 253.63000000000002 200.32 159.82999999999998 81.32000000000001 75.52 39.54 24.88 18.62 4.7299999999999995 0.00796 0.00796 0.00796 0.00796 0.00796 0.00796 0.00796 0.00796 0.00796 0.00796 0.00796 0.00795 0.00795 0.00795 0.00795 0.00795 0.00795 0.00794 0.00793 0.00792 0.0079 0.00787 0.00784 0.0078 0.0077 0.0074 0.0071 0.0061 0.0051 0.0033 0.0012 0.0285 0.0285 0.0285 0.0285 0.0285 0.0285 0.0284 0.0284 0.0284 0.0284 0.0284 0.0284 0.0283 0.0283 0.0282 0.0281 0.0281 0.0279 0.0276 0.027 0.0262 0.0252 0.0241 0.023 0.02 0.014 0.0081 0.0022 0.00082 0.00067 0.0003 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0137 0.0136 0.013 0.013 0.011 0.0077 0.0046 0.0014 0.00017 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.016 0.0159 0.0158 0.0158 0.014 0.012 0.0072 0.0036 0.00082 5.8e-05 0.0623 0.0623 0.0623 0.0623 0.0623 0.0622 0.0621 0.062 0.0619 0.0617 0.0616 0.0611 0.0606 0.06 0.0594 0.0586 0.0578 0.0559 0.0525 0.0461 0.039 0.0319 0.0253 0.0196 0.011 0.0049 0.0047 0.0019 0.00043 0.00015 7.6e-05 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0363 0.0363 0.0363 0.0363 0.0361 0.0357 0.0348 0.0335 0.0317 0.0294 0.024 0.01 0.0033 0.0013 0.0012 0.00043 5.1e-05 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.0401 0.04 0.0399 0.0397 0.039 0.0377 0.0358 0.0332 0.03 0.023 0.008 0.0025 0.0017 0.0012 0.00029 1.9e-05 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0257 0.0256 0.0253 0.0249 0.024 0.017 0.01 0.0026 0.00064 5.1e-05 1.2e-06 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0266 0.0265 0.0263 0.0261 0.0256 0.024 0.017 0.0097 0.0023 0.00053 3.7e-05 6.8e-07 0.125 0.125 0.124 0.124 0.124 0.124 0.123 0.122 0.121 0.12 0.118 0.115 0.11 0.106 0.101 0.095 0.0893 0.0773 0.0597 0.0355 0.0209 0.0146 0.013 0.0129 0.011 0.0028 0.0013 0.00072 0.00016 3.9e-05 2.1e-05 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0782 0.0781 0.0779 0.0777 0.0773 0.0768 0.0762 0.0743 0.07 0.0587 0.0445 0.0305 0.0194 0.012 0.006 0.0048 0.002 0.00032 0.00029 0.00012 1.4e-05 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0856 0.0855 0.0855 0.0855 0.0853 0.0851 0.0847 0.0842 0.0834 0.0825 0.0797 0.0735 0.0584 0.041 0.0259 0.0153 0.00942 0.0061 0.0044 0.0014 0.0004 0.00031 8.1e-05 5.3e-06 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0635 0.0634 0.0634 0.0633 0.0631 0.0621 0.0583 0.0513 0.0418 0.0315 0.0222 0.0096 0.0024 0.0022 0.0008 0.0002 1.6e-05 3.8e-07 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0652 0.0651 0.065 0.0647 0.0636 0.0593 0.0515 0.0412 0.0305 0.021 0.0087 0.0025 0.0022 0.00073 0.00017 1.2e-05 2.1e-07 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0517 0.0516 0.0514 0.0502 0.0473 0.0428 0.0371 0.031 0.02 0.0053 0.0013 9.6e-05 1e-05 2.7e-07 1.9e-09 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0524 0.0523 0.0521 0.0507 0.0477 0.0429 0.037 0.0308 0.02 0.0051 0.0012 8.6e-05 8.6e-06 2.1e-07 1.2e-09 0.266 0.266 0.265 0.264 0.262 0.257 0.25 0.242 0.232 0.221 0.209 0.183 0.155 0.129 0.105 0.0833 0.0658 0.0419 0.028 0.0261 0.0207 0.0119 0.00593 0.00357 0.0031 0.00098 0.0003 0.00018 3.9e-05 8.9e-06 4.8e-06 0.175 0.175 0.175 0.175 0.175 0.175 0.175 0.174 0.174 0.173 0.172 0.168 0.162 0.154 0.143 0.131 0.117 0.0884 0.0506 0.0179 0.0117 0.0114 0.00955 0.00655 0.0023 0.0011 0.00053 7e-05 6.1e-05 2.5e-05 3e-06 0.192 0.192 0.192 0.192 0.192 0.192 0.192 0.192 0.191 0.19 0.188 0.182 0.173 0.161 0.147 0.13 0.113 0.0791 0.0404 0.015 0.0126 0.0115 0.00822 0.00484 0.0016 0.0011 0.00035 8.1e-05 6.6e-05 1.7e-05 1.1e-06 0.165 0.165 0.165 0.165 0.165 0.165 0.165 0.165 0.164 0.164 0.164 0.163 0.16 0.156 0.149 0.14 0.129 0.103 0.0646 0.0223 0.00782 0.00544 0.00535 0.00478 0.0026 0.00039 0.00034 0.00014 3.5e-05 2.8e-06 6.5e-08 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.169 0.169 0.168 0.164 0.159 0.151 0.141 0.129 0.101 0.0612 0.0199 0.00721 0.00549 0.00538 0.00463 0.0023 0.00038 0.00034 0.00012 2.9e-05 2e-06 3.5e-08 0.657 0.653 0.643 0.626 0.603 0.542 0.468 0.389 0.311 0.241 0.181 0.101 0.063 0.051 0.0494 0.0489 0.0459 0.033 0.014 0.00511 0.00476 0.00318 0.00157 0.000779 0.00055 0.00019 5.3e-05 3.3e-05 7.1e-06 1.6e-06 8.4e-07 0.456 0.456 0.456 0.455 0.454 0.449 0.436 0.414 0.382 0.343 0.298 0.206 0.128 0.0737 0.0422 0.027 0.0214 0.02 0.0168 0.0061 0.00209 0.00173 0.0016 0.00118 0.00041 0.00016 8.2e-05 1.1e-05 9.2e-06 3.8e-06 4.5e-07 0.52 0.52 0.52 0.519 0.517 0.507 0.484 0.448 0.399 0.341 0.282 0.172 0.0946 0.0499 0.0293 0.0222 0.0208 0.0201 0.0135 0.00368 0.00177 0.0017 0.00132 0.00081 0.00025 0.00015 5e-05 1.1e-05 9e-06 2.4e-06 1.5e-07 2.19 2.08 1.79 1.4 1.0 0.407 0.151 0.0873 0.082 0.079 0.068 0.0379 0.0169 0.00773 0.00502 0.00464 0.0046 0.00368 0.00162 0.000464 0.000425 0.000293 0.000145 7.04e-05 4.8e-05 1.7e-05 4.6e-06 2.8e-06 6.2e-07 1.4e-07 7.3e-08 +Z 89 26 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 1.0 2.0 107190.0 19848.0 19163.0 15883.000000000002 4974.3 4654.700000000001 3903.9 3379.6 3224.1000000000004 1249.5 1104.8 911.44 675.51 639.62 328.90000000000003 319.74 274.1 218.79000000000002 174.66000000000003 92.82 86.38 45.17 29.31 21.950000000000003 4.49 4.0 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00782 0.00781 0.00781 0.00781 0.0078 0.00778 0.00776 0.00774 0.00771 0.00767 0.0076 0.0073 0.007 0.0061 0.0051 0.0033 0.0012 0.028 0.028 0.028 0.028 0.028 0.028 0.028 0.028 0.028 0.028 0.0279 0.0279 0.0279 0.0278 0.0278 0.0277 0.0276 0.0275 0.0272 0.0266 0.0258 0.0249 0.0239 0.0227 0.02 0.014 0.0082 0.0023 0.00083 0.00066 0.00031 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0135 0.0134 0.0134 0.013 0.013 0.011 0.0078 0.0047 0.0015 0.00018 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0158 0.0157 0.0156 0.015 0.014 0.012 0.0073 0.0037 0.00085 6.2e-05 0.0613 0.0613 0.0613 0.0613 0.0613 0.0612 0.0611 0.061 0.0609 0.0608 0.0606 0.0602 0.0597 0.0591 0.0585 0.0578 0.057 0.0551 0.052 0.0458 0.0389 0.0321 0.0256 0.02 0.012 0.0049 0.0046 0.002 0.00046 0.00015 7.9e-05 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0358 0.0357 0.0357 0.0357 0.0357 0.0357 0.0357 0.0355 0.0351 0.0343 0.0331 0.0314 0.0293 0.024 0.011 0.0035 0.0013 0.0012 0.00045 5.5e-05 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0395 0.0394 0.0392 0.0385 0.0373 0.0355 0.033 0.03 0.023 0.0083 0.0026 0.0017 0.0012 0.0003 2.1e-05 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0253 0.0252 0.025 0.0246 0.023 0.017 0.01 0.0028 0.00068 5.6e-05 1.4e-06 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0261 0.026 0.0257 0.0253 0.024 0.017 0.0099 0.0025 0.00057 4e-05 7.5e-07 0.122 0.122 0.122 0.122 0.122 0.121 0.121 0.12 0.119 0.117 0.116 0.113 0.109 0.104 0.0994 0.0941 0.0886 0.0771 0.0601 0.0363 0.0215 0.0147 0.0128 0.0127 0.011 0.003 0.0012 0.00075 0.00017 3.8e-05 2.1e-05 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0767 0.0766 0.0766 0.0764 0.0762 0.0759 0.0754 0.0748 0.0731 0.0691 0.0585 0.045 0.0314 0.0203 0.0126 0.0061 0.0048 0.0021 0.00033 0.00029 0.00012 1.5e-05 0.0841 0.0841 0.0841 0.0841 0.0841 0.0841 0.0841 0.0841 0.084 0.084 0.084 0.0839 0.0836 0.0833 0.0828 0.0821 0.0812 0.0786 0.0728 0.0585 0.0417 0.0267 0.016 0.00982 0.0061 0.0046 0.0015 0.0004 0.00032 8.5e-05 5.8e-06 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0623 0.0622 0.0622 0.0621 0.0619 0.0611 0.0576 0.0511 0.0421 0.0322 0.0231 0.01 0.0024 0.0022 0.00084 0.00022 1.8e-05 4.2e-07 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.064 0.0639 0.0639 0.0638 0.0635 0.0626 0.0587 0.0514 0.0416 0.0312 0.0219 0.0093 0.0025 0.0022 0.00077 0.00018 1.3e-05 2.3e-07 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0505 0.0504 0.0502 0.0492 0.0467 0.0426 0.0373 0.0315 0.021 0.0057 0.0014 0.00011 1.1e-05 3.1e-07 2.2e-09 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0512 0.0511 0.0511 0.0509 0.0498 0.0471 0.0428 0.0372 0.0313 0.02 0.0054 0.0013 9.7e-05 9.8e-06 2.4e-07 1.4e-09 0.258 0.258 0.257 0.256 0.254 0.25 0.244 0.236 0.227 0.217 0.205 0.181 0.155 0.13 0.106 0.0855 0.0681 0.0437 0.0284 0.0259 0.0214 0.0129 0.00652 0.00377 0.0031 0.0011 0.0003 0.00019 4.4e-05 8.9e-06 5e-06 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.168 0.167 0.164 0.158 0.151 0.142 0.13 0.118 0.0905 0.0535 0.0193 0.0118 0.0115 0.00993 0.00706 0.0025 0.0011 0.00057 7.3e-05 6.3e-05 2.7e-05 3.3e-06 0.187 0.187 0.187 0.187 0.187 0.186 0.186 0.186 0.185 0.184 0.182 0.177 0.17 0.159 0.146 0.131 0.114 0.0819 0.0433 0.0157 0.0127 0.0118 0.00876 0.00531 0.0017 0.0011 0.00039 8.3e-05 6.9e-05 1.9e-05 1.3e-06 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.158 0.157 0.155 0.151 0.145 0.138 0.128 0.105 0.0685 0.0251 0.00876 0.00562 0.00549 0.00503 0.0029 0.00042 0.00036 0.00015 4e-05 3.2e-06 7.6e-08 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.163 0.161 0.159 0.155 0.148 0.14 0.129 0.104 0.0653 0.0226 0.00799 0.00565 0.00555 0.00491 0.0026 0.00041 0.00036 0.00014 3.3e-05 2.3e-06 4.1e-08 0.617 0.614 0.606 0.591 0.572 0.52 0.455 0.384 0.314 0.249 0.192 0.111 0.0686 0.0528 0.0497 0.0495 0.0476 0.0365 0.0167 0.00552 0.00511 0.00363 0.00187 0.000913 0.00059 0.00023 5.8e-05 3.7e-05 8.5e-06 1.7e-06 9.4e-07 0.429 0.429 0.429 0.429 0.428 0.424 0.414 0.396 0.37 0.337 0.299 0.216 0.142 0.0857 0.0504 0.0316 0.0234 0.0206 0.0183 0.00744 0.00245 0.00185 0.00176 0.00135 0.0005 0.00018 9.6e-05 1.2e-05 1e-05 4.4e-06 5.3e-07 0.484 0.484 0.484 0.484 0.482 0.475 0.458 0.43 0.39 0.343 0.291 0.19 0.111 0.0612 0.0354 0.0249 0.022 0.0215 0.0158 0.00466 0.00199 0.00189 0.00154 0.000979 0.0003 0.00017 6.1e-05 1.2e-05 1e-05 2.8e-06 1.9e-07 0.608 0.608 0.608 0.607 0.606 0.592 0.555 0.493 0.416 0.336 0.261 0.146 0.0758 0.0374 0.0184 0.00994 0.00672 0.00565 0.00514 0.00236 0.00075 0.000354 0.000323 0.000307 0.00018 2.6e-05 2.1e-05 9.2e-06 2.5e-06 2e-07 4.7e-09 1.99 1.91 1.68 1.36 1.02 0.473 0.19 0.0973 0.0821 0.0813 0.0752 0.0486 0.0243 0.0113 0.00644 0.00533 0.00527 0.0046 0.00226 0.000589 0.000514 0.000381 0.000198 9.48e-05 5.8e-05 2.3e-05 5.7e-06 3.6e-06 8.4e-07 1.7e-07 9.3e-08 +Z 90 26 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 2.0 2.0 110110.0 20478.0 19780.0 16315.0 5157.9 4831.6 4036.2000000000003 3502.4 3338.6000000000004 1310.6000000000001 1162.3 956.16 714.81 676.6400000000001 358.55 348.69 294.76 237.43 189.41 104.22999999999999 97.11 50.550000000000004 33.519999999999996 25.009999999999998 5.62 4.9799999999999995 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00769 0.00768 0.00768 0.00768 0.00768 0.00768 0.00767 0.00765 0.00763 0.00761 0.00758 0.00755 0.0075 0.0072 0.0069 0.006 0.0051 0.0033 0.0013 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0275 0.0274 0.0274 0.0273 0.0273 0.0272 0.027 0.0268 0.0262 0.0254 0.0246 0.0236 0.0225 0.02 0.014 0.0084 0.0024 0.00085 0.00065 0.00032 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0133 0.0132 0.0132 0.0132 0.0132 0.013 0.012 0.011 0.0078 0.0047 0.0015 0.0002 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0156 0.0155 0.0154 0.015 0.014 0.012 0.0074 0.0038 0.00089 6.7e-05 0.0603 0.0603 0.0603 0.0603 0.0603 0.0602 0.0601 0.06 0.0599 0.0598 0.0596 0.0592 0.0588 0.0582 0.0576 0.0569 0.0562 0.0544 0.0514 0.0454 0.0389 0.0322 0.0259 0.0203 0.012 0.0049 0.0046 0.0021 0.0005 0.00014 8.1e-05 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0352 0.0351 0.0351 0.0351 0.0351 0.0351 0.035 0.0346 0.0338 0.0327 0.0311 0.0291 0.024 0.011 0.0037 0.0013 0.0012 0.00047 5.9e-05 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.039 0.0389 0.0389 0.0388 0.0387 0.038 0.0369 0.0351 0.0328 0.0299 0.023 0.0086 0.0027 0.0017 0.0012 0.00032 2.2e-05 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.0249 0.0247 0.0243 0.023 0.017 0.011 0.0029 0.00073 6.1e-05 1.5e-06 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0259 0.0258 0.0258 0.0257 0.0254 0.025 0.024 0.017 0.01 0.0026 0.0006 4.4e-05 8.3e-07 0.12 0.12 0.12 0.12 0.119 0.119 0.118 0.118 0.117 0.115 0.114 0.111 0.107 0.103 0.0982 0.0932 0.0879 0.0769 0.0604 0.037 0.022 0.0149 0.0127 0.0125 0.011 0.0032 0.0012 0.00079 0.00019 3.8e-05 2.2e-05 0.0752 0.0752 0.0752 0.0752 0.0752 0.0752 0.0752 0.0752 0.0752 0.0752 0.0752 0.0751 0.075 0.0748 0.0745 0.0741 0.0735 0.0719 0.0682 0.0583 0.0454 0.0322 0.0211 0.0133 0.0063 0.0049 0.0023 0.00033 0.00029 0.00013 1.6e-05 0.0826 0.0826 0.0826 0.0826 0.0826 0.0826 0.0826 0.0826 0.0826 0.0826 0.0825 0.0824 0.0822 0.0819 0.0814 0.0808 0.08 0.0776 0.0721 0.0585 0.0423 0.0276 0.0167 0.0103 0.0061 0.0047 0.0016 0.00039 0.00033 9e-05 6.2e-06 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.0611 0.061 0.061 0.0608 0.06 0.0569 0.0509 0.0424 0.0329 0.0238 0.011 0.0024 0.0022 0.00089 0.00024 2e-05 4.8e-07 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0628 0.0627 0.0627 0.0624 0.0615 0.058 0.0512 0.042 0.0319 0.0227 0.0098 0.0025 0.0023 0.00081 0.0002 1.4e-05 2.6e-07 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0493 0.0491 0.0482 0.046 0.0423 0.0374 0.0319 0.021 0.0061 0.0016 0.00012 1.3e-05 3.6e-07 2.6e-09 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.0498 0.0488 0.0465 0.0425 0.0374 0.0317 0.021 0.0058 0.0015 0.00011 1.1e-05 2.8e-07 1.7e-09 0.251 0.25 0.25 0.249 0.247 0.243 0.237 0.23 0.222 0.212 0.202 0.179 0.154 0.13 0.108 0.0875 0.0702 0.0454 0.0288 0.0257 0.022 0.0138 0.00714 0.00401 0.0031 0.0012 0.00031 0.0002 5e-05 9e-06 5.3e-06 0.164 0.164 0.164 0.164 0.164 0.164 0.164 0.164 0.164 0.163 0.162 0.159 0.155 0.148 0.14 0.129 0.118 0.0922 0.0563 0.0208 0.0119 0.0115 0.0103 0.00755 0.0028 0.0011 0.00062 7.8e-05 6.4e-05 2.9e-05 3.7e-06 0.181 0.181 0.181 0.181 0.181 0.181 0.181 0.181 0.18 0.179 0.178 0.173 0.166 0.157 0.145 0.131 0.115 0.0844 0.046 0.0166 0.0127 0.0121 0.00926 0.0058 0.0019 0.0011 0.00043 8.5e-05 7.2e-05 2e-05 1.4e-06 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.152 0.151 0.15 0.147 0.142 0.135 0.127 0.107 0.072 0.028 0.00984 0.00584 0.0056 0.00525 0.0031 0.00046 0.00037 0.00016 4.5e-05 3.7e-06 8.9e-08 0.157 0.157 0.157 0.157 0.157 0.157 0.157 0.157 0.157 0.157 0.157 0.156 0.154 0.15 0.145 0.138 0.128 0.106 0.069 0.0253 0.00888 0.00581 0.00569 0.00517 0.0029 0.00044 0.00037 0.00015 3.7e-05 2.7e-06 4.8e-08 0.585 0.582 0.575 0.562 0.545 0.5 0.443 0.379 0.315 0.254 0.2 0.119 0.074 0.0548 0.0498 0.0494 0.0484 0.0393 0.0195 0.00598 0.00537 0.00406 0.00219 0.00107 0.00062 0.00026 6.3e-05 4.1e-05 1e-05 1.8e-06 1e-06 0.408 0.408 0.408 0.407 0.407 0.403 0.395 0.381 0.359 0.331 0.297 0.223 0.152 0.0964 0.0584 0.0364 0.0257 0.0209 0.0194 0.00879 0.00286 0.00194 0.00188 0.00151 0.00059 0.00019 0.00011 1.3e-05 1.1e-05 5e-06 6.2e-07 0.456 0.456 0.456 0.456 0.455 0.449 0.436 0.413 0.381 0.34 0.295 0.202 0.125 0.0719 0.0418 0.0279 0.0232 0.0223 0.0177 0.00573 0.00221 0.00204 0.00173 0.00115 0.00036 0.00019 7.2e-05 1.4e-05 1.2e-05 3.3e-06 2.2e-07 0.535 0.535 0.535 0.535 0.534 0.528 0.508 0.471 0.418 0.356 0.293 0.182 0.104 0.0557 0.0289 0.0155 0.00953 0.00681 0.00646 0.00335 0.00112 0.00048 0.000412 0.0004 0.00025 3.6e-05 2.8e-05 1.3e-05 3.5e-06 2.9e-07 6.9e-09 1.86 1.79 1.6 1.33 1.03 0.517 0.222 0.108 0.0816 0.0799 0.0771 0.0557 0.0308 0.015 0.00802 0.00591 0.00562 0.00522 0.00288 0.000716 0.000578 0.000458 0.000251 0.00012 6.6e-05 2.8e-05 6.7e-06 4.4e-06 1.1e-06 1.9e-07 1.1e-07 +Z 91 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 2.0 1.0 2.0 113080.0 21113.0 20402.0 16743.0 5334.9 5001.8 4159.4 3616.1 3443.6 1362.1 1210.1 990.57 743.75 703.21 377.63 367.04 305.17 245.89000000000001 194.07 106.08 98.4 7.64 6.8 50.01 32.61 23.82 4.71 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00756 0.00755 0.00755 0.00755 0.00755 0.00755 0.00755 0.00754 0.00752 0.0075 0.00748 0.00745 0.00742 0.0073 0.0071 0.0068 0.006 0.005 0.0033 0.0013 0.0271 0.0271 0.0271 0.0271 0.0271 0.0271 0.0271 0.0271 0.0271 0.0271 0.027 0.027 0.027 0.0269 0.0269 0.0268 0.0268 0.0266 0.0264 0.0258 0.0251 0.0243 0.0233 0.0223 0.02 0.014 0.0085 0.0025 0.00087 0.00064 0.00033 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.013 0.0129 0.0129 0.012 0.011 0.0078 0.0048 0.0016 0.00021 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0153 0.0153 0.015 0.014 0.012 0.0074 0.0039 0.00093 7.1e-05 0.0593 0.0593 0.0593 0.0593 0.0593 0.0592 0.0592 0.0591 0.059 0.0588 0.0587 0.0583 0.0579 0.0574 0.0568 0.0561 0.0554 0.0537 0.0508 0.0451 0.0388 0.0323 0.0261 0.0206 0.012 0.0048 0.0045 0.0022 0.00055 0.00014 8.3e-05 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0345 0.0345 0.0345 0.0344 0.034 0.0334 0.0323 0.0308 0.0289 0.024 0.011 0.004 0.0013 0.0012 0.00049 6.4e-05 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0384 0.0383 0.0381 0.0376 0.0365 0.0348 0.0326 0.0298 0.023 0.0089 0.0028 0.0016 0.0012 0.00033 2.4e-05 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0247 0.0246 0.0245 0.0243 0.024 0.023 0.017 0.011 0.003 0.00077 6.6e-05 1.7e-06 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0255 0.0254 0.0253 0.0251 0.0247 0.023 0.017 0.01 0.0027 0.00064 4.8e-05 9.1e-07 0.118 0.118 0.118 0.117 0.117 0.117 0.116 0.115 0.114 0.113 0.112 0.109 0.106 0.102 0.0971 0.0923 0.0872 0.0766 0.0607 0.0377 0.0226 0.0151 0.0127 0.0123 0.011 0.0034 0.0012 0.00082 0.00021 3.7e-05 2.3e-05 0.0738 0.0738 0.0738 0.0738 0.0738 0.0738 0.0738 0.0738 0.0738 0.0737 0.0737 0.0737 0.0736 0.0734 0.0731 0.0727 0.0722 0.0708 0.0673 0.0581 0.0458 0.033 0.022 0.014 0.0065 0.0049 0.0024 0.00034 0.00029 0.00014 1.8e-05 0.0812 0.0812 0.0812 0.0812 0.0812 0.0812 0.0812 0.0812 0.0812 0.0812 0.0811 0.081 0.0808 0.0806 0.0801 0.0795 0.0787 0.0765 0.0714 0.0585 0.0429 0.0284 0.0174 0.0107 0.0061 0.0048 0.0017 0.00039 0.00033 9.5e-05 6.7e-06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.0599 0.0599 0.0597 0.059 0.0562 0.0506 0.0426 0.0334 0.0246 0.011 0.0024 0.0022 0.00093 0.00026 2.2e-05 5.3e-07 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0617 0.0616 0.0616 0.0613 0.0605 0.0573 0.051 0.0423 0.0325 0.0234 0.01 0.0025 0.0023 0.00085 0.00021 1.6e-05 2.9e-07 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0482 0.0481 0.0473 0.0454 0.042 0.0374 0.0322 0.022 0.0064 0.0017 0.00014 1.5e-05 4.2e-07 3e-09 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0489 0.0487 0.0479 0.0458 0.0423 0.0375 0.0321 0.022 0.0062 0.0016 0.00012 1.3e-05 3.2e-07 1.9e-09 0.245 0.244 0.244 0.243 0.241 0.238 0.232 0.225 0.218 0.209 0.199 0.177 0.154 0.131 0.109 0.089 0.072 0.0469 0.0292 0.0254 0.0224 0.0146 0.00777 0.00428 0.0031 0.0013 0.00032 0.00021 5.6e-05 9e-06 5.5e-06 0.161 0.161 0.161 0.161 0.161 0.161 0.16 0.16 0.16 0.159 0.159 0.156 0.152 0.146 0.138 0.128 0.117 0.0933 0.0584 0.0221 0.0121 0.0114 0.0104 0.00795 0.0031 0.0011 0.00066 8.2e-05 6.4e-05 3.1e-05 4e-06 0.177 0.177 0.177 0.177 0.177 0.177 0.177 0.177 0.176 0.175 0.174 0.17 0.164 0.155 0.143 0.13 0.116 0.0862 0.0482 0.0174 0.0126 0.0122 0.00965 0.00622 0.0021 0.0012 0.00046 8.6e-05 7.4e-05 2.2e-05 1.5e-06 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.148 0.147 0.144 0.14 0.134 0.126 0.107 0.0737 0.0299 0.0106 0.00592 0.00555 0.0053 0.0033 0.00049 0.00037 0.00017 4.9e-05 4.2e-06 1e-07 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.152 0.15 0.147 0.143 0.136 0.127 0.106 0.0712 0.0274 0.00965 0.00589 0.0057 0.00529 0.0031 0.00046 0.00038 0.00016 4.1e-05 3e-06 5.5e-08 0.207 0.207 0.207 0.207 0.207 0.207 0.207 0.206 0.206 0.204 0.202 0.194 0.182 0.167 0.15 0.133 0.116 0.0852 0.05 0.0181 0.00599 0.00228 0.00142 0.00132 0.0012 0.00049 0.00014 1.1e-05 1.2e-06 3.5e-08 2.6e-10 0.58 0.578 0.57 0.558 0.542 0.497 0.442 0.38 0.317 0.257 0.203 0.122 0.0748 0.0542 0.0483 0.0477 0.047 0.0392 0.0204 0.00606 0.00523 0.00416 0.00236 0.00116 0.00061 0.00028 6.5e-05 4.2e-05 1.1e-05 1.8e-06 1.1e-06 0.401 0.401 0.401 0.401 0.4 0.397 0.39 0.376 0.356 0.329 0.297 0.226 0.156 0.1 0.0613 0.0381 0.0263 0.0202 0.0192 0.00939 0.0031 0.00192 0.00188 0.00157 0.00066 0.00019 0.00012 1.4e-05 1.1e-05 5.2e-06 6.8e-07 0.459 0.459 0.459 0.459 0.458 0.452 0.438 0.415 0.382 0.341 0.295 0.202 0.125 0.0718 0.0414 0.0271 0.022 0.0209 0.017 0.00587 0.00216 0.00192 0.00169 0.00116 0.00037 0.00018 7.4e-05 1.3e-05 1.1e-05 3.3e-06 2.3e-07 0.558 0.558 0.558 0.558 0.557 0.548 0.523 0.477 0.417 0.349 0.283 0.171 0.0961 0.0511 0.0264 0.0141 0.0086 0.00594 0.00567 0.00312 0.00109 0.00045 0.000365 0.000358 0.00024 3.4e-05 2.5e-05 1.2e-05 3.4e-06 2.9e-07 7e-09 1.93 1.86 1.65 1.36 1.04 0.501 0.207 0.0986 0.0756 0.0744 0.0712 0.0503 0.0274 0.0133 0.00698 0.00505 0.00475 0.00447 0.00257 0.000644 0.000489 0.000406 0.000235 0.000114 5.7e-05 2.7e-05 6e-06 3.9e-06 1e-06 1.6e-07 9.9e-08 +Z 92 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 8.0 4.0 6.0 2.0 2.0 4.0 3.0 1.0 2.0 116110.0 21768.0 21044.0 17182.0 5521.3 5181.5 4289.6 3736.8 3555.2000000000003 1419.9 1264.2 1030.5 778.18 735.14 402.09000000000003 390.75 320.65000000000003 259.38 203.39 112.35 104.02 8.91 7.95 52.23 34.09 24.57 4.74 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00743 0.00742 0.00742 0.00742 0.00742 0.00742 0.00741 0.0074 0.00738 0.00736 0.00733 0.0073 0.0072 0.007 0.0067 0.0059 0.005 0.0033 0.0013 0.0267 0.0267 0.0267 0.0267 0.0267 0.0267 0.0267 0.0266 0.0266 0.0266 0.0266 0.0266 0.0265 0.0265 0.0265 0.0264 0.0263 0.0262 0.026 0.0254 0.0248 0.024 0.0231 0.0221 0.02 0.014 0.0087 0.0026 0.00089 0.00063 0.00033 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0128 0.0127 0.0127 0.012 0.011 0.0079 0.0049 0.0017 0.00023 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0152 0.0151 0.0151 0.015 0.014 0.012 0.0075 0.004 0.00097 7.6e-05 0.0584 0.0584 0.0584 0.0584 0.0583 0.0583 0.0582 0.0581 0.058 0.0579 0.0578 0.0574 0.057 0.0565 0.0559 0.0553 0.0546 0.053 0.0503 0.0448 0.0386 0.0324 0.0264 0.0209 0.013 0.0048 0.0045 0.0023 0.00059 0.00014 8.5e-05 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.034 0.0339 0.0338 0.0335 0.0329 0.0319 0.0305 0.0287 0.024 0.012 0.0042 0.0013 0.0012 0.00051 6.9e-05 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0379 0.0378 0.0376 0.0371 0.0361 0.0345 0.0324 0.0297 0.023 0.0092 0.0029 0.0016 0.0012 0.00035 2.6e-05 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0243 0.0242 0.024 0.0237 0.023 0.017 0.011 0.0031 0.00082 7.2e-05 1.9e-06 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0252 0.0251 0.025 0.0248 0.0244 0.023 0.017 0.011 0.0028 0.00068 5.1e-05 1e-06 0.115 0.115 0.115 0.115 0.115 0.115 0.114 0.113 0.112 0.111 0.11 0.107 0.104 0.1 0.0959 0.0913 0.0865 0.0764 0.0609 0.0384 0.0232 0.0154 0.0126 0.0122 0.011 0.0036 0.0012 0.00085 0.00023 3.7e-05 2.3e-05 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0724 0.0723 0.0723 0.0722 0.072 0.0718 0.0714 0.071 0.0696 0.0664 0.0578 0.0461 0.0337 0.0228 0.0146 0.0067 0.0049 0.0026 0.00035 0.00029 0.00014 1.9e-05 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0798 0.0797 0.0795 0.0792 0.0788 0.0783 0.0776 0.0755 0.0707 0.0585 0.0434 0.0291 0.0181 0.0112 0.0062 0.0049 0.0018 0.00039 0.00034 0.0001 7.3e-06 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0589 0.0588 0.0586 0.058 0.0555 0.0503 0.0428 0.034 0.0253 0.012 0.0025 0.0022 0.00098 0.00027 2.4e-05 6e-07 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0606 0.0605 0.0605 0.0603 0.0596 0.0566 0.0508 0.0425 0.0331 0.0242 0.011 0.0025 0.0023 0.00089 0.00023 1.7e-05 3.2e-07 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.0472 0.047 0.0464 0.0447 0.0417 0.0374 0.0325 0.022 0.0068 0.0018 0.00015 1.7e-05 4.8e-07 3.5e-09 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0479 0.0478 0.0477 0.047 0.0452 0.042 0.0375 0.0324 0.022 0.0065 0.0017 0.00013 1.4e-05 3.7e-07 2.2e-09 0.238 0.238 0.238 0.237 0.236 0.232 0.227 0.221 0.213 0.205 0.195 0.175 0.153 0.131 0.11 0.0906 0.0737 0.0485 0.0298 0.0251 0.0227 0.0154 0.00843 0.00459 0.0031 0.0014 0.00034 0.00022 6.2e-05 9.1e-06 5.7e-06 0.157 0.157 0.157 0.157 0.157 0.157 0.156 0.156 0.156 0.155 0.155 0.152 0.149 0.143 0.136 0.127 0.117 0.0944 0.0605 0.0236 0.0123 0.0113 0.0106 0.00834 0.0034 0.0011 0.00071 8.8e-05 6.4e-05 3.3e-05 4.4e-06 0.173 0.173 0.173 0.173 0.173 0.173 0.173 0.172 0.172 0.171 0.17 0.166 0.161 0.152 0.142 0.13 0.116 0.0879 0.0504 0.0184 0.0126 0.0123 0.01 0.00667 0.0022 0.0012 0.0005 8.7e-05 7.7e-05 2.3e-05 1.7e-06 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.143 0.141 0.137 0.132 0.125 0.107 0.0757 0.0322 0.0117 0.00612 0.00556 0.00539 0.0035 0.00053 0.00038 0.00019 5.4e-05 4.7e-06 1.2e-07 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.148 0.147 0.144 0.14 0.134 0.126 0.107 0.0735 0.0297 0.0106 0.00604 0.00572 0.00542 0.0033 0.00049 0.00039 0.00017 4.5e-05 3.4e-06 6.3e-08 0.193 0.193 0.193 0.193 0.193 0.193 0.193 0.193 0.192 0.192 0.19 0.185 0.176 0.164 0.15 0.135 0.12 0.0907 0.0556 0.0214 0.00744 0.00279 0.0016 0.00143 0.0014 0.00057 0.00017 1.4e-05 1.6e-06 4.5e-08 3.4e-10 0.565 0.563 0.556 0.545 0.529 0.488 0.436 0.377 0.317 0.26 0.207 0.126 0.0778 0.0551 0.0477 0.0467 0.0463 0.04 0.022 0.0064 0.00522 0.00436 0.00259 0.0013 0.00062 0.00031 6.9e-05 4.5e-05 1.2e-05 1.8e-06 1.1e-06 0.39 0.39 0.39 0.39 0.389 0.386 0.38 0.368 0.349 0.325 0.296 0.229 0.162 0.106 0.0664 0.0414 0.0279 0.0201 0.0192 0.0103 0.00348 0.00197 0.0019 0.00165 0.00074 0.00019 0.00013 1.5e-05 1.1e-05 5.6e-06 7.6e-07 0.45 0.45 0.45 0.45 0.449 0.443 0.431 0.409 0.379 0.34 0.297 0.207 0.13 0.0763 0.0442 0.0282 0.022 0.0204 0.0173 0.00643 0.00225 0.00191 0.00173 0.00124 0.00041 0.00019 8e-05 1.3e-05 1.2e-05 3.5e-06 2.6e-07 0.543 0.543 0.543 0.543 0.542 0.535 0.512 0.471 0.415 0.351 0.288 0.179 0.103 0.0563 0.0298 0.016 0.00949 0.00595 0.00568 0.00339 0.00125 0.000494 0.000373 0.000367 0.00026 3.8e-05 2.6e-05 1.3e-05 3.8e-06 3.3e-07 8.1e-09 1.91 1.84 1.64 1.35 1.04 0.513 0.214 0.0998 0.0733 0.0713 0.0691 0.0506 0.0285 0.0141 0.0073 0.00497 0.00452 0.00434 0.00267 0.000679 0.000471 0.00041 0.00025 0.000124 5.6e-05 2.8e-05 6.2e-06 4e-06 1.1e-06 1.6e-07 1e-07 +Z 93 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 4.0 2.0 2.0 4.0 1.0 2.0 119200.0 22440.0 21702.0 17626.0 5712.2 5365.5 4421.6 3859.2000000000003 3668.1 1478.9 1319.5 1070.8 812.9399999999999 767.29 426.75 414.6 336.25 272.95 212.56 118.48 109.47 10.12 9.03 54.39 35.519999999999996 25.25 4.75 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.0073 0.00729 0.00729 0.00728 0.00727 0.00725 0.00723 0.00721 0.00718 0.0071 0.0069 0.0066 0.0058 0.005 0.0033 0.0013 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0262 0.0261 0.0261 0.026 0.026 0.0259 0.0258 0.0256 0.025 0.0244 0.0236 0.0228 0.0218 0.02 0.014 0.0088 0.0028 0.00092 0.00062 0.00034 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0126 0.0125 0.0125 0.012 0.012 0.011 0.0079 0.005 0.0017 0.00024 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.015 0.0149 0.0149 0.0149 0.014 0.012 0.0076 0.0041 0.001 8.1e-05 0.0575 0.0575 0.0574 0.0574 0.0574 0.0574 0.0573 0.0572 0.0571 0.057 0.0569 0.0565 0.0561 0.0557 0.0551 0.0545 0.0539 0.0523 0.0497 0.0444 0.0385 0.0324 0.0266 0.0212 0.013 0.0049 0.0044 0.0024 0.00064 0.00014 8.7e-05 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0334 0.0333 0.033 0.0324 0.0315 0.0301 0.0284 0.024 0.012 0.0044 0.0012 0.0012 0.00053 7.4e-05 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0374 0.0373 0.0371 0.0366 0.0357 0.0342 0.0321 0.0296 0.024 0.0094 0.003 0.0016 0.0013 0.00036 2.7e-05 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.024 0.0239 0.0237 0.0234 0.022 0.017 0.011 0.0033 0.00087 7.8e-05 2.1e-06 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0248 0.0247 0.0245 0.0242 0.023 0.017 0.011 0.0029 0.00072 5.6e-05 1.1e-06 0.113 0.113 0.113 0.113 0.113 0.113 0.112 0.111 0.11 0.109 0.108 0.106 0.102 0.0988 0.0948 0.0904 0.0858 0.076 0.0611 0.0391 0.0238 0.0157 0.0126 0.012 0.011 0.0039 0.0013 0.00088 0.00025 3.7e-05 2.4e-05 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.071 0.0709 0.0708 0.0707 0.0705 0.0701 0.0697 0.0685 0.0655 0.0575 0.0464 0.0343 0.0236 0.0154 0.0069 0.0049 0.0027 0.00037 0.00028 0.00015 2.1e-05 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0785 0.0784 0.0782 0.078 0.0776 0.0771 0.0764 0.0745 0.07 0.0584 0.0439 0.0299 0.0188 0.0117 0.0062 0.0049 0.0019 0.00039 0.00034 0.00011 7.9e-06 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0579 0.0578 0.0578 0.0578 0.0576 0.0571 0.0548 0.05 0.0429 0.0344 0.026 0.013 0.0025 0.0022 0.001 0.00029 2.6e-05 6.7e-07 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0596 0.0595 0.0595 0.0595 0.0595 0.0594 0.0593 0.0586 0.0559 0.0505 0.0427 0.0337 0.0249 0.012 0.0025 0.0023 0.00093 0.00025 1.9e-05 3.6e-07 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0462 0.0461 0.0455 0.044 0.0413 0.0374 0.0327 0.023 0.0072 0.002 0.00017 1.9e-05 5.5e-07 4.1e-09 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0469 0.0468 0.0462 0.0445 0.0416 0.0375 0.0326 0.023 0.0069 0.0019 0.00015 1.6e-05 4.3e-07 2.6e-09 0.233 0.233 0.232 0.231 0.23 0.227 0.222 0.216 0.209 0.201 0.192 0.173 0.152 0.131 0.111 0.0919 0.0754 0.05 0.0304 0.0248 0.0229 0.0161 0.00911 0.00494 0.0031 0.0015 0.00035 0.00023 6.8e-05 9.2e-06 6e-06 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.152 0.152 0.151 0.149 0.146 0.141 0.134 0.126 0.117 0.0952 0.0625 0.0252 0.0126 0.0112 0.0107 0.00869 0.0038 0.0011 0.00075 9.4e-05 6.4e-05 3.4e-05 4.9e-06 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.168 0.167 0.166 0.163 0.158 0.15 0.141 0.129 0.117 0.0893 0.0526 0.0193 0.0126 0.0123 0.0103 0.0071 0.0024 0.0012 0.00054 8.9e-05 7.9e-05 2.5e-05 1.8e-06 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.141 0.14 0.138 0.135 0.13 0.124 0.107 0.0775 0.0344 0.0128 0.00636 0.00555 0.00545 0.0038 0.00057 0.00038 0.0002 5.8e-05 5.2e-06 1.3e-07 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.145 0.143 0.141 0.137 0.132 0.125 0.107 0.0756 0.0319 0.0116 0.00623 0.00573 0.00552 0.0035 0.00052 0.0004 0.00018 4.9e-05 3.8e-06 7.1e-08 0.182 0.182 0.182 0.182 0.182 0.182 0.182 0.182 0.182 0.181 0.18 0.176 0.17 0.16 0.149 0.136 0.122 0.0948 0.0604 0.0246 0.00894 0.00336 0.00179 0.00151 0.0015 0.00065 0.0002 1.7e-05 1.9e-06 5.6e-08 4.3e-10 0.552 0.55 0.543 0.533 0.518 0.48 0.43 0.375 0.318 0.262 0.211 0.131 0.0808 0.0561 0.0473 0.0456 0.0455 0.0404 0.0235 0.0068 0.00517 0.00452 0.00282 0.00145 0.00063 0.00034 7.4e-05 4.7e-05 1.4e-05 1.8e-06 1.2e-06 0.38 0.38 0.38 0.379 0.379 0.376 0.37 0.36 0.343 0.321 0.294 0.231 0.167 0.112 0.0713 0.0448 0.0298 0.02 0.0191 0.0111 0.00389 0.00202 0.00191 0.00172 0.00082 0.00019 0.00014 1.7e-05 1.1e-05 6e-06 8.5e-07 0.442 0.442 0.442 0.442 0.441 0.436 0.424 0.404 0.375 0.339 0.298 0.211 0.135 0.0804 0.0468 0.0294 0.0222 0.0198 0.0175 0.00695 0.00237 0.00188 0.00176 0.00131 0.00045 0.00019 8.6e-05 1.3e-05 1.2e-05 3.8e-06 2.8e-07 0.532 0.532 0.532 0.532 0.531 0.524 0.503 0.465 0.412 0.352 0.291 0.185 0.109 0.0608 0.0329 0.0178 0.0104 0.00596 0.00561 0.00359 0.0014 0.000541 0.000378 0.000371 0.00028 4.2e-05 2.6e-05 1.4e-05 4.1e-06 3.7e-07 9.3e-09 1.89 1.82 1.63 1.35 1.05 0.524 0.221 0.101 0.0714 0.0686 0.0671 0.0507 0.0296 0.015 0.00766 0.00496 0.00433 0.00419 0.00275 0.00072 0.000453 0.000411 0.000264 0.000135 5.5e-05 3e-05 6.4e-06 4.1e-06 1.2e-06 1.6e-07 1e-07 +Z 94 26 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 2.0 2.0 4.0 2.0 122350.0 23122.0 22371.0 18071.0 5902.1 5548.5 4549.9 3977.8 3776.9 1533.7 1370.5 1106.0 842.55 794.17 446.08 433.09000000000003 346.64 281.33 216.42 119.5 109.85 7.4 6.25 53.12 33.92 23.419999999999998 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00718 0.00717 0.00717 0.00717 0.00717 0.00717 0.00717 0.00716 0.00715 0.00713 0.00711 0.00709 0.00706 0.007 0.0068 0.0065 0.0058 0.0049 0.0034 0.0014 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0258 0.0257 0.0257 0.0257 0.0256 0.0256 0.0255 0.0254 0.0252 0.0247 0.0241 0.0233 0.0225 0.0216 0.02 0.014 0.009 0.0029 0.00096 0.00061 0.00035 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0124 0.0123 0.0123 0.0123 0.0123 0.012 0.012 0.011 0.0079 0.0051 0.0018 0.00026 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0149 0.0148 0.0148 0.0148 0.0148 0.0148 0.0148 0.0147 0.0147 0.014 0.012 0.0076 0.0042 0.0011 8.6e-05 0.0565 0.0565 0.0565 0.0565 0.0565 0.0565 0.0564 0.0563 0.0562 0.0561 0.056 0.0557 0.0553 0.0548 0.0543 0.0537 0.0531 0.0517 0.0491 0.0441 0.0384 0.0325 0.0268 0.0215 0.013 0.0049 0.0043 0.0025 0.00069 0.00014 8.9e-05 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0329 0.0328 0.0327 0.0325 0.0319 0.0311 0.0298 0.0282 0.024 0.012 0.0046 0.0012 0.0011 0.00055 7.9e-05 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0369 0.0368 0.0367 0.0362 0.0353 0.0339 0.0319 0.0295 0.024 0.0097 0.0032 0.0016 0.0013 0.00038 2.9e-05 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0237 0.0236 0.0235 0.0234 0.0231 0.022 0.017 0.011 0.0034 0.00093 8.4e-05 2.3e-06 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0245 0.0244 0.0242 0.0239 0.023 0.017 0.011 0.003 0.00077 6e-05 1.2e-06 0.111 0.111 0.111 0.111 0.111 0.111 0.11 0.109 0.109 0.108 0.107 0.104 0.101 0.0975 0.0936 0.0894 0.085 0.0757 0.0613 0.0397 0.0244 0.016 0.0126 0.0118 0.011 0.0041 0.0013 0.0009 0.00027 3.7e-05 2.5e-05 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0697 0.0696 0.0695 0.0694 0.0692 0.0689 0.0685 0.0674 0.0647 0.0571 0.0466 0.035 0.0244 0.0161 0.0072 0.0048 0.0028 0.00038 0.00028 0.00015 2.2e-05 0.0772 0.0772 0.0772 0.0772 0.0772 0.0772 0.0772 0.0772 0.0772 0.0772 0.0772 0.0771 0.077 0.0767 0.0764 0.0759 0.0753 0.0735 0.0693 0.0583 0.0444 0.0306 0.0195 0.0122 0.0063 0.005 0.002 0.00039 0.00035 0.00011 8.5e-06 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0569 0.0568 0.0568 0.0568 0.0566 0.0562 0.054 0.0496 0.0429 0.0349 0.0266 0.013 0.0026 0.0022 0.0011 0.00031 2.9e-05 7.4e-07 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0585 0.0584 0.0583 0.0577 0.0553 0.0502 0.0428 0.0341 0.0255 0.012 0.0025 0.0023 0.00098 0.00026 2.1e-05 4e-07 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0452 0.0451 0.0447 0.0433 0.0409 0.0373 0.0329 0.024 0.0076 0.0022 0.00019 2.1e-05 6.3e-07 4.7e-09 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.046 0.0459 0.0459 0.0459 0.0459 0.0458 0.0453 0.0439 0.0412 0.0374 0.0328 0.023 0.0073 0.002 0.00017 1.8e-05 4.9e-07 3e-09 0.228 0.227 0.227 0.226 0.225 0.222 0.217 0.212 0.205 0.198 0.19 0.171 0.151 0.131 0.111 0.0931 0.0768 0.0514 0.0309 0.0244 0.023 0.0168 0.00979 0.00532 0.0031 0.0016 0.00037 0.00024 7.5e-05 9.3e-06 6.2e-06 0.15 0.15 0.15 0.15 0.15 0.15 0.149 0.149 0.149 0.149 0.148 0.146 0.143 0.138 0.132 0.125 0.116 0.0957 0.0642 0.0266 0.0129 0.0111 0.0107 0.00897 0.0041 0.0011 0.00079 0.0001 6.4e-05 3.6e-05 5.3e-06 0.166 0.166 0.166 0.166 0.166 0.166 0.166 0.165 0.165 0.164 0.163 0.16 0.155 0.148 0.139 0.129 0.117 0.0905 0.0544 0.0203 0.0126 0.0122 0.0106 0.00748 0.0026 0.0012 0.00058 9e-05 8e-05 2.6e-05 2e-06 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.138 0.136 0.133 0.128 0.122 0.107 0.0785 0.0362 0.0137 0.00658 0.0055 0.00543 0.0039 0.00061 0.00038 0.00021 6.3e-05 5.8e-06 1.5e-07 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.141 0.138 0.135 0.13 0.124 0.107 0.077 0.0338 0.0125 0.0064 0.0057 0.00556 0.0037 0.00056 0.0004 0.00019 5.3e-05 4.2e-06 8e-08 0.183 0.183 0.183 0.183 0.183 0.183 0.183 0.183 0.182 0.181 0.18 0.175 0.168 0.158 0.146 0.133 0.12 0.0939 0.0607 0.0257 0.00971 0.00368 0.00185 0.00147 0.0014 0.00067 0.00021 1.9e-05 2.1e-06 6.4e-08 5e-10 0.55 0.548 0.542 0.531 0.517 0.479 0.43 0.376 0.319 0.264 0.213 0.132 0.0814 0.0557 0.046 0.044 0.0439 0.0397 0.024 0.007 0.00498 0.0045 0.00295 0.00156 0.00063 0.00036 7.7e-05 4.8e-05 1.5e-05 1.8e-06 1.2e-06 0.376 0.376 0.376 0.375 0.375 0.373 0.367 0.357 0.341 0.32 0.294 0.233 0.169 0.115 0.0735 0.0463 0.0305 0.0196 0.0185 0.0114 0.00418 0.00203 0.00186 0.00173 0.00088 0.00019 0.00014 1.8e-05 1.1e-05 6.2e-06 9.1e-07 0.449 0.449 0.449 0.449 0.448 0.442 0.43 0.409 0.378 0.34 0.297 0.209 0.133 0.0788 0.0455 0.0282 0.0209 0.0184 0.0164 0.00688 0.00232 0.00174 0.00166 0.00127 0.00046 0.00018 8.6e-05 1.3e-05 1.1e-05 3.7e-06 2.8e-07 1.99 1.91 1.69 1.39 1.05 0.499 0.198 0.0889 0.0647 0.0631 0.061 0.0444 0.0251 0.0125 0.00635 0.00409 0.00355 0.00344 0.00233 0.000631 0.00037 0.000344 0.000232 0.000123 4.7e-05 2.7e-05 5.7e-06 3.5e-06 1.1e-06 1.3e-07 8.8e-08 +Z 95 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 1.0 2.0 2.0 4.0 2.0 125569.99999999999 23827.0 23062.0 18527.0 6102.1 5741.6 4685.5 4103.599999999999 3892.5 1595.2 1428.1999999999998 1147.0 877.9000000000001 826.68 471.03 457.17 362.44 295.06 225.25 125.28999999999999 114.9 8.290000000000001 7.0 55.059999999999995 35.14 23.89 5.49 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00705 0.00704 0.00704 0.00703 0.00701 0.00699 0.00697 0.00694 0.0069 0.0067 0.0064 0.0057 0.0049 0.0034 0.0014 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0254 0.0253 0.0253 0.0253 0.0252 0.0252 0.0251 0.025 0.0248 0.0243 0.0237 0.023 0.0222 0.0214 0.019 0.014 0.0091 0.003 0.00099 0.0006 0.00036 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.0121 0.012 0.012 0.011 0.0079 0.0052 0.0019 0.00028 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0147 0.0146 0.0146 0.0146 0.0145 0.014 0.013 0.012 0.0077 0.0042 0.0011 9.1e-05 0.0557 0.0557 0.0556 0.0556 0.0556 0.0556 0.0555 0.0554 0.0554 0.0552 0.0551 0.0548 0.0545 0.054 0.0535 0.053 0.0524 0.051 0.0486 0.0437 0.0382 0.0325 0.0269 0.0218 0.014 0.0049 0.0043 0.0026 0.00075 0.00013 9.1e-05 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0324 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0323 0.0322 0.032 0.0315 0.0306 0.0295 0.028 0.024 0.013 0.0049 0.0012 0.0011 0.00057 8.5e-05 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0364 0.0363 0.0362 0.0357 0.0349 0.0335 0.0317 0.0294 0.024 0.01 0.0033 0.0016 0.0013 0.0004 3.1e-05 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0232 0.0231 0.0229 0.022 0.017 0.011 0.0035 0.00098 9.1e-05 2.5e-06 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0241 0.0239 0.0236 0.023 0.017 0.011 0.0032 0.00081 6.5e-05 1.3e-06 0.109 0.109 0.109 0.109 0.109 0.109 0.108 0.107 0.107 0.106 0.105 0.102 0.0994 0.0961 0.0925 0.0885 0.0843 0.0753 0.0614 0.0403 0.025 0.0163 0.0126 0.0117 0.011 0.0044 0.0013 0.00093 0.00029 3.7e-05 2.5e-05 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0684 0.0683 0.0681 0.068 0.0677 0.0673 0.0663 0.0638 0.0567 0.0467 0.0355 0.0251 0.0168 0.0075 0.0048 0.0029 0.00041 0.00028 0.00016 2.4e-05 0.076 0.076 0.076 0.076 0.076 0.076 0.076 0.076 0.076 0.076 0.0759 0.0759 0.0757 0.0755 0.0752 0.0748 0.0742 0.0725 0.0685 0.0582 0.0447 0.0313 0.0202 0.0127 0.0064 0.0051 0.0021 0.00039 0.00035 0.00012 9.1e-06 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0559 0.0558 0.0558 0.0557 0.0553 0.0533 0.0492 0.043 0.0352 0.0272 0.014 0.0026 0.0022 0.0011 0.00033 3.1e-05 8.3e-07 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0576 0.0575 0.0575 0.0575 0.0573 0.0568 0.0546 0.0499 0.0429 0.0346 0.0262 0.013 0.0026 0.0023 0.001 0.00028 2.3e-05 4.4e-07 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0443 0.0438 0.0427 0.0405 0.0371 0.033 0.024 0.008 0.0023 0.00021 2.4e-05 7.2e-07 5.5e-09 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.045 0.0445 0.0433 0.0408 0.0373 0.033 0.024 0.0077 0.0022 0.00018 2e-05 5.5e-07 3.4e-09 0.222 0.222 0.222 0.221 0.22 0.217 0.213 0.208 0.201 0.194 0.187 0.169 0.15 0.131 0.112 0.0942 0.0782 0.0529 0.0316 0.0241 0.023 0.0174 0.0105 0.00574 0.0031 0.0018 0.0004 0.00025 8.3e-05 9.4e-06 6.4e-06 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.146 0.145 0.145 0.143 0.14 0.136 0.13 0.123 0.115 0.0962 0.066 0.0283 0.0134 0.011 0.0108 0.00925 0.0044 0.0011 0.00083 0.00011 6.4e-05 3.8e-05 5.8e-06 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.161 0.16 0.157 0.153 0.146 0.138 0.128 0.117 0.0916 0.0563 0.0213 0.0126 0.0122 0.0108 0.00787 0.0029 0.0013 0.00062 9.2e-05 8.2e-05 2.8e-05 2.2e-06 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.135 0.134 0.133 0.13 0.126 0.121 0.107 0.08 0.0384 0.015 0.00694 0.00552 0.00546 0.0041 0.00066 0.00039 0.00022 6.9e-05 6.4e-06 1.7e-07 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.138 0.136 0.133 0.128 0.122 0.107 0.0785 0.0359 0.0136 0.00665 0.00569 0.0056 0.0039 0.0006 0.00041 0.00021 5.8e-05 4.7e-06 9.1e-08 0.174 0.174 0.174 0.174 0.174 0.174 0.174 0.174 0.173 0.173 0.172 0.168 0.163 0.154 0.144 0.133 0.121 0.0968 0.0646 0.0287 0.0113 0.00437 0.0021 0.00156 0.0015 0.00075 0.00024 2.2e-05 2.6e-06 7.8e-08 6.1e-10 0.187 0.187 0.187 0.187 0.187 0.187 0.187 0.186 0.186 0.185 0.183 0.177 0.168 0.157 0.144 0.131 0.117 0.0917 0.0596 0.0257 0.00991 0.00379 0.00188 0.00146 0.0014 0.00068 0.00021 1.9e-05 2.1e-06 5.6e-08 3.6e-10 0.538 0.536 0.53 0.52 0.507 0.471 0.425 0.373 0.319 0.266 0.216 0.136 0.0846 0.0571 0.046 0.0432 0.043 0.0398 0.0253 0.00753 0.00494 0.00459 0.00316 0.00172 0.00065 0.00038 8.3e-05 4.9e-05 1.7e-05 1.8e-06 1.2e-06 0.367 0.367 0.367 0.367 0.366 0.364 0.359 0.35 0.336 0.316 0.292 0.234 0.174 0.12 0.0781 0.0497 0.0326 0.0197 0.0182 0.012 0.00463 0.00211 0.00185 0.00176 0.00096 0.00019 0.00015 2e-05 1.1e-05 6.5e-06 1e-06 0.441 0.441 0.441 0.441 0.44 0.435 0.423 0.403 0.375 0.339 0.298 0.213 0.138 0.0829 0.0484 0.0297 0.0213 0.018 0.0165 0.00738 0.00247 0.00173 0.00167 0.00133 0.00051 0.00018 9.2e-05 1.3e-05 1.2e-05 4e-06 3.1e-07 1.97 1.89 1.68 1.38 1.06 0.51 0.206 0.0907 0.0632 0.0609 0.0594 0.0446 0.026 0.0133 0.00672 0.00414 0.00343 0.00332 0.00237 0.000675 0.000359 0.00034 0.000242 0.000133 4.7e-05 2.8e-05 6.1e-06 3.5e-06 1.2e-06 1.3e-07 8.9e-08 +Z 96 28 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 1.0 2.0 2.0 4.0 1.0 2.0 128860.0 24554.0 23776.0 18994.0 6313.1 5945.599999999999 4829.0 4237.2 4015.6000000000004 1664.1 1493.2 1194.3999999999999 919.64 865.4399999999999 502.25 487.46999999999997 384.3 314.8 239.65 136.46 125.22999999999999 13.48 11.950000000000001 60.690000000000005 39.64 27.0 4.65 3.9299999999999997 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00693 0.00692 0.00692 0.00691 0.00689 0.00687 0.00685 0.00683 0.0068 0.0066 0.0063 0.0056 0.0049 0.0034 0.0014 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.0249 0.0249 0.0249 0.0248 0.0248 0.0247 0.0246 0.0244 0.024 0.0234 0.0227 0.022 0.0211 0.019 0.014 0.0092 0.0031 0.001 0.00059 0.00036 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.0119 0.011 0.011 0.0079 0.0052 0.0019 0.0003 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0145 0.0144 0.0144 0.014 0.013 0.012 0.0077 0.0043 0.0011 9.6e-05 0.0548 0.0548 0.0548 0.0548 0.0548 0.0547 0.0547 0.0546 0.0545 0.0544 0.0543 0.054 0.0536 0.0532 0.0528 0.0522 0.0517 0.0503 0.048 0.0433 0.0381 0.0325 0.0271 0.0221 0.014 0.005 0.0042 0.0027 0.00081 0.00013 9.2e-05 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0318 0.0317 0.0315 0.031 0.0302 0.0292 0.0277 0.024 0.013 0.0051 0.0012 0.0011 0.00058 9.1e-05 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0359 0.0358 0.0357 0.0353 0.0345 0.0332 0.0315 0.0292 0.024 0.01 0.0034 0.0016 0.0013 0.00041 3.3e-05 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.0229 0.0228 0.0226 0.022 0.017 0.012 0.0037 0.001 9.8e-05 2.7e-06 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0239 0.0238 0.0238 0.0236 0.0233 0.022 0.017 0.011 0.0033 0.00086 7e-05 1.5e-06 0.107 0.107 0.107 0.107 0.107 0.107 0.106 0.106 0.105 0.104 0.103 0.101 0.098 0.0948 0.0913 0.0875 0.0835 0.0749 0.0614 0.0408 0.0256 0.0166 0.0127 0.0116 0.011 0.0047 0.0013 0.00095 0.00032 3.7e-05 2.6e-05 0.0672 0.0672 0.0672 0.0672 0.0672 0.0672 0.0672 0.0672 0.0672 0.0672 0.0672 0.0671 0.067 0.0669 0.0668 0.0665 0.0662 0.0652 0.0629 0.0563 0.0468 0.0361 0.0258 0.0175 0.0078 0.0048 0.0031 0.00043 0.00027 0.00016 2.6e-05 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0748 0.0747 0.0747 0.0746 0.0744 0.0741 0.0737 0.0731 0.0715 0.0678 0.058 0.0451 0.0319 0.0209 0.0132 0.0065 0.0051 0.0022 0.00039 0.00035 0.00012 9.8e-06 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0549 0.0548 0.0544 0.0526 0.0488 0.0429 0.0356 0.0278 0.015 0.0027 0.0022 0.0011 0.00036 3.4e-05 9.2e-07 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0566 0.0565 0.0564 0.0559 0.0539 0.0496 0.043 0.035 0.0268 0.013 0.0026 0.0023 0.0011 0.0003 2.5e-05 4.9e-07 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0435 0.0434 0.0431 0.042 0.04 0.037 0.0331 0.024 0.0084 0.0025 0.00023 2.7e-05 8.2e-07 6.3e-09 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0442 0.0441 0.0437 0.0426 0.0404 0.0372 0.0331 0.024 0.0081 0.0023 0.0002 2.3e-05 6.3e-07 3.9e-09 0.217 0.217 0.216 0.216 0.215 0.212 0.208 0.203 0.197 0.191 0.183 0.167 0.149 0.131 0.112 0.0953 0.0796 0.0544 0.0325 0.0238 0.023 0.018 0.0112 0.00621 0.0031 0.0019 0.00043 0.00026 9.1e-05 9.7e-06 6.6e-06 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.142 0.141 0.14 0.137 0.133 0.128 0.122 0.114 0.0966 0.0676 0.03 0.014 0.0109 0.0107 0.00949 0.0048 0.0011 0.00087 0.00012 6.4e-05 4e-05 6.3e-06 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.158 0.158 0.157 0.157 0.154 0.15 0.144 0.136 0.127 0.116 0.0926 0.0582 0.0225 0.0128 0.0122 0.011 0.00826 0.0031 0.0013 0.00067 9.5e-05 8.4e-05 3e-05 2.4e-06 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.132 0.131 0.129 0.127 0.124 0.119 0.106 0.0815 0.0408 0.0165 0.00741 0.00559 0.0055 0.0043 0.00073 0.00039 0.00023 7.5e-05 7.2e-06 1.9e-07 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.135 0.135 0.134 0.133 0.13 0.126 0.121 0.107 0.0801 0.0382 0.0148 0.007 0.00572 0.00566 0.0041 0.00065 0.00041 0.00022 6.3e-05 5.2e-06 1e-07 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.159 0.157 0.154 0.148 0.141 0.133 0.123 0.102 0.0708 0.0334 0.0138 0.00543 0.00251 0.00175 0.0016 0.00087 0.00029 2.7e-05 3.2e-06 1e-07 7.9e-10 0.166 0.166 0.166 0.166 0.166 0.166 0.166 0.166 0.166 0.166 0.165 0.163 0.158 0.151 0.143 0.133 0.122 0.0993 0.0678 0.0311 0.0125 0.00489 0.00232 0.00169 0.0016 0.00082 0.00026 2.4e-05 2.7e-06 7.4e-08 4.9e-10 0.516 0.515 0.509 0.501 0.489 0.456 0.415 0.367 0.317 0.267 0.221 0.143 0.0899 0.0603 0.0471 0.0432 0.0427 0.0406 0.0273 0.00842 0.00503 0.00477 0.00345 0.00195 0.00069 0.00042 9.3e-05 5.2e-05 1.9e-05 1.9e-06 1.3e-06 0.353 0.353 0.353 0.353 0.353 0.351 0.347 0.339 0.326 0.309 0.288 0.235 0.179 0.127 0.0851 0.0552 0.0363 0.0206 0.0183 0.013 0.0053 0.00229 0.00189 0.00183 0.0011 0.0002 0.00016 2.3e-05 1.1e-05 7e-06 1.1e-06 0.421 0.421 0.421 0.421 0.42 0.416 0.407 0.39 0.366 0.335 0.299 0.22 0.148 0.0921 0.055 0.0338 0.0234 0.0184 0.0173 0.0084 0.00282 0.00182 0.00177 0.00146 0.00058 0.00019 0.0001 1.4e-05 1.2e-05 4.4e-06 3.5e-07 0.516 0.516 0.516 0.516 0.515 0.509 0.49 0.455 0.406 0.35 0.294 0.193 0.118 0.0694 0.0394 0.022 0.0127 0.00589 0.00494 0.00376 0.00173 0.000668 0.000376 0.000346 0.00029 5.1e-05 2.5e-05 1.5e-05 5e-06 4.8e-07 1.3e-08 1.83 1.76 1.59 1.34 1.06 0.555 0.246 0.109 0.0684 0.062 0.0616 0.0507 0.0323 0.0176 0.00909 0.00527 0.004 0.00375 0.0029 0.000881 0.000416 0.000398 0.000298 0.00017 5.7e-05 3.5e-05 7.7e-06 4.2e-06 1.5e-06 1.6e-07 1.1e-07 +Z 97 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 3.0 2.0 2.0 4.0 2.0 132210.0 25294.0 24503.0 19462.0 6523.3 6148.8 4968.6 4366.9 4134.299999999999 1728.8 1554.0 1236.6000000000001 956.12 898.82 528.02 512.27 400.87 329.26 248.62 142.39 130.35 14.53 12.84 62.79 41.010000000000005 27.509999999999998 4.6 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.00681 0.0068 0.0068 0.00679 0.00677 0.00676 0.00674 0.00671 0.0067 0.0065 0.0062 0.0056 0.0048 0.0034 0.0015 0.0246 0.0246 0.0246 0.0246 0.0246 0.0246 0.0246 0.0246 0.0246 0.0246 0.0246 0.0245 0.0245 0.0245 0.0244 0.0244 0.0243 0.0242 0.024 0.0236 0.0231 0.0224 0.0217 0.0209 0.019 0.014 0.0094 0.0032 0.0011 0.00058 0.00037 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.0117 0.011 0.01 0.0079 0.0053 0.002 0.00032 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0143 0.0142 0.0142 0.014 0.013 0.012 0.0078 0.0044 0.0012 0.0001 0.0539 0.0539 0.0539 0.0539 0.0539 0.0539 0.0538 0.0537 0.0537 0.0536 0.0534 0.0532 0.0528 0.0524 0.052 0.0515 0.0509 0.0497 0.0474 0.043 0.0379 0.0325 0.0272 0.0223 0.014 0.005 0.0041 0.0027 0.00086 0.00013 9.4e-05 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0313 0.0312 0.031 0.0305 0.0298 0.0288 0.0275 0.024 0.013 0.0054 0.0012 0.0011 0.0006 9.7e-05 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0355 0.0354 0.0354 0.0354 0.0353 0.0349 0.0341 0.0329 0.0312 0.0291 0.024 0.011 0.0036 0.0015 0.0013 0.00043 3.6e-05 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0226 0.0225 0.0223 0.022 0.017 0.012 0.0038 0.0011 0.00011 3e-06 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0236 0.0235 0.0233 0.0231 0.022 0.017 0.011 0.0034 0.0009 7.5e-05 1.6e-06 0.105 0.105 0.105 0.105 0.105 0.105 0.104 0.104 0.103 0.102 0.101 0.0991 0.0965 0.0935 0.0902 0.0866 0.0827 0.0744 0.0615 0.0414 0.0262 0.017 0.0128 0.0115 0.011 0.0049 0.0014 0.00096 0.00034 3.8e-05 2.6e-05 0.066 0.066 0.066 0.066 0.066 0.066 0.066 0.066 0.066 0.066 0.0659 0.0659 0.0658 0.0657 0.0656 0.0654 0.0651 0.0642 0.062 0.0558 0.0469 0.0365 0.0265 0.0182 0.0082 0.0047 0.0032 0.00046 0.00027 0.00017 2.8e-05 0.0736 0.0736 0.0736 0.0736 0.0736 0.0736 0.0736 0.0736 0.0736 0.0736 0.0736 0.0735 0.0734 0.0732 0.073 0.0726 0.0721 0.0706 0.0671 0.0578 0.0454 0.0325 0.0216 0.0137 0.0066 0.0052 0.0023 0.0004 0.00036 0.00013 1.1e-05 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.0539 0.0535 0.0519 0.0484 0.0429 0.0359 0.0283 0.015 0.0028 0.0022 0.0012 0.00038 3.7e-05 1e-06 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0557 0.0556 0.0555 0.0551 0.0532 0.0492 0.043 0.0353 0.0273 0.014 0.0027 0.0023 0.0011 0.00032 2.7e-05 5.4e-07 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0427 0.0426 0.0426 0.0423 0.0414 0.0396 0.0368 0.0331 0.025 0.0088 0.0027 0.00025 3e-05 9.3e-07 7.2e-09 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0434 0.0433 0.0433 0.043 0.042 0.04 0.037 0.0331 0.024 0.0084 0.0025 0.00022 2.5e-05 7.1e-07 4.5e-09 0.213 0.212 0.212 0.211 0.21 0.208 0.204 0.2 0.194 0.188 0.181 0.165 0.148 0.13 0.113 0.0961 0.0808 0.0557 0.0332 0.0235 0.0229 0.0185 0.0118 0.00669 0.0032 0.002 0.00046 0.00026 9.9e-05 1e-05 6.8e-06 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.139 0.138 0.137 0.134 0.131 0.126 0.121 0.113 0.0968 0.069 0.0316 0.0145 0.0109 0.0107 0.00967 0.0052 0.0011 0.0009 0.00013 6.3e-05 4.1e-05 6.9e-06 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.155 0.155 0.154 0.152 0.148 0.142 0.135 0.126 0.116 0.0933 0.0597 0.0236 0.0129 0.012 0.0111 0.00857 0.0034 0.0013 0.00071 9.8e-05 8.5e-05 3.1e-05 2.6e-06 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.129 0.129 0.129 0.129 0.129 0.128 0.127 0.125 0.122 0.118 0.106 0.0823 0.0425 0.0177 0.00784 0.00561 0.00547 0.0045 0.00079 0.00039 0.00025 8e-05 7.9e-06 2.2e-07 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.132 0.131 0.128 0.125 0.12 0.107 0.0809 0.0397 0.0158 0.00728 0.00569 0.00562 0.0043 0.00069 0.00041 0.00023 6.8e-05 5.7e-06 1.1e-07 0.16 0.16 0.16 0.16 0.16 0.16 0.16 0.16 0.159 0.159 0.159 0.157 0.153 0.147 0.14 0.131 0.121 0.1 0.0706 0.0343 0.0146 0.0059 0.00268 0.00176 0.0016 0.0009 0.0003 3e-05 3.6e-06 1.1e-07 9.1e-10 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.169 0.168 0.167 0.164 0.158 0.15 0.141 0.131 0.119 0.097 0.0666 0.0313 0.0131 0.0052 0.0024 0.00165 0.0015 0.00083 0.00027 2.6e-05 2.9e-06 8.2e-08 5.4e-10 0.515 0.513 0.508 0.499 0.488 0.456 0.415 0.368 0.318 0.269 0.222 0.144 0.0908 0.0603 0.0464 0.0418 0.0412 0.0396 0.0275 0.00877 0.00487 0.00468 0.00353 0.00207 0.0007 0.00043 0.0001 5.2e-05 2e-05 2e-06 1.3e-06 0.351 0.351 0.351 0.351 0.351 0.349 0.345 0.337 0.325 0.309 0.288 0.236 0.18 0.129 0.0868 0.0566 0.037 0.0203 0.0175 0.013 0.00557 0.00234 0.00182 0.00178 0.0011 0.00019 0.00016 2.4e-05 1.1e-05 7.1e-06 1.2e-06 0.427 0.427 0.427 0.427 0.426 0.422 0.412 0.394 0.369 0.336 0.299 0.219 0.146 0.0905 0.0539 0.0328 0.0224 0.0172 0.0163 0.00827 0.00282 0.00171 0.00167 0.00142 0.0006 0.00018 0.0001 1.4e-05 1.2e-05 4.4e-06 3.6e-07 1.93 1.86 1.66 1.38 1.07 0.53 0.22 0.0948 0.0609 0.0568 0.0561 0.0445 0.0275 0.0147 0.00751 0.00434 0.00328 0.00306 0.00241 0.00077 0.000343 0.000327 0.000255 0.000152 5e-05 3e-05 6.9e-06 3.6e-06 1.4e-06 1.3e-07 9.1e-08 +Z 98 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 4.0 2.0 2.0 4.0 2.0 135630.0 26047.0 25242.0 19929.0 6732.5 6350.9 5103.8 4492.2 4248.1 1788.7 1609.9 1272.9 986.74 926.1999999999999 547.73 530.98 411.58 337.87 251.58 142.47 129.66 10.78 9.02 60.88 38.79 25.1 5.71 0.0067 0.0067 0.0067 0.0067 0.0067 0.0067 0.0067 0.0067 0.0067 0.0067 0.00669 0.00669 0.00669 0.00669 0.00669 0.00669 0.00669 0.00669 0.00668 0.00667 0.00666 0.00664 0.00662 0.0066 0.0065 0.0064 0.0061 0.0055 0.0048 0.0034 0.0015 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0242 0.0241 0.0241 0.0241 0.024 0.024 0.024 0.0239 0.0237 0.0233 0.0227 0.0221 0.0214 0.0207 0.019 0.014 0.0095 0.0034 0.0011 0.00057 0.00038 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.0115 0.011 0.011 0.01 0.0079 0.0054 0.0021 0.00034 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.0141 0.014 0.014 0.013 0.012 0.0078 0.0045 0.0012 0.00011 0.0531 0.0531 0.0531 0.0531 0.0531 0.053 0.053 0.0529 0.0528 0.0527 0.0526 0.0524 0.052 0.0517 0.0512 0.0508 0.0502 0.049 0.0469 0.0426 0.0377 0.0325 0.0274 0.0225 0.014 0.0051 0.0041 0.0028 0.00093 0.00013 9.5e-05 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0308 0.0307 0.0305 0.0301 0.0294 0.0285 0.0272 0.024 0.013 0.0056 0.0012 0.0011 0.00062 0.0001 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.035 0.0349 0.0348 0.0344 0.0337 0.0326 0.031 0.029 0.024 0.011 0.0037 0.0015 0.0013 0.00045 3.8e-05 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0224 0.0223 0.0222 0.022 0.021 0.017 0.012 0.004 0.0012 0.00011 3.3e-06 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0233 0.0232 0.0231 0.0228 0.022 0.017 0.012 0.0035 0.00095 8.1e-05 1.7e-06 0.104 0.103 0.103 0.103 0.103 0.103 0.103 0.102 0.101 0.101 0.0997 0.0976 0.0951 0.0923 0.0891 0.0856 0.0819 0.074 0.0615 0.0419 0.0268 0.0174 0.0129 0.0114 0.011 0.0052 0.0014 0.00098 0.00037 3.9e-05 2.6e-05 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0648 0.0647 0.0647 0.0646 0.0644 0.0642 0.0639 0.0631 0.0611 0.0554 0.0469 0.037 0.0272 0.0189 0.0086 0.0047 0.0033 0.0005 0.00026 0.00017 3e-05 0.0725 0.0725 0.0725 0.0725 0.0725 0.0725 0.0725 0.0725 0.0725 0.0725 0.0725 0.0724 0.0723 0.0721 0.0719 0.0715 0.071 0.0697 0.0664 0.0575 0.0456 0.0331 0.0222 0.0143 0.0068 0.0052 0.0025 0.0004 0.00036 0.00013 1.1e-05 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.0531 0.053 0.0527 0.0512 0.048 0.0428 0.0361 0.0288 0.016 0.0029 0.0022 0.0012 0.0004 4e-05 1.1e-06 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0548 0.0547 0.0543 0.0525 0.0488 0.043 0.0356 0.0278 0.015 0.0028 0.0023 0.0011 0.00034 2.9e-05 6e-07 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0419 0.0418 0.0416 0.0408 0.0391 0.0365 0.0331 0.025 0.0092 0.0028 0.00027 3.3e-05 1.1e-06 8.3e-09 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0426 0.0425 0.0422 0.0413 0.0396 0.0368 0.0332 0.025 0.0088 0.0026 0.00024 2.8e-05 8.1e-07 5.1e-09 0.208 0.208 0.207 0.207 0.206 0.203 0.2 0.196 0.191 0.185 0.178 0.163 0.147 0.13 0.113 0.0968 0.0819 0.0571 0.0341 0.0233 0.0227 0.0189 0.0125 0.0072 0.0032 0.0021 0.0005 0.00027 0.00011 1e-05 6.9e-06 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.136 0.135 0.134 0.132 0.129 0.124 0.119 0.112 0.0968 0.0703 0.0332 0.0152 0.0108 0.0106 0.00981 0.0055 0.0011 0.00093 0.00015 6.3e-05 4.3e-05 7.5e-06 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.153 0.152 0.152 0.151 0.149 0.146 0.14 0.134 0.125 0.116 0.094 0.0613 0.0247 0.013 0.0119 0.0112 0.00887 0.0036 0.0013 0.00075 0.0001 8.6e-05 3.3e-05 2.8e-06 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.127 0.126 0.126 0.126 0.124 0.123 0.12 0.116 0.105 0.0831 0.0444 0.0191 0.00837 0.00568 0.00546 0.0046 0.00086 0.0004 0.00026 8.7e-05 8.8e-06 2.4e-07 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.131 0.13 0.13 0.128 0.126 0.123 0.118 0.106 0.0818 0.0415 0.017 0.00766 0.0057 0.0056 0.0044 0.00075 0.00041 0.00024 7.3e-05 6.3e-06 1.3e-07 0.154 0.154 0.154 0.154 0.154 0.154 0.154 0.154 0.154 0.153 0.153 0.151 0.148 0.143 0.137 0.129 0.12 0.101 0.0729 0.0368 0.0163 0.00675 0.00302 0.00187 0.0016 0.00097 0.00034 3.4e-05 4.2e-06 1.3e-07 1.1e-09 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.162 0.161 0.158 0.154 0.147 0.139 0.13 0.119 0.0986 0.0694 0.0339 0.0146 0.00597 0.00271 0.00175 0.0016 0.0009 0.0003 2.9e-05 3.4e-06 9.8e-08 6.5e-10 0.505 0.503 0.498 0.49 0.479 0.449 0.41 0.365 0.317 0.27 0.225 0.148 0.0939 0.0621 0.0468 0.0414 0.0404 0.0392 0.0284 0.00946 0.00487 0.00468 0.00369 0.00225 0.00074 0.00046 0.00011 5.3e-05 2.2e-05 2.1e-06 1.4e-06 0.344 0.344 0.344 0.344 0.344 0.342 0.338 0.331 0.32 0.305 0.285 0.237 0.183 0.133 0.091 0.06 0.0394 0.0208 0.017 0.0134 0.00605 0.0025 0.00181 0.00177 0.0012 0.00019 0.00016 2.7e-05 1.1e-05 7.4e-06 1.3e-06 0.421 0.421 0.421 0.421 0.42 0.416 0.406 0.39 0.366 0.335 0.299 0.221 0.15 0.094 0.0565 0.0344 0.0231 0.0169 0.0162 0.00867 0.00302 0.00171 0.00165 0.00144 0.00064 0.00018 0.00011 1.4e-05 1.2e-05 4.6e-06 3.9e-07 1.91 1.84 1.65 1.37 1.07 0.54 0.228 0.0972 0.0601 0.0549 0.0545 0.0443 0.0281 0.0154 0.00794 0.00449 0.00324 0.00293 0.00241 0.000819 0.000339 0.000318 0.000259 0.000161 5.2e-05 3.1e-05 7.4e-06 3.6e-06 1.4e-06 1.4e-07 9.1e-08 +Z 99 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 5.0 2.0 2.0 4.0 2.0 139110.0 26824.0 26007.0 20409.0 6953.1 6564.6 5247.2 4625.5 4369.6 1856.3 1673.6 1315.9 1024.0 960.07 573.93 556.13 428.63 352.76 260.36 148.17000000000002 134.48 11.54 9.61 62.849999999999994 40.02 25.44 5.779999999999999 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00658 0.00657 0.00657 0.00657 0.00656 0.00654 0.00653 0.00651 0.00649 0.0064 0.0063 0.006 0.0054 0.0047 0.0034 0.0015 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0238 0.0237 0.0237 0.0237 0.0236 0.0236 0.0235 0.0233 0.0229 0.0224 0.0218 0.0212 0.0204 0.019 0.014 0.0096 0.0035 0.0012 0.00056 0.00038 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.0113 0.011 0.011 0.01 0.0079 0.0054 0.0022 0.00036 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.0139 0.0139 0.0139 0.0139 0.013 0.012 0.0079 0.0045 0.0013 0.00011 0.0523 0.0523 0.0523 0.0522 0.0522 0.0522 0.0522 0.0521 0.052 0.0519 0.0518 0.0516 0.0513 0.0509 0.0505 0.05 0.0495 0.0484 0.0463 0.0422 0.0375 0.0325 0.0275 0.0227 0.015 0.0052 0.004 0.0028 0.00099 0.00013 9.6e-05 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0303 0.0302 0.03 0.0296 0.029 0.0281 0.027 0.024 0.014 0.0059 0.0012 0.0011 0.00063 0.00011 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0346 0.0345 0.0345 0.0345 0.0344 0.034 0.0333 0.0323 0.0308 0.0288 0.024 0.011 0.0039 0.0015 0.0013 0.00046 4e-05 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.0221 0.022 0.0219 0.0218 0.021 0.017 0.012 0.0041 0.0012 0.00012 3.6e-06 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.023 0.0229 0.0228 0.0226 0.022 0.017 0.012 0.0037 0.001 8.7e-05 1.9e-06 0.102 0.102 0.102 0.102 0.101 0.101 0.101 0.1 0.0996 0.0989 0.0981 0.0961 0.0937 0.091 0.088 0.0846 0.0811 0.0735 0.0614 0.0423 0.0273 0.0178 0.013 0.0113 0.011 0.0054 0.0015 0.00099 0.0004 4e-05 2.7e-05 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0636 0.0635 0.0634 0.0633 0.0631 0.0629 0.0621 0.0602 0.0549 0.0469 0.0373 0.0278 0.0196 0.009 0.0046 0.0034 0.00053 0.00026 0.00018 3.2e-05 0.0714 0.0714 0.0714 0.0714 0.0714 0.0714 0.0714 0.0714 0.0714 0.0714 0.0714 0.0713 0.0712 0.071 0.0708 0.0705 0.07 0.0688 0.0657 0.0573 0.0459 0.0336 0.0229 0.0148 0.0069 0.0052 0.0026 0.00041 0.00036 0.00014 1.2e-05 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0523 0.0522 0.0522 0.0519 0.0505 0.0475 0.0427 0.0363 0.0292 0.016 0.003 0.0022 0.0013 0.00042 4.4e-05 1.2e-06 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.054 0.0539 0.0539 0.0538 0.0535 0.0519 0.0484 0.0429 0.0359 0.0283 0.015 0.0028 0.0023 0.0012 0.00036 3.1e-05 6.6e-07 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0409 0.0401 0.0387 0.0363 0.0331 0.025 0.0096 0.003 0.0003 3.7e-05 1.2e-06 9.5e-09 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0418 0.0415 0.0407 0.0391 0.0365 0.0332 0.025 0.0092 0.0028 0.00027 3.1e-05 9.1e-07 5.8e-09 0.204 0.203 0.203 0.202 0.202 0.199 0.196 0.192 0.187 0.182 0.175 0.161 0.146 0.13 0.113 0.0975 0.0829 0.0584 0.0349 0.0231 0.0225 0.0192 0.0131 0.00773 0.0033 0.0022 0.00055 0.00027 0.00012 1.1e-05 7.1e-06 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.133 0.132 0.131 0.129 0.126 0.122 0.117 0.111 0.0968 0.0715 0.0348 0.016 0.0109 0.0105 0.00991 0.0059 0.0011 0.00096 0.00016 6.3e-05 4.4e-05 8.1e-06 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.149 0.149 0.147 0.143 0.139 0.132 0.124 0.115 0.0945 0.0627 0.0259 0.0132 0.0118 0.0113 0.00915 0.0039 0.0013 0.00079 0.0001 8.7e-05 3.5e-05 3e-06 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.124 0.123 0.122 0.12 0.118 0.114 0.104 0.0838 0.0462 0.0204 0.00894 0.00577 0.00544 0.0047 0.00094 0.0004 0.00027 9.3e-05 9.6e-06 2.7e-07 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.128 0.127 0.126 0.124 0.121 0.117 0.106 0.0826 0.0432 0.0182 0.00809 0.00573 0.00558 0.0046 0.00081 0.00042 0.00025 7.8e-05 6.9e-06 1.4e-07 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.149 0.148 0.148 0.147 0.144 0.14 0.134 0.127 0.119 0.102 0.0749 0.0391 0.0179 0.00763 0.0034 0.002 0.0017 0.001 0.00037 3.9e-05 4.9e-06 1.6e-07 1.3e-09 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.156 0.155 0.153 0.149 0.144 0.137 0.128 0.119 0.0997 0.0717 0.0363 0.0162 0.00679 0.00305 0.00187 0.0016 0.00097 0.00034 3.4e-05 4e-06 1.2e-07 7.7e-10 0.495 0.493 0.488 0.481 0.47 0.442 0.405 0.362 0.317 0.271 0.227 0.151 0.097 0.064 0.0474 0.041 0.0396 0.0388 0.0292 0.0102 0.00489 0.00466 0.00383 0.00243 0.00079 0.00048 0.00012 5.4e-05 2.3e-05 2.2e-06 1.4e-06 0.337 0.337 0.337 0.337 0.337 0.336 0.332 0.326 0.315 0.301 0.283 0.237 0.186 0.137 0.0949 0.0635 0.0419 0.0214 0.0167 0.0136 0.00653 0.00268 0.0018 0.00176 0.0012 0.0002 0.00017 3e-05 1.1e-05 7.6e-06 1.4e-06 0.415 0.415 0.415 0.415 0.414 0.41 0.402 0.386 0.363 0.333 0.299 0.223 0.153 0.0974 0.0592 0.036 0.0238 0.0166 0.0159 0.00902 0.00322 0.00172 0.00163 0.00146 0.00069 0.00018 0.00011 1.5e-05 1.2e-05 4.9e-06 4.2e-07 1.89 1.82 1.64 1.37 1.07 0.549 0.235 0.0999 0.0596 0.0532 0.0529 0.044 0.0287 0.016 0.00838 0.00467 0.00323 0.00281 0.0024 0.00087 0.000339 0.000308 0.000262 0.00017 5.4e-05 3.2e-05 8e-06 3.5e-06 1.5e-06 1.4e-07 9.1e-08 +Z 100 27 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 6.0 2.0 2.0 4.0 2.0 142680.0 27622.0 26792.0 20894.0 7179.7 6784.0 5392.6 4760.8 4492.7 1925.8000000000002 1739.0 1359.6000000000001 1061.8 994.3599999999999 600.52 581.62 446.11 368.06 269.17 153.89000000000001 139.29 12.29 10.180000000000001 64.85000000000001 41.27 25.77 5.85 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00646 0.00645 0.00644 0.00643 0.00642 0.0064 0.00638 0.0063 0.0062 0.0059 0.0054 0.0047 0.0034 0.0015 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0234 0.0233 0.0233 0.0233 0.0232 0.0231 0.0229 0.0226 0.0221 0.0216 0.0209 0.0202 0.019 0.014 0.0097 0.0036 0.0012 0.00054 0.00039 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.0111 0.011 0.011 0.01 0.0079 0.0055 0.0022 0.00038 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0138 0.0137 0.0137 0.013 0.012 0.0079 0.0046 0.0013 0.00012 0.0515 0.0515 0.0514 0.0514 0.0514 0.0514 0.0513 0.0513 0.0512 0.0511 0.051 0.0508 0.0505 0.0502 0.0498 0.0493 0.0488 0.0477 0.0458 0.0418 0.0373 0.0324 0.0276 0.0229 0.015 0.0053 0.0039 0.0029 0.0011 0.00014 9.7e-05 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0298 0.0297 0.0295 0.0292 0.0286 0.0278 0.0267 0.024 0.014 0.0062 0.0013 0.0011 0.00065 0.00012 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.0341 0.034 0.0336 0.033 0.032 0.0305 0.0287 0.024 0.011 0.004 0.0015 0.0013 0.00048 4.3e-05 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0218 0.0217 0.0215 0.021 0.017 0.012 0.0042 0.0013 0.00013 4e-06 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0227 0.0226 0.0225 0.0223 0.022 0.017 0.012 0.0038 0.0011 9.3e-05 2.1e-06 0.0999 0.0999 0.0999 0.0998 0.0997 0.0995 0.0991 0.0986 0.098 0.0973 0.0965 0.0946 0.0923 0.0897 0.0868 0.0837 0.0803 0.073 0.0614 0.0427 0.0279 0.0182 0.0132 0.0112 0.011 0.0057 0.0016 0.00099 0.00042 4.2e-05 2.7e-05 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0624 0.0623 0.0622 0.062 0.0618 0.0611 0.0594 0.0544 0.0468 0.0377 0.0284 0.0202 0.0094 0.0045 0.0035 0.00058 0.00026 0.00018 3.4e-05 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0703 0.0702 0.0702 0.07 0.0698 0.0695 0.0691 0.0679 0.065 0.057 0.046 0.0341 0.0235 0.0154 0.0071 0.0052 0.0027 0.00041 0.00036 0.00015 1.3e-05 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0515 0.0514 0.0514 0.0514 0.0513 0.0511 0.0499 0.0471 0.0425 0.0365 0.0297 0.017 0.0031 0.0022 0.0013 0.00045 4.7e-05 1.4e-06 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0532 0.0531 0.0531 0.0531 0.0531 0.0531 0.053 0.0527 0.0512 0.048 0.0428 0.0361 0.0288 0.016 0.0029 0.0023 0.0012 0.00038 3.4e-05 7.3e-07 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0404 0.0402 0.0395 0.0382 0.036 0.033 0.026 0.01 0.0032 0.00032 4.1e-05 1.3e-06 1.1e-08 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.0411 0.041 0.0408 0.0401 0.0387 0.0363 0.0331 0.025 0.0096 0.003 0.00029 3.5e-05 1e-06 6.7e-09 0.199 0.199 0.199 0.198 0.197 0.195 0.192 0.188 0.184 0.178 0.173 0.159 0.145 0.129 0.113 0.0981 0.0838 0.0596 0.0358 0.023 0.0223 0.0195 0.0137 0.00827 0.0034 0.0023 0.0006 0.00027 0.00012 1.2e-05 7.2e-06 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.13 0.129 0.128 0.127 0.124 0.12 0.116 0.11 0.0966 0.0725 0.0364 0.0168 0.0109 0.0104 0.00997 0.0062 0.0011 0.00098 0.00018 6.3e-05 4.6e-05 8.7e-06 0.148 0.148 0.148 0.148 0.148 0.147 0.147 0.147 0.147 0.147 0.146 0.144 0.141 0.137 0.131 0.123 0.115 0.095 0.0641 0.027 0.0135 0.0117 0.0113 0.0094 0.0042 0.0013 0.00082 0.00011 8.8e-05 3.7e-05 3.3e-06 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.121 0.12 0.118 0.116 0.113 0.104 0.0843 0.0479 0.0218 0.00957 0.00589 0.00541 0.0048 0.001 0.0004 0.00028 0.0001 1.1e-05 3.1e-07 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.126 0.125 0.125 0.124 0.122 0.119 0.115 0.105 0.0832 0.0449 0.0194 0.00856 0.00578 0.00555 0.0047 0.00088 0.00042 0.00026 8.4e-05 7.5e-06 1.6e-07 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.144 0.142 0.14 0.137 0.132 0.126 0.118 0.102 0.0765 0.0413 0.0196 0.00856 0.00382 0.00215 0.0017 0.0011 0.00041 4.4e-05 5.6e-06 1.9e-07 1.5e-09 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.151 0.15 0.149 0.145 0.141 0.134 0.127 0.118 0.1 0.0736 0.0386 0.0178 0.00764 0.00342 0.002 0.0016 0.001 0.00037 3.8e-05 4.6e-06 1.4e-07 9.1e-10 0.485 0.484 0.479 0.472 0.462 0.435 0.4 0.359 0.316 0.271 0.229 0.154 0.1 0.066 0.0482 0.0408 0.0388 0.0383 0.0299 0.011 0.00495 0.00462 0.00394 0.0026 0.00085 0.0005 0.00013 5.5e-05 2.5e-05 2.3e-06 1.4e-06 0.331 0.331 0.331 0.331 0.331 0.329 0.326 0.32 0.311 0.297 0.28 0.237 0.188 0.14 0.0988 0.0669 0.0445 0.0222 0.0163 0.0139 0.00701 0.00289 0.00181 0.00174 0.0013 0.00021 0.00017 3.3e-05 1.1e-05 7.9e-06 1.5e-06 0.41 0.41 0.41 0.41 0.409 0.405 0.397 0.382 0.36 0.332 0.299 0.225 0.156 0.101 0.0617 0.0377 0.0246 0.0164 0.0157 0.00934 0.00343 0.00173 0.00161 0.00148 0.00073 0.00018 0.00012 1.5e-05 1.2e-05 5.1e-06 4.5e-07 1.87 1.81 1.63 1.37 1.07 0.558 0.242 0.103 0.0593 0.0517 0.0513 0.0437 0.0292 0.0167 0.00884 0.00488 0.00325 0.0027 0.00238 0.000921 0.000342 0.000298 0.000263 0.000177 5.7e-05 3.2e-05 8.6e-06 3.5e-06 1.6e-06 1.5e-07 9.1e-08 diff --git a/src/endf/datafiles/density_effect_sternheimer1982.txt b/src/endf/datafiles/density_effect_sternheimer1982.txt new file mode 100644 index 0000000..45648ed --- /dev/null +++ b/src/endf/datafiles/density_effect_sternheimer1982.txt @@ -0,0 +1,110 @@ +# Mean excitation energy I, subshell occupancies and subshell +# ionisation energies in eV. Z = 1 to 100. +# +# NIST ESTAR mean excitation energies, and Sternheimer, Berger and +# Seltzer, At. Data Nucl. Data Tables 30 (1984) 261. Vendored from +# density_effect.h5: ESTAR publishes through a web form, so there +# is no archive to fetch and verify. +# +# Generated by tools/make_photon_aux.py. +DENSITY +Z 1 1 19.2 1.0 13.6 +Z 2 1 41.8 2.0 24.59 +Z 3 2 40.0 2.0 -1.0 58.0 5.392 +Z 4 2 63.7 2.0 -2.0 115.0 9.322 +Z 5 2 76.0 2.0 -3.0 192.0 11.386 +Z 6 3 81.0 2.0 2.0 -2.0 288.0 16.59 11.26 +Z 7 3 82.0 2.0 2.0 3.0 403.0 20.33 14.53 +Z 8 3 95.0 2.0 2.0 4.0 538.0 28.48 13.62 +Z 9 3 115.0 2.0 2.0 5.0 694.0 37.85 17.42 +Z 10 4 137.0 2.0 2.0 2.0 4.0 870.1 48.47 21.66 21.56 +Z 11 5 149.0 2.0 2.0 2.0 4.0 -1.0 1075.0 66.0 34.0 34.0 5.139 +Z 12 5 156.0 2.0 2.0 2.0 4.0 -2.0 1308.0 92.0 54.0 54.0 7.646 +Z 13 5 166.0 2.0 2.0 2.0 4.0 -3.0 1564.0 121.0 77.0 77.0 9.075 +Z 14 6 173.0 2.0 2.0 2.0 4.0 2.0 -2.0 1844.0 154.0 104.0 104.0 13.46 8.151 +Z 15 6 173.0 2.0 2.0 2.0 4.0 2.0 -3.0 2148.0 191.0 135.0 134.0 16.15 10.49 +Z 16 6 180.0 2.0 2.0 2.0 4.0 2.0 -4.0 2476.0 232.0 170.0 168.0 20.2 10.36 +Z 17 6 174.0 2.0 2.0 2.0 4.0 2.0 5.0 2829.0 277.0 208.0 206.0 24.54 12.97 +Z 18 7 188.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 3206.3 326.5 250.6 248.5 29.24 15.94 15.76 +Z 19 8 190.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 -1.0 3610.0 381.0 299.0 296.0 37.0 19.0 18.7 4.341 +Z 20 8 191.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 -2.0 4041.0 441.0 353.0 349.0 46.0 28.0 28.0 6.113 +Z 21 8 216.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 -3.0 4494.0 503.0 408.0 403.0 55.0 33.0 33.0 7.027 +Z 22 9 233.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 2.0 -2.0 4970.0 567.0 465.0 459.0 64.0 39.0 38.0 8.0 6.82 +Z 23 9 245.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 3.0 -2.0 5470.0 633.0 525.0 518.0 72.0 44.0 43.0 8.0 6.74 +Z 24 9 257.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 -2.0 5995.0 702.0 589.0 580.0 80.0 49.0 48.0 8.25 7.508 +Z 25 9 272.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 5.0 -2.0 6544.0 755.0 656.0 645.0 89.0 55.0 53.0 9.0 7.434 +Z 26 9 286.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 6.0 -2.0 7117.0 851.0 726.0 713.0 98.0 61.0 59.0 9.0 7.87 +Z 27 9 297.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 7.0 -2.0 7715.0 931.0 800.0 785.0 107.0 68.0 66.0 9.0 7.864 +Z 28 10 311.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 4.0 -2.0 8338.0 1015.0 877.0 860.0 117.0 75.0 73.0 10.0 10.0 7.635 +Z 29 10 322.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 -1.0 8986.0 1103.0 958.0 938.0 127.0 82.0 80.0 11.0 10.4 7.726 +Z 30 10 330.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 -2.0 9663.0 1198.0 1047.0 1024.0 141.0 94.0 91.0 12.0 11.2 9.394 +Z 31 10 334.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 -3.0 10371.0 1302.0 1146.0 1119.0 162.0 111.0 107.0 21.0 20.0 9.333 +Z 32 11 350.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 -2.0 11107.0 1413.0 1251.0 1220.0 184.0 130.0 125.0 33.0 32.0 14.3 7.9 +Z 33 11 347.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 -3.0 11871.0 1531.0 1362.0 1327.0 208.0 151.0 145.0 46.0 45.0 17.0 9.81 +Z 34 11 348.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 -4.0 12662.0 1656.0 1479.0 1439.0 234.0 173.0 166.0 61.0 60.0 20.15 9.75 +Z 35 11 343.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 5.0 13481.0 1787.0 1602.0 1556.0 262.0 197.0 189.0 77.0 76.0 23.8 11.85 +Z 36 12 352.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 14327.0 1924.6 1730.9 1678.4 292.8 222.2 214.4 95.0 93.8 27.51 14.65 14.0 +Z 37 13 363.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -1.0 15203.0 2068.0 1867.0 1807.0 325.0 251.0 242.0 116.0 114.0 32.0 16.0 15.3 4.18 +Z 38 13 366.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -2.0 16108.0 2219.0 2010.0 1943.0 361.0 283.0 273.0 139.0 137.0 40.0 23.0 22.0 5.69 +Z 39 13 379.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -3.0 17041.0 2375.0 2158.0 2083.0 397.0 315.0 304.0 163.0 161.0 48.0 30.0 29.0 6.45 +Z 40 13 393.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -4.0 18002.0 2536.0 2311.0 2227.0 434.0 348.0 335.0 187.0 185.0 56.0 35.0 33.0 7.725 +Z 41 14 417.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 2.0 -3.0 18990.0 2702.0 2469.0 2375.0 472.0 382.0 367.0 212.0 209.0 62.0 40.0 38.0 7.17 7.073 +Z 42 13 424.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -6.0 20006.0 2872.0 2632.0 2527.0 511.0 416.0 399.0 237.0 234.0 68.0 45.0 42.0 8.317 +Z 43 14 428.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 3.0 -4.0 21050.0 3048.0 2800.0 2683.0 551.0 451.0 432.0 263.0 259.0 74.0 49.0 45.0 8.6 8.27 +Z 44 14 441.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 5.0 -3.0 22123.0 3230.0 2973.0 2844.0 592.0 488.0 466.0 290.0 286.0 81.0 53.0 49.0 8.5 8.123 +Z 45 14 449.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 6.0 -3.0 23225.0 3418.0 3152.0 3010.0 634.0 526.0 501.0 318.0 313.0 87.0 58.0 53.0 9.56 8.86 +Z 46 14 470.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 8.0 -2.0 24357.0 3611.0 3337.0 3180.0 677.0 565.0 537.0 347.0 342.0 93.0 63.0 57.0 8.56 8.34 +Z 47 15 470.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 -1.0 25520.0 3812.0 3530.0 3357.0 724.0 608.0 577.0 379.0 373.0 101.0 69.0 63.0 11.0 10.0 7.58 +Z 48 15 469.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 -2.0 26715.0 4022.0 3732.0 3542.0 775.0 655.0 621.0 415.0 408.0 112.0 78.0 71.0 14.0 13.0 8.99 +Z 49 15 488.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 -3.0 27944.0 4242.0 3943.0 3735.0 830.0 707.0 669.0 455.0 447.0 126.0 90.0 82.0 21.0 20.0 8.597 +Z 50 16 488.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 -2.0 29204.0 4469.0 4160.0 3933.0 888.0 761.0 719.0 497.0 489.0 141.0 102.0 93.0 29.0 28.0 12.0 7.34 +Z 51 16 487.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 -3.0 30496.0 4703.0 4385.0 4137.0 949.0 817.0 771.0 542.0 533.0 157.0 114.0 104.0 38.0 37.0 15.0 8.64 +Z 52 16 485.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 -4.0 31820.0 4945.0 4618.0 4347.0 1012.0 876.0 825.0 589.0 578.0 174.0 127.0 117.0 48.0 46.0 17.84 9.01 +Z 53 16 491.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 5.0 33176.0 5195.0 4858.0 4563.0 1078.0 937.0 881.0 638.0 626.0 193.0 141.0 131.0 58.0 56.0 20.61 10.45 +Z 54 17 482.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 34565.0 5453.2 5107.2 4787.3 1148.7 1002.1 940.6 689.0 676.4 213.2 157.0 145.5 69.5 67.5 23.39 13.43 12.13 +Z 55 18 488.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -1.0 35987.0 5717.0 5362.0 5014.0 1220.0 1068.0 1000.0 742.0 728.0 233.0 174.0 164.0 81.0 79.0 25.0 14.0 12.3 3.89 +Z 56 18 491.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -2.0 37442.0 5991.0 5626.0 5249.0 1293.0 1138.0 1063.0 797.0 782.0 254.0 193.0 181.0 94.0 92.0 31.0 18.0 16.0 5.21 +Z 57 18 501.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -3.0 38928.0 6269.0 5894.0 5486.0 1365.0 1207.0 1124.0 851.0 834.0 273.0 210.0 196.0 105.0 103.0 36.0 22.0 19.0 5.637 +Z 58 19 523.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 1.0 2.0 2.0 4.0 -3.0 40446.0 6552.0 6167.0 5726.0 1437.0 1275.0 1184.0 903.0 885.0 291.0 225.0 209.0 114.0 111.0 6.0 39.0 25.0 22.0 5.767 +Z 59 19 535.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 2.0 4.0 -3.0 41995.0 6839.0 6444.0 5968.0 1509.0 1342.0 1244.0 954.0 934.0 307.0 238.0 220.0 121.0 117.0 6.0 41.0 27.0 24.0 5.613 +Z 60 19 546.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 3.0 2.0 2.0 4.0 -3.0 43575.0 7132.0 6727.0 6213.0 1580.0 1408.0 1303.0 1005.0 983.0 321.0 250.0 230.0 126.0 122.0 6.0 42.0 28.0 25.0 5.66 +Z 61 19 560.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 4.0 2.0 2.0 4.0 -3.0 45188.0 7432.0 7017.0 6464.0 1653.0 1476.0 1362.0 1057.0 1032.0 335.0 261.0 240.0 131.0 127.0 6.0 43.0 28.0 25.0 5.7 +Z 62 19 574.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 2.0 2.0 4.0 -2.0 46837.0 7740.0 7315.0 6720.0 1728.0 1546.0 1422.0 1110.0 1083.0 349.0 273.0 251.0 137.0 132.0 6.0 44.0 29.0 25.0 5.63 +Z 63 19 580.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 7.0 2.0 2.0 4.0 -2.0 48522.0 8056.0 7621.0 6981.0 1805.0 1618.0 1484.0 1164.0 1135.0 364.0 286.0 262.0 143.0 137.0 6.0 45.0 30.0 26.0 5.68 +Z 64 19 591.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 7.0 2.0 2.0 4.0 -3.0 50243.0 8380.0 7935.0 7247.0 1884.0 1692.0 1547.0 1220.0 1189.0 380.0 300.0 273.0 150.0 143.0 6.0 46.0 31.0 27.0 6.107 +Z 65 19 614.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 8.0 2.0 2.0 4.0 -3.0 51999.0 8711.0 8256.0 7518.0 1965.0 1768.0 1612.0 1277.0 1243.0 398.0 315.0 285.0 157.0 150.0 6.0 48.0 32.0 28.0 5.9 +Z 66 19 628.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 9.0 2.0 2.0 4.0 -3.0 53792.0 9050.0 8585.0 7794.0 2048.0 1846.0 1678.0 1335.0 1298.0 416.0 331.0 297.0 164.0 157.0 6.0 50.0 33.0 28.0 5.953 +Z 67 19 650.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 10.0 2.0 2.0 4.0 -3.0 55622.0 9398.0 8922.0 8075.0 2133.0 1926.0 1746.0 1395.0 1354.0 434.0 348.0 310.0 172.0 164.0 6.0 52.0 34.0 29.0 6.013 +Z 68 19 658.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 11.0 2.0 2.0 4.0 -3.0 57489.0 9754.0 9267.0 8361.0 2220.0 2008.0 1815.0 1456.0 1412.0 452.0 365.0 323.0 181.0 172.0 6.0 54.0 35.0 30.0 6.067 +Z 69 19 674.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 12.0 2.0 2.0 4.0 -3.0 59393.0 10118.0 9620.0 8651.0 2309.0 2092.0 1885.0 1518.0 1471.0 471.0 382.0 336.0 190.0 181.0 7.0 56.0 36.0 30.0 6.453 +Z 70 20 684.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 -2.0 61335.0 10490.0 9981.0 8946.0 2401.0 2178.0 1956.0 1580.0 1531.0 490.0 399.0 349.0 200.0 190.0 8.0 7.0 58.0 37.0 31.0 6.25 +Z 71 20 694.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 -3.0 63320.0 10876.0 10355.0 9250.0 2499.0 2270.0 2032.0 1647.0 1596.0 514.0 420.0 366.0 213.0 202.0 13.0 12.0 62.0 39.0 32.0 6.867 +Z 72 20 705.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 -4.0 65350.0 11275.0 10742.0 9564.0 2604.0 2369.0 2113.0 1720.0 1665.0 542.0 444.0 386.0 229.0 217.0 21.0 20.0 68.0 43.0 35.0 7.25 +Z 73 20 718.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 -5.0 67419.0 11684.0 11139.0 9884.0 2712.0 2472.0 2197.0 1796.0 1737.0 570.0 469.0 407.0 245.0 232.0 30.0 28.0 74.0 47.0 38.0 8.14 +Z 74 20 727.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 -6.0 69529.0 12103.0 11546.0 10209.0 2823.0 2577.0 2283.0 1874.0 1811.0 599.0 495.0 428.0 261.0 248.0 38.0 36.0 80.0 51.0 41.0 8.667 +Z 75 21 736.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 3.0 -4.0 71681.0 12532.0 11963.0 10540.0 2937.0 2686.0 2371.0 1953.0 1887.0 629.0 522.0 450.0 278.0 264.0 47.0 45.0 86.0 56.0 45.0 9.6 8.75 +Z 76 21 746.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 5.0 -3.0 73876.0 12972.0 12390.0 10876.0 3054.0 2797.0 2461.0 2035.0 1964.0 660.0 551.0 473.0 295.0 280.0 56.0 54.0 92.0 61.0 49.0 9.6 8.867 +Z 77 21 757.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 6.0 -3.0 76115.0 13422.0 12828.0 11219.0 3175.0 2912.0 2554.0 2119.0 2044.0 693.0 581.0 497.0 314.0 298.0 67.0 64.0 99.0 66.0 53.0 9.6 9.267 +Z 78 21 790.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 8.0 -2.0 78399.0 13883.0 13277.0 11567.0 3300.0 3030.0 2649.0 2206.0 2126.0 727.0 612.0 522.0 335.0 318.0 78.0 75.0 106.0 71.0 57.0 9.6 9.3 +Z 79 22 790.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 -1.0 80729.0 14356.0 13738.0 11923.0 3430.0 3153.0 2748.0 2295.0 2210.0 764.0 645.0 548.0 357.0 339.0 91.0 87.0 114.0 76.0 61.0 12.5 11.1 9.23 +Z 80 22 800.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 7.0 -1.0 83108.0 14845.0 14214.0 12288.0 3567.0 3283.0 2852.0 2390.0 2300.0 806.0 683.0 579.0 382.0 363.0 107.0 103.0 125.0 85.0 68.0 14.0 11.771 10.4 +Z 81 23 810.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 -1.0 85536.0 15350.0 14704.0 12662.0 3710.0 3420.0 2961.0 2490.0 2394.0 852.0 726.0 615.0 411.0 391.0 127.0 123.0 139.0 98.0 79.0 21.0 19.0 8.0 6.11 +Z 82 23 823.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 -2.0 88011.0 15867.0 15206.0 13041.0 3857.0 3560.0 3072.0 2592.0 2490.0 899.0 769.0 651.0 441.0 419.0 148.0 144.0 153.0 111.0 90.0 27.0 25.0 10.0 7.42 +Z 83 23 823.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 -3.0 90534.0 16396.0 15719.0 13426.0 4007.0 3704.0 3185.0 2696.0 2588.0 946.0 813.0 687.0 472.0 448.0 170.0 165.0 167.0 125.0 101.0 34.0 32.0 12.0 7.29 +Z 84 23 830.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 4.0 -2.0 93106.0 16937.0 16244.0 13816.0 4161.0 3852.0 3301.0 2802.0 2687.0 994.0 858.0 724.0 503.0 478.0 193.0 187.0 181.0 139.0 112.0 41.0 38.0 11.715 8.43 +Z 85 24 825.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 3.0 95729.0 17490.0 16782.0 14212.0 4320.0 4005.0 3420.0 2910.0 2788.0 1044.0 904.0 761.0 535.0 508.0 217.0 211.0 196.0 153.0 123.0 48.0 44.0 19.0 11.0 9.3 +Z 86 24 794.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 98404.0 18055.0 17334.0 14615.0 4483.0 4162.0 3452.0 3019.0 2890.0 1096.0 951.0 798.0 567.0 538.0 242.0 235.0 212.0 167.0 134.0 55.0 51.0 24.0 14.0 10.7 +Z 87 25 827.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -1.0 101134.0 18637.0 17903.0 15028.0 4652.0 4324.0 3666.0 3134.0 2998.0 1153.0 1003.0 839.0 603.0 572.0 268.0 260.0 231.0 183.0 147.0 65.0 61.0 33.0 19.0 14.0 4.0 +Z 88 25 826.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -2.0 103919.0 19237.0 18488.0 15449.0 4827.0 4491.0 3793.0 3254.0 3111.0 1214.0 1060.0 884.0 642.0 609.0 296.0 287.0 253.0 201.0 161.0 77.0 73.0 40.0 25.0 19.0 5.28 +Z 89 25 841.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -3.0 106759.0 19850.0 19086.0 15874.0 5005.0 4661.0 3921.0 3374.0 3223.0 1274.0 1116.0 928.0 680.0 645.0 322.0 313.0 274.0 218.0 174.0 88.0 83.0 45.0 29.0 22.0 6.1 +Z 90 25 847.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 -4.0 109654.0 20475.0 19696.0 16303.0 5185.0 4833.0 4049.0 3494.0 3335.0 1333.0 1171.0 970.0 717.0 679.0 347.0 338.0 293.0 233.0 185.0 97.0 91.0 50.0 33.0 25.0 6.0 +Z 91 26 878.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 1.0 2.0 2.0 4.0 -4.0 112604.0 21112.0 20318.0 16735.0 5368.0 5008.0 4178.0 3613.0 3446.0 1390.0 1225.0 1011.0 752.0 712.0 372.0 362.0 312.0 248.0 195.0 104.0 97.0 6.0 50.0 32.0 24.0 6.0 +Z 92 26 890.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 3.0 2.0 2.0 4.0 -3.0 115611.0 21762.0 20953.0 17171.0 5553.0 5187.0 4308.0 3733.0 3557.0 1446.0 1278.0 1050.0 785.0 743.0 396.0 386.0 329.0 261.0 203.0 110.0 101.0 6.0 52.0 34.0 24.0 6.033 +Z 93 26 902.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 4.0 2.0 2.0 4.0 -3.0 118676.0 22427.0 21602.0 17612.0 5742.0 5370.0 4440.0 3854.0 3669.0 1504.0 1331.0 1089.0 819.0 774.0 421.0 410.0 346.0 274.0 211.0 116.0 106.0 6.0 54.0 35.0 25.0 6.0 +Z 94 26 921.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 5.0 2.0 2.0 4.0 -3.0 121800.0 23109.0 22267.0 18059.0 5936.0 5557.0 4574.0 3977.0 3783.0 1563.0 1384.0 1128.0 853.0 805.0 446.0 434.0 356.0 287.0 219.0 122.0 111.0 6.0 53.0 34.0 23.0 6.0 +Z 95 26 934.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 6.0 2.0 2.0 4.0 -3.0 124984.0 23803.0 22949.0 18512.0 6135.0 5748.0 4710.0 4102.0 3898.0 1623.0 1439.0 1167.0 887.0 836.0 467.0 452.0 355.0 301.0 220.0 123.0 112.0 6.0 54.0 44.0 36.0 6.0 +Z 96 26 939.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 7.0 2.0 2.0 4.0 -3.0 128261.0 24523.0 23654.0 18974.0 6313.0 5946.0 4828.0 4236.0 4014.0 1664.0 1493.0 1194.0 919.0 864.0 494.0 479.0 384.0 314.0 239.0 126.0 119.0 11.0 60.0 39.0 27.0 5.667 +Z 97 26 952.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 8.0 2.0 2.0 4.0 -3.0 131586.0 25260.0 24372.0 19440.0 6523.0 6149.0 4968.0 4366.0 4133.0 1729.0 1554.0 1236.0 955.0 898.0 520.0 504.0 401.0 329.0 248.0 142.0 124.0 12.0 63.0 41.0 27.0 5.333 +Z 98 26 966.0 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 9.0 2.0 2.0 4.0 -3.0 134967.0 26008.0 25103.0 19907.0 6733.0 6352.0 5103.0 4492.0 4247.0 1789.0 1610.0 1273.0 987.0 925.0 546.0 529.0 412.0 338.0 251.0 142.0 129.0 9.0 61.0 39.0 25.0 7.0 +Z 99 26 65.1 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 10.0 2.0 2.0 4.0 -3.0 138440.0 26781.0 25859.0 20383.0 6954.0 6566.0 5247.0 4225.0 4369.0 1857.0 1674.0 1316.0 1024.0 959.0 573.0 554.0 429.0 353.0 260.0 148.0 135.0 9.0 63.0 40.0 25.0 7.0 +Z 100 26 64.2 2.0 2.0 2.0 4.0 2.0 2.0 4.0 4.0 6.0 2.0 2.0 4.0 4.0 6.0 6.0 8.0 2.0 2.0 4.0 4.0 6.0 11.0 2.0 2.0 4.0 -3.0 141962.0 27581.0 26642.0 20872.0 7187.0 6791.0 5399.0 4767.0 4498.0 1933.0 1746.0 1366.0 1068.0 1000.0 606.0 587.0 453.0 375.0 275.0 160.0 145.0 15.0 69.0 45.0 29.0 6.0 diff --git a/src/endf/decay.py b/src/endf/decay.py index 5cf4b41..356e2ee 100644 --- a/src/endf/decay.py +++ b/src/endf/decay.py @@ -440,11 +440,26 @@ def __init__(self, material_or_filename): @property def decay_constant(self): + # An evaluation may flag a nuclide unstable (NST=0) and still give a + # half-life of zero, which means "not evaluated" rather than "decays + # instantly" — ENDF/B-VIII.0's Xe136 is one. Dividing by it raised + # ZeroDivisionError from inside the expression below. None says the + # same thing Chain.from_endf already assumes for these nuclides, which + # skips their modes on `half_life.nominal_value != 0.0`. See issue #23. + if self.nominal_half_life == 0.0: + return None if hasattr(self.half_life, 'n'): return log(2.) / self.half_life mu, sigma = self.half_life return ufloat(log(2.) / mu, log(2.) / mu**2 * sigma) + @property + def nominal_half_life(self): + """The half-life without its uncertainty, however it is stored.""" + if hasattr(self.half_life, 'n'): + return self.half_life.n + return self.half_life[0] + @property def decay_energy(self): energy = self.average_energies @@ -472,6 +487,10 @@ def sources(self): """ sources = {} name = self.nuclide['name'] + # Every source rate scales with the decay constant, so a nuclide whose + # half-life was never evaluated has no rates to give. See issue #23. + if self.decay_constant is None: + return sources decay_constant = self.decay_constant.n for particle, spectra in self.spectra.items(): diff --git a/src/endf/fileutils.py b/src/endf/fileutils.py index 3e02c75..67172cb 100644 --- a/src/endf/fileutils.py +++ b/src/endf/fileutils.py @@ -1,8 +1,42 @@ # SPDX-FileCopyrightText: 2023-2025 Paul Romano # SPDX-License-Identifier: MIT +import io +import lzma import os from typing import Union # Type for arguments that accept file paths PathLike = Union[str, bytes, os.PathLike] + +#: Suffix marking a file compressed with :mod:`lzma`. +XZ_SUFFIX = '.xz' + + +def is_compressed(filename: PathLike) -> bool: + """Whether a path names an xz-compressed file.""" + return str(filename).endswith(XZ_SUFFIX) + + +def open_text(filename: PathLike, encoding=None): + """Open a possibly-compressed ENDF or ACE file for reading as text. + + Evaluations are large and highly repetitive, so keeping them compressed + costs a little CPU and saves most of the disk. A path ending in ``.xz`` is + decompressed on the fly; anything else is opened as it always was. + """ + if is_compressed(filename): + # Decompressed whole rather than streamed: the readers seek back and + # forth to find material boundaries, and seeking inside a compressed + # stream restarts the decoder. An evaluation is a couple of megabytes. + with lzma.open(str(filename), 'rt', encoding=encoding) as fh: + return io.StringIO(fh.read()) + return open(str(filename), 'r', encoding=encoding) + + +def open_binary(filename: PathLike): + """The same, for a file read as bytes.""" + if is_compressed(filename): + with lzma.open(str(filename), 'rb') as fh: + return io.BytesIO(fh.read()) + return open(str(filename), 'rb') diff --git a/src/endf/material.py b/src/endf/material.py index 029db05..5194e46 100644 --- a/src/endf/material.py +++ b/src/endf/material.py @@ -14,7 +14,7 @@ from warnings import warn import endf -from .fileutils import PathLike +from .fileutils import PathLike, open_text from .mf1 import parse_mf1_mt451, parse_mf1_mt452, parse_mf1_mt455, \ parse_mf1_mt458, parse_mf1_mt460 from .mf2 import parse_mf2 @@ -114,7 +114,7 @@ class Material: def __init__(self, filename_or_obj: Union[PathLike, TextIO], encoding: Optional[str] = None): if isinstance(filename_or_obj, PathLike.__args__): - fh = open(str(filename_or_obj), 'r', encoding=encoding) + fh = open_text(filename_or_obj, encoding) need_to_close = True else: fh = filename_or_obj @@ -280,7 +280,7 @@ def get_materials(filename: PathLike, encoding: Optional[str] = None) -> List[Ma """ materials = [] - with open(str(filename), 'r', encoding=encoding) as fh: + with open_text(filename, encoding) as fh: while True: pos = fh.tell() line = fh.readline() diff --git a/src/endf/mf2.py b/src/endf/mf2.py index 042519e..eb15426 100644 --- a/src/endf/mf2.py +++ b/src/endf/mf2.py @@ -48,8 +48,12 @@ def parse_mf2(file_obj: TextIO) -> dict: elif LRU in (0, 1): # resolved resonance region rrange.update(_FORMALISMS[LRF].dict_from_endf(file_obj, NRO)) - elif LRF == 2: - # unresolved resonance region + elif LRU == 2: + # Unresolved resonance region. LRU says resolved or unresolved; + # LRF selects the formalism within the range. Testing LRF here + # skipped Cases A and B entirely (LRU=2 with LRF=1) and left + # their records on the stream, so the next range was read from + # the middle of this one. See issue #15. rrange.update(Unresolved.dict_from_endf(file_obj, LFW, LRF, NRO)) iso['ranges'].append(rrange) diff --git a/src/endf/mf33.py b/src/endf/mf33.py index 066e5d9..5ef4e06 100644 --- a/src/endf/mf33.py +++ b/src/endf/mf33.py @@ -19,7 +19,9 @@ def parse_mf33_subsection(file_obj) -> dict: subsub = {'LTY': LTY, 'E1': E1, 'E2': E2, 'NCI': NCI} subsub['CI'] = values[::2] subsub['XMTI'] = values[1::2] - subsection['nc_subsections'].append(subsub) + # No append here: the one below runs for both branches. Appending + # in this one too put every LTY=0 subsection in the list twice. + # See issue #12. else: (E1, E2, MATS, MTS, _, NEI), values = get_list_record(file_obj) subsub = {'LTY': LTY, 'E1': E1, 'E2': E2, 'MATS': MATS, diff --git a/src/endf/mf34.py b/src/endf/mf34.py index cf30ed5..c30e3b4 100644 --- a/src/endf/mf34.py +++ b/src/endf/mf34.py @@ -56,10 +56,17 @@ def parse_mf34(file_obj: TextIO, MT: int) -> dict: for m in range(NI): (_, _, LS, LB, NT, NE), values = get_list_record(file_obj) subsub['LS'][m] = LS - subsub['LB'][m] = LS + # LB, not LS. LS is the symmetry flag and LB the covariance + # matrix type; they are not interchangeable. See issue #18. + subsub['LB'][m] = LB subsub['NT'][m] = NT subsub['NE'][m] = NE subsub['Data'].append(values) subsection['subsubsections'].append(subsub) + # Every record above was read off the stream and then thrown away, + # because nothing appended the subsection to the list built for it. + # See issue #18. + data['subsections'].append(subsection) + return data diff --git a/src/endf/mf5.py b/src/endf/mf5.py index d4e4ee3..9116886 100644 --- a/src/endf/mf5.py +++ b/src/endf/mf5.py @@ -201,6 +201,19 @@ def __init__(self, theta, g, u): self.g = g self.u = u + @classmethod + def from_ace(cls, ace, idx=0): + """Not implemented: ACE law 5 is not read. + + `AngleEnergy.from_ace` dispatches here for law 5, so without this the + call fails with `AttributeError` and reads like an internal error + rather than an unsupported format. OpenMC carries the same stub. See + issue #19. + """ + raise NotImplementedError( + "ACE law 5 (general evaporation) is not implemented" + ) + @staticmethod def dict_from_endf(file_obj: TextIO, params: list) -> dict: """Parse general evaporation spectrum (MF=5) diff --git a/tests/Li6.ace.xz b/tests/Li6.ace.xz new file mode 100644 index 0000000..f349987 Binary files /dev/null and b/tests/Li6.ace.xz differ diff --git a/tests/atom-001_H_000.endf b/tests/atom-001_H_000.endf deleted file mode 100644 index 5ac093d..0000000 --- a/tests/atom-001_H_000.endf +++ /dev/null @@ -1,83 +0,0 @@ - $Rev:: $ $Date:: $ 1 0 0 - 1000.00000 .999241400 -1 0 0 0 100 1451 - 0.0 0.0 0 0 0 6 100 1451 - 0.0 1.0000D+11 0 0 6 8 100 1451 - 0.0 0.0 0 0 67 2 100 1451 - 1-H - 0 NDS,IAEA Eval-Dec17 D.E.Cullen 100 1451 - NDS-IAEA-224 DIST-FEB18 100 1451 -----ENDF/B-VIII.0 MATERIAL 100 100 1451 ------ATOMIC RELAXATION DATA 100 1451 -------ENDF-6 FORMAT 100 1451 -================================================================== 100 1451 -The Livermore Evaluated Atomic Data Library (EADL) in the 100 1451 -ENDF-6 Format. Translated from the Livermore ENDL format 100 1451 -to the ENDF-6 Format. 100 1451 -================================================================== 100 1451 - Contents 100 1451 -================================================================== 100 1451 - MF/MT Description 100 1451 -================================================================== 100 1451 - 28/533 Atomic Relaxation Data for Electrons and Photons 100 1451 -================================================================== 100 1451 - Warning 100 1451 -================================================================== 100 1451 - MF/MT combinations used to define ALL electron interaction data 100 1451 - are newly defined MF/MT numbers for ENDF/B-VI that did not exist 100 1451 - in earlier versions of ENDF/B. 100 1451 -================================================================== 100 1451 - Definition of Data 100 1451 -================================================================== 100 1451 - Atomic Relaxation Data for Electrons and Photons 100 1451 -================================================================== 100 1451 -1) An atom can be ionized by a photon or an electron interaction. 100 1451 -2) The atomic relaxation data included here describes how a 100 1451 - singly ionized atom returns to neutrality, by emitting photons 100 1451 - (x-rays) and/or electrons (Auger, Coster-Kronig). 100 1451 -3) Data is given to define the transition probabilities between 100 1451 - subshells for radiative (x-ray emission) and non-radiative 100 1451 - (Auger, Coster-Kronig) transitions. 100 1451 -4) The complete spectrum of emitted photons and electrons can be 100 1451 - calculated using the data included here, e.g., see ref. 2, 100 1451 - below, for am example of a computer code that analytically 100 1451 - calculates these spectra. 100 1451 -================================================================== 100 1451 - References 100 1451 -================================================================== 100 1451 -1) S.T. Perkins, D.E. Cullen, etal., "Tables and Graphs of Atomic 100 1451 - Subshell and Relaxation Data Derived from the LLNL Evaluated 100 1451 - Atomic Data Library (EADL), Z = 1 - 100", UCRL-50400, Vol. 30, 100 1451 - Lawrence Livermore National Laboratory (1991). 100 1451 -2) D.E. Cullen "Program RELAX: A Code Designed to Calculate X-Ray 100 1451 - and Electron Emission Spectra as Singly Charged Atoms Relax 100 1451 - Back to Neutrality", UCRL-ID-110438, Lawrence Livermore 100 1451 - National Laboratory (1992). 100 1451 -3) D.E. Cullen "A Survey of Atomic Binding Energies for use 100 1451 - in EPICS2017" ,IAEA-NDS-224, (2017), Nuclear Data Section, 100 1451 - IAEA, Vienna, Austria 100 1451 - 100 1451 - These are the primary references to the contents of this library 100 1451 - and they contain a complete list of references to the sources 100 1451 - of data used in this library, methods of evaluation, accuracy 100 1451 - of the data, etc. 100 1451 -================================================================== 100 1451 - History 100 1451 -================================================================== 100 1451 - (1) November, 1991 - Initial release in the ENDL format. 100 1451 - (2) November, 2001 - Initial release in the ENDF-6 format. 100 1451 - (3) September,2014 - Insure Standard C, C++, FORTRAN Format 100 1451 - (4) September,2014 - Updated based on recently publshed data 100 1451 - (5) September,2017 - New Binding Energies\Same Probabilities 100 1451 - (6) April, 2018 - Corrected Transition Energies 100 1451 -================================================================== 100 1451 - **************** Program DICTIN (VERSION 2017-1) **************** 100 1451 - 1 451 73 0 100 1451 - 28 533 3 0 100 1451 - 100 1 0 - 100 0 0 - 1000.00000 .999241400 0 0 1 0 10028533 - 1.00000000 0.0 0 0 6 0 10028533 - 13.6000000 1.00000000 0.0 0.0 0.0 0.0 10028533 - 10028 0 - 100 0 0 - 0 0 0 - -1 0 0 diff --git a/tests/atom-001_H_000.endf.xz b/tests/atom-001_H_000.endf.xz new file mode 100644 index 0000000..cfc9bcc Binary files /dev/null and b/tests/atom-001_H_000.endf.xz differ diff --git a/tests/dec-048_Cd_116.endf.xz b/tests/dec-048_Cd_116.endf.xz new file mode 100644 index 0000000..77e2f8b Binary files /dev/null and b/tests/dec-048_Cd_116.endf.xz differ diff --git a/tests/dec-049_In_115.endf.xz b/tests/dec-049_In_115.endf.xz new file mode 100644 index 0000000..5105f88 Binary files /dev/null and b/tests/dec-049_In_115.endf.xz differ diff --git a/tests/dec-049_In_116.endf.xz b/tests/dec-049_In_116.endf.xz new file mode 100644 index 0000000..4a3fdb9 Binary files /dev/null and b/tests/dec-049_In_116.endf.xz differ diff --git a/tests/dec-049_In_116m1.endf.xz b/tests/dec-049_In_116m1.endf.xz new file mode 100644 index 0000000..0579c3d Binary files /dev/null and b/tests/dec-049_In_116m1.endf.xz differ diff --git a/tests/dec-049_In_116m2.endf.xz b/tests/dec-049_In_116m2.endf.xz new file mode 100644 index 0000000..d51250d Binary files /dev/null and b/tests/dec-049_In_116m2.endf.xz differ diff --git a/tests/dec-050_Sn_115.endf.xz b/tests/dec-050_Sn_115.endf.xz new file mode 100644 index 0000000..0e0e74e Binary files /dev/null and b/tests/dec-050_Sn_115.endf.xz differ diff --git a/tests/dec-050_Sn_116.endf.xz b/tests/dec-050_Sn_116.endf.xz new file mode 100644 index 0000000..b49140c Binary files /dev/null and b/tests/dec-050_Sn_116.endf.xz differ diff --git a/tests/dec-054_Xe_136.endf.xz b/tests/dec-054_Xe_136.endf.xz new file mode 100644 index 0000000..4b8277b Binary files /dev/null and b/tests/dec-054_Xe_136.endf.xz differ diff --git a/tests/dec-054_Xe_137.endf.xz b/tests/dec-054_Xe_137.endf.xz new file mode 100644 index 0000000..ef9ce5b Binary files /dev/null and b/tests/dec-054_Xe_137.endf.xz differ diff --git a/tests/dec-055_Cs_137.endf.xz b/tests/dec-055_Cs_137.endf.xz new file mode 100644 index 0000000..693195b Binary files /dev/null and b/tests/dec-055_Cs_137.endf.xz differ diff --git a/tests/e-001_H_000.endf.xz b/tests/e-001_H_000.endf.xz new file mode 100644 index 0000000..074aa3d Binary files /dev/null and b/tests/e-001_H_000.endf.xz differ diff --git a/tests/n-003_Li_006_trimmed.endf.xz b/tests/n-003_Li_006_trimmed.endf.xz new file mode 100644 index 0000000..3c7dab5 Binary files /dev/null and b/tests/n-003_Li_006_trimmed.endf.xz differ diff --git a/tests/n-026_Fe_056_trimmed.endf.xz b/tests/n-026_Fe_056_trimmed.endf.xz new file mode 100644 index 0000000..e722c98 Binary files /dev/null and b/tests/n-026_Fe_056_trimmed.endf.xz differ diff --git a/tests/n-049_In-115_trimmed.endf b/tests/n-049_In-115_trimmed.endf deleted file mode 100644 index 62dc078..0000000 --- a/tests/n-049_In-115_trimmed.endf +++ /dev/null @@ -1,565 +0,0 @@ -Retrieved by E4-util: 2024/10/03,10:35:02 1 0 0 0 - 4.911500+4 1.139170+2 1 0 0 14931 1451 1 - 0.000000+0 0.000000+0 0 0 0 64931 1451 2 - 1.000000+0 2.000000+7 1 0 10 84931 1451 3 - 0.000000+0 0.000000+0 0 0 297 694931 1451 4 - 49-In-115 JNDC,BNL EVAL-MAR05 JNDC FPND W.G., Mughabghab 4931 1451 5 - NDS 148, 1 (2018) DIST-AUG24 REV1-NOV23 20240830 4931 1451 6 ----- ENDF/B-VIII.1 MATERIAL 4931 REVISION 1 4931 1451 7 ------ INCIDENT-NEUTRON DATA 4931 1451 8 ------- ENDF-6 4931 1451 9 - 4931 1451 10 -**************************************************************** 4931 1451 11 -Missing exit distributions imported from TENDL2019 4931 1451 12 -by I.J. Thompson (LLNL) on 2023-04-21T21:14:27 4931 1451 13 - 4931 1451 14 -Some neutron exit distributions, as noted, may be imported so all 4931 1451 15 -exit distributions have the same reference frame. 4931 1451 16 - 4931 1451 17 -Changes by program patchGNDS.py: 4931 1451 18 - H1 distribution for MT=28: n + H1 + Cd114. 4931 1451 19 - n distribution for MT=28: n + H1 + Cd114. 4931 1451 20 - per --forENDF option as needed by ENDF LCT flag. 4931 1451 21 - H2 distribution for MT=32: n + H2 + Cd113. 4931 1451 22 - n distribution for MT=32: n + H2 + Cd113. 4931 1451 23 - per --forENDF option as needed by ENDF LCT flag. 4931 1451 24 - H3 distribution for MT=33: n + H3 + Cd112. 4931 1451 25 - n distribution for MT=33: n + H3 + Cd112. 4931 1451 26 - per --forENDF option as needed by ENDF LCT flag. 4931 1451 27 - He4 distribution for MT=22: n + He4 + Ag111. 4931 1451 28 - n distribution for MT=22: n + He4 + Ag111. 4931 1451 29 - per --forENDF option as needed by ENDF LCT flag. 4931 1451 30 - H1 distribution for MT=103: H1 + Cd115 [inclusive]. 4931 1451 31 - H2 distribution for MT=104: H2 + Cd114 [inclusive]. 4931 1451 32 - H3 distribution for MT=105: H3 + Cd113 [inclusive]. 4931 1451 33 - He4 distribution for MT=107: He4 + Ag112 [inclusive]. 4931 1451 34 - photon distribution for MT=102: In116 + photon. 4931 1451 35 - 4931 1451 36 - 4931 1451 37 - -------------------------------------------------------------- 4931 1451 38 - ENDFB-VIII.0 file revised by R. Q. Wright, November 1, 2021 4931 1451 39 - Total, elastic, capture changed for energy range 2-300 keV. 4931 1451 40 - Revised capture is in good agreement with Kononov 1977 data. 4931 1451 41 - Estimated MACS(30 keV)= 750 mb; KADONIS value = 706 +/- 70 4931 1451 42 - -------------------------------------------------------------- 4931 1451 43 - 4931 1451 44 - ============================================================== 4931 1451 45 - Branching ratio for (n,g)In-116m added in MF 9 (Trkov, July 2011)4931 1451 46 - Value: 0.79 to reproduce the thermal value (recommended by IUPAC 4931 1451 47 - for NAA) and Cf-252 spontaneous fission spectrum averaged 4931 1451 48 - cross section (evaluated by Mannhart). 4931 1451 49 - ============================================================== 4931 1451 50 - File produced by WPEC Subgroup 23 in 2004-2005 4931 1451 51 - - WPEC: NEA Working Party on Evaluation Cooperation 4931 1451 52 - - SG23: International library of fission product evaluations 4931 1451 53 - 4931 1451 54 - 4931 1451 55 - File obtained by merging: &&4931 1451 56 - - Resolved Resonances (MLBW) <2. keV : Ref.1 &&4931 1451 57 - - Unresolved Resonances 2. keV - 100 keV : JENDL-3.3 &&4931 1451 58 - - Fast neutron region >100 keV : JENDL-3.3 &&4931 1451 59 - &&4931 1451 60 - Calculated thermal cross sections & resonance integrals: &&4931 1451 61 - --------------------------------------------- &&4931 1451 62 - Reaction Cross section Res. integral &&4931 1451 63 - (barn) (barn) &&4931 1451 64 - Total 2.0463E+02 - &&4931 1451 65 - Elastic 2.5082E+00 - &&4931 1451 66 - Capture 2.0212E+02 3.22E+03 &&4931 1451 67 - --------------------------------------------- &&4931 1451 68 - 4931 1451 69 - Corrected threshold energy secondary energy distributions 4931 1451 70 - in MF=5. 4931 1451 71 - Corrected interpolation in MF=5. 4931 1451 72 - 4931 1451 73 - Reference: 4931 1451 74 - 1) S.F.Mughabghab: Atlas of Neutron Resonances, to be 4931 1451 75 - published by Elsevier, 2006 (5-th edition of BNL-325) 4931 1451 76 - ============================================================== 4931 1451 77 - 4931 1451 78 - JENDL-3.2 data were automatically transformed to JENDL-3.3. 4931 1451 79 - Interpolation of spectra: 22 (unit base interpolation) 4931 1451 80 - (3,251) deleted, T-matrix of (4,2) deleted, and others. 4931 1451 81 - =========================================================== 4931 1451 82 - 4931 1451 83 -84-10 EVALUATION FOR JENDL-2 WAS MADE BY JNDC FPND W.G./1/ 4931 1451 84 -90-03 MODIFICATION FOR JENDL-3 WAS MADE/2/. 4931 1451 85 -93-03 JENDL-3.2 WAS MADE BY JNDC FPND W.G. 4931 1451 86 - 4931 1451 87 - ***** MODIFIED PARTS FOR JENDL-3.2 ******************** 4931 1451 88 - (2,151) UNRESOLVED RESONANCE PARAMETERS RE-ADJUSTED 4931 1451 89 - SO AS TO REPRODUCE THE RE-NORMALIZED CAPTURE 4931 1451 90 - CROSS SECTION. 4931 1451 91 - (3,102) RE-NORMALIZATION. 4931 1451 92 - (3,2), (3,4), (3,51-91) AND ANGULAR DISTRIBUTIONS 4931 1451 93 - SMALL EFFECTS OF THE RE-NORMALIZATION OF 4931 1451 94 - CAPTURE CROSS SECTION. 4931 1451 95 - *********************************************************** 4931 1451 96 - 4931 1451 97 - 4931 1451 98 -MF = 1 GENERAL INFORMATION 4931 1451 99 - MT=451 COMMENTS AND DICTIONARY 4931 1451 100 - 4931 1451 101 -MF = 2 RESONANCE PARAMETERS 4931 1451 102 - MT=151 RESOLVED AND UNRESOLVED RESONANCE PARAMETERS 4931 1451 103 - RESOLVED RESONANCE REGION (MLBW FORMULA) : BELOW 2 KEV 4931 1451 104 - RESONANCE PARAMETERS OF JENDL-2 WERE MODIFIED AS FOLLOWS: 4931 1451 105 - FOR JENDL-2, PARAMETERS WERE TAKEN FROM THE EXPERIMENT BY 4931 1451 106 - HACKEN ET AL./3/ ANGULAR MOMENTUM L AND SPIN J WERE BASED ON 4931 1451 107 - THE MEASUREMENT OF CORVI AND STEFANON/4/. THE AVERAGE 4931 1451 108 - RADIATION WIDTH OF 0.085 EV WAS DEDUCED /3/ AND APPLIED TO THE4931 1451 109 - LEVELS WHOSE RADIATION WIDTH WAS UNKNOWN. 4931 1451 110 - FOR JENDL-3, TOTAL SPIN J OF SOME RESONANCES WAS TENTATIVE-4931 1451 111 - LY ESTIMATED WITH A RANDOM NUMBER METHOD. 4931 1451 112 - 4931 1451 113 - UNRESOLVED RESONANCE REGION : 2 KEV - 100 KEV 4931 1451 114 - PARAMETERS WERE TAKEN FROM JENDL-2. 4931 1451 115 - THE NEUTRON STRENGTH FUNCTIONS, S0, S1 AND S2 WERE CALCULATED 4931 1451 116 - WITH OPTICAL MODEL CODE CASTHY/5/. THE OBSERVED LEVEL SPACING4931 1451 117 - WAS DETERMINED TO REPRODUCE THE CAPTURE CROSS SECTION 4931 1451 118 - CALCULATED WITH CASTHY. THE EFFECTIVE SCATTERING RADIUS WAS 4931 1451 119 - OBTAINED FROM FITTING TO THE CALCULATED TOTAL CROSS SECTION AT4931 1451 120 - 100 KEV. THE RADIATION WIDTH GG WAS BASED ON THE COMPILATION 4931 1451 121 - OF MUGHABGHAB ET AL./6/ 4931 1451 122 - 4931 1451 123 - TYPICAL VALUES OF THE PARAMETERS AT 70 KEV: 4931 1451 124 - S0 = 0.760E-4, S1 = 2.700E-4, S2 = 0.760E-4, SG = 95.0E-4, 4931 1451 125 - GG = 0.077 EV, R = 5.539 FM. 4931 1451 126 - 4931 1451 127 - CALCULATED 2200-M/S CROSS SECTIONS AND RES. INTEGRALS (BARNS) 4931 1451 128 - 2200 M/S RES. INTEG. 4931 1451 129 - TOTAL 203.5 - 4931 1451 130 - ELASTIC 2.526 - 4931 1451 131 - CAPTURE 201.0 3210 4931 1451 132 - 4931 1451 133 -MF = 3 NEUTRON CROSS SECTIONS 4931 1451 134 - BELOW 100 KEV, RESONANCE PARAMETERS WERE GIVEN. 4931 1451 135 - ABOVE 100 KEV, THE SPHERICAL OPTICAL AND STATISTICAL MODEL 4931 1451 136 - CALCULATION WAS PERFORMED WITH CASTHY, BY TAKING ACCOUNT OF 4931 1451 137 - COMPETING REACTIONS, OF WHICH CROSS SECTIONS WERE CALCULATED 4931 1451 138 - WITH PEGASUS/7/ STANDING ON A PREEQUILIBRIUM AND MULTI-STEP 4931 1451 139 - EVAPORATION MODEL. THE OMP'S FOR NEUTRON GIVEN IN TABLE 1 WERE 4931 1451 140 - DETERMINED TO REPRODUCE A SYSTEMATIC TREND OF THE TOTAL CROSS 4931 1451 141 - SECTION BY CHANGING RSO OF IIJIMA-KAWAI POTENTIAL/8/. THE OMP'S4931 1451 142 - FOR CHARGED PARTICLES ARE AS FOLLOWS: 4931 1451 143 - PROTON = PEREY/9/ 4931 1451 144 - ALPHA = HUIZENGA AND IGO/10/ 4931 1451 145 - DEUTERON = LOHR AND HAEBERLI/11/ 4931 1451 146 - HELIUM-3 AND TRITON = BECCHETTI AND GREENLEES/12/ 4931 1451 147 - PARAMETERS FOR THE COMPOSITE LEVEL DENSITY FORMULA OF GILBERT 4931 1451 148 - AND CAMERON/13/ WERE EVALUATED BY IIJIMA ET AL./14/ MORE 4931 1451 149 - EXTENSIVE DETERMINATION AND MODIFICATION WERE MADE IN THE 4931 1451 150 - PRESENT WORK. TABLE 2 SHOWS THE LEVEL DENSITY PARAMETERS USED 4931 1451 151 - IN THE PRESENT CALCULATION. ENERGY DEPENDENCE OF SPIN CUT-OFF 4931 1451 152 - PARAMETER IN THE ENERGY RANGE BELOW E-JOINT IS DUE TO GRUPPELAAR4931 1451 153 - /15/. 4931 1451 154 - 4931 1451 155 - MT = 1 TOTAL 4931 1451 156 - SPHERICAL OPTICAL MODEL CALCULATION WAS ADOPTED. 4931 1451 157 - 4931 1451 158 - MT = 2 ELASTIC SCATTERING 4931 1451 159 - CALCULATED AS (TOTAL - SUM OF PARTIAL CROSS SECTIONS). 4931 1451 160 - 4931 1451 161 - MT = 4, 51 - 91 INELASTIC SCATTERING 4931 1451 162 - SPHERICAL OPTICAL AND STATISTICAL MODEL CALCULATION WAS 4931 1451 163 - ADOPTED. THE LEVEL SCHEME WAS TAKEN FROM REF./16/. 4931 1451 164 - 4931 1451 165 - NO. ENERGY(MEV) SPIN-PARITY 4931 1451 166 - GR. 0.0 9/2 + 4931 1451 167 - 1 0.3362 1/2 - 4931 1451 168 - 2 0.5970 3/2 - 4931 1451 169 - 3 0.8284 3/2 + 4931 1451 170 - 4 0.8640 1/2 + 4931 1451 171 - 5 0.9336 7/2 + 4931 1451 172 - 6 0.9412 5/2 + 4931 1451 173 - 7 1.0780 5/2 + 4931 1451 174 - 8 1.1325 11/2 + 4931 1451 175 - 9 1.2905 13/2 + 4931 1451 176 - 10 1.4180 9/2 + 4931 1451 177 - 11 1.4487 9/2 + 4931 1451 178 - 12 1.4625 7/2 + 4931 1451 179 - 13 1.4858 9/2 + 4931 1451 180 - LEVELS ABOVE 1.5 MEV WERE ASSUMED TO BE OVERLAPPING. 4931 1451 181 - 4931 1451 182 - MT = 102 CAPTURE 4931 1451 183 - SPHERICAL OPTICAL AND STATISTICAL MODEL CALCULATION WITH 4931 1451 184 - CASTHY WAS ADOPTED. DIRECT AND SEMI-DIRECT CAPTURE CROSS 4931 1451 185 - SECTIONS WERE ESTIMATED ACCORDING TO THE PROCEDURE OF BENZI 4931 1451 186 - AND REFFO/17/ AND NORMALIZED TO 1 MILLI-BARN AT 14 MEV. 4931 1451 187 - 4931 1451 188 - THE GAMMA-RAY STRENGTH FUNCTION (9.37E-03) WAS ADJUSTED TO 4931 1451 189 - REPRODUCE THE NATURAL IN CAPTURE CROSS SECTION OF 460 4931 1451 190 - MILLI-BARNS AT 80 KEV MEASURED BY KOMPE /18/, SHORIN ET 4931 1451 191 - AL./19/ AND KONONOV ET AL./20/ 4931 1451 192 - 4931 1451 193 - MT = 16 (N,2N) CROSS SECTION 4931 1451 194 - MT = 17 (N,3N) CROSS SECTION 4931 1451 195 - MT = 22 (N,N'A) CROSS SECTION 4931 1451 196 - MT = 28 (N,N'P) CROSS SECTION 4931 1451 197 - MT = 32 (N,N'D) CROSS SECTION 4931 1451 198 - MT = 33 (N,N'T) CROSS SECTION 4931 1451 199 - MT =103 (N,P) CROSS SECTION 4931 1451 200 - MT =104 (N,D) CROSS SECTION 4931 1451 201 - MT =105 (N,T) CROSS SECTION 4931 1451 202 - MT =107 (N,ALPHA) CROSS SECTION 4931 1451 203 - THESE REACTION CROSS SECTIONS WERE CALCULATED WITH THE 4931 1451 204 - PREEQUILIBRIUM AND MULTI-STEP EVAPORATION MODEL CODE PEGASUS. 4931 1451 205 - 4931 1451 206 - THE KALBACH'S CONSTANT K (= 138.9) WAS ESTIMATED BY THE 4931 1451 207 - FORMULA DERIVED FROM KIKUCHI-KAWAI'S FORMALISM/21/ AND LEVEL 4931 1451 208 - DENSITY PARAMETERS. 4931 1451 209 - 4931 1451 210 - FINALLY, THE (N,P) AND (N,ALPHA) CROSS SECTIONS WERE 4931 1451 211 - NORMALIZED TO THE FOLLOWING VALUES AT 14.5 MEV: 4931 1451 212 - (N,P) 8.00 MB (RECOMMENDED BY FORREST/22/) 4931 1451 213 - (N,ALPHA) 2.40 MB (RECOMMENDED BY FORREST) 4931 1451 214 - THE (N,2N) CROSS SECTION WAS DETERMINED BY EYE-GUIDING OF 4931 1451 215 - THE DATA MEASURED BY SANTRY ET AL./23/ 4931 1451 216 - 4931 1451 217 - MT = 251 MU-BAR 4931 1451 218 - CALCULATED WITH CASTHY. 4931 1451 219 - 4931 1451 220 -MF = 4 ANGULAR DISTRIBUTIONS OF SECONDARY NEUTRONS 4931 1451 221 - LEGENDRE POLYNOMIAL COEFFICIENTS FOR ANGULAR DISTRIBUTIONS ARE 4931 1451 222 - GIVEN IN THE CENTER-OF-MASS SYSTEM FOR MT=2 AND DISCRETE INELAS-4931 1451 223 - TIC LEVELS, AND IN THE LABORATORY SYSTEM FOR MT=91. THEY WERE 4931 1451 224 - CALCULATED WITH CASTHY. FOR OTHER REACTIONS, ISOTROPIC DISTRI- 4931 1451 225 - BUTIONS IN THE LABORATORY SYSTEM WERE ASSUMED. 4931 1451 226 - 4931 1451 227 -MF = 5 ENERGY DISTRIBUTIONS OF SECONDARY NEUTRONS 4931 1451 228 - ENERGY DISTRIBUTIONS OF SECONDARY NEUTRONS WERE CALCULATED WITH 4931 1451 229 - PEGASUS FOR INELASTIC SCATTERING TO OVERLAPPING LEVELS AND FOR 4931 1451 230 - OTHER NEUTRON EMITTING REACTIONS. 4931 1451 231 - 4931 1451 232 -TABLE 1 NEUTRON OPTICAL POTENTIAL PARAMETERS 4931 1451 233 - 4931 1451 234 - DEPTH (MEV) RADIUS(FM) DIFFUSENESS(FM) 4931 1451 235 - ---------------------- ------------ --------------- 4931 1451 236 - V = 47.64-0.473E R0 = 6.256 A0 = 0.62 4931 1451 237 - WS = 9.744 RS = 6.469 AS = 0.35 4931 1451 238 - VSO= 7.0 RSO= 6.241 ASO= 0.62 4931 1451 239 - THE FORM OF SURFACE ABSORPTION PART IS DER. WOODS-SAXON TYPE. 4931 1451 240 - 4931 1451 241 -TABLE 2 LEVEL DENSITY PARAMETERS 4931 1451 242 - 4931 1451 243 - NUCLIDE SYST A(1/MEV) T(MEV) C(1/MEV) EX(MEV) PAIRING 4931 1451 244 - --------------------------------------------------------------- 4931 1451 245 - 47-AG-111 1.955E+01 5.810E-01 6.505E+00 5.835E+00 1.140E+00 4931 1451 246 - 47-AG-112 * 1.857E+01 6.210E-01 4.959E+01 5.129E+00 0.0 4931 1451 247 - 47-AG-113 * 1.837E+01 6.185E-01 5.132E+00 6.321E+00 1.320E+00 4931 1451 248 - 47-AG-114 * 1.816E+01 6.161E-01 3.785E+01 4.871E+00 0.0 4931 1451 249 - 4931 1451 250 - 48-CD-112 1.797E+01 6.190E-01 6.327E-01 7.351E+00 2.500E+00 4931 1451 251 - 48-CD-113 1.973E+01 5.760E-01 4.397E+00 6.018E+00 1.360E+00 4931 1451 252 - 48-CD-114 1.910E+01 6.010E-01 5.651E-01 7.611E+00 2.680E+00 4931 1451 253 - 48-CD-115 2.072E+01 5.570E-01 4.805E+00 5.966E+00 1.360E+00 4931 1451 254 - 4931 1451 255 - 49-IN-113 1.885E+01 5.070E-01 1.371E+00 4.280E+00 1.140E+00 4931 1451 256 - 49-IN-114 1.632E+01 5.290E-01 6.292E+00 2.752E+00 0.0 4931 1451 257 - 49-IN-115 1.600E+01 6.510E-01 2.555E+00 5.941E+00 1.320E+00 4931 1451 258 - 49-IN-116 1.710E+01 5.650E-01 1.250E+01 3.562E+00 0.0 4931 1451 259 - --------------------------------------------------------------- 4931 1451 260 - SYST: * = LDP'S WERE DETERMINED FROM SYSTEMATICS. 4931 1451 261 - 4931 1451 262 - SPIN CUTOFF PARAMETERS WERE CALCULATED AS 0.146*SQRT(A)*A**(2/3).4931 1451 263 - IN THE CASTHY CALCULATION, SPIN CUTOFF FACTORS AT 0 MEV WERE 4931 1451 264 - ASSUMED TO BE 8.461 FOR IN-115 AND 5.0 FOR IN-116. 4931 1451 265 - 4931 1451 266 -REFERENCES 4931 1451 267 - 1) AOKI, T. ET AL.: PROC. INT. CONF. ON NUCLEAR DATA FOR BASIC 4931 1451 268 - AND APPLIED SCIENCE, SANTA FE., VOL. 2, P.1627 (1985). 4931 1451 269 - 2) KAWAI, M. ET AL.: J. NUCL. SCI. TECHNOL., 29, 195 (1992). 4931 1451 270 - 3) HACKEN, G., ET AL.: PHYS. REV., C10, 1910 (1974). 4931 1451 271 - 4) CORVI, F. AND STEFANON, M.: NUCL. PHYS., A233, 185 (1974). 4931 1451 272 - 5) IGARASI, S. AND FUKAHORI, T.: JAERI 1321 (1991). 4931 1451 273 - 6) MUGHABGHAB, S.F. ET AL.: "NEUTRON CROSS SECTIONS, VOL. I, 4931 1451 274 - PART A", ACADEMIC PRESS (1981). 4931 1451 275 - 7) IIJIMA, S. ET AL.: JAERI-M 87-025, P. 337 (1987). 4931 1451 276 - 8) IIJIMA, S. AND KAWAI, M.: J. NUCL. SCI. TECHNOL., 20, 77 4931 1451 277 - (1983). 4931 1451 278 - 9) PEREY, F.G: PHYS. REV. 131, 745 (1963). 4931 1451 279 -10) HUIZENGA, J.R. AND IGO, G.: NUCL. PHYS. 29, 462 (1962). 4931 1451 280 -11) LOHR, J.M. AND HAEBERLI, W.: NUCL. PHYS. A232, 381 (1974). 4931 1451 281 -12) BECCHETTI, F.D., JR. AND GREENLEES, G.W.: POLARIZATION 4931 1451 282 - PHENOMENA IN NUCLEAR REACTIONS ((EDS) H.H. BARSHALL AND 4931 1451 283 - W. HAEBERLI), P. 682, THE UNIVERSITY OF WISCONSIN PRESS. 4931 1451 284 - (1971). 4931 1451 285 -13) GILBERT, A. AND CAMERON, A.G.W.: CAN. J. PHYS., 43, 1446 4931 1451 286 - (1965). 4931 1451 287 -14) IIJIMA, S., ET AL.: J. NUCL. SCI. TECHNOL. 21, 10 (1984). 4931 1451 288 -15) GRUPPELAAR, H.: ECN-13 (1977). 4931 1451 289 -16) LEDERER, C.M., ET AL.: "TABLE OF ISOTOPES, 7TH ED.", WILEY- 4931 1451 290 - INTERSCIENCE PUBLICATION (1978). 4931 1451 291 -17) BENZI, V. AND REFFO, G.: CCDN-NW/10 (1969). 4931 1451 292 -18) KOMPE, D.: NUCL. PYS., A133, 513 (1969). 4931 1451 293 -19) SHORIN, V.S., ET AL.: YADERNYA FIZIKA, 19, 5 (1974). 4931 1451 294 -20) KONONOV, V.N. ET AL.: YADERNYA KONSTANTY, 22, 29 (1977). 4931 1451 295 -21) KIKUCHI, K. AND KAWAI, M.: "NUCLEAR MATTER AND NUCLEAR 4931 1451 296 - REACTIONS", NORTH HOLLAND (1968). 4931 1451 297 -22) FORREST, R.A.: AERE-R 12419 (1986). 4931 1451 298 -23) SANTRY,D.C., ET AL.: CAN. J. PHYS., 54, 757 (1976) 4931 1451 299 - 4931 1451 300 - **************** Program DICTIN (VERSION 2018-1) ****************4931 1451 301 - 1 451 370 04931 1451 302 - 2 151 492 04931 1451 303 - 3 1 33 04931 1451 304 - 3 2 33 04931 1451 305 - 3 4 16 04931 1451 306 - 3 16 10 04931 1451 307 - 3 17 5 04931 1451 308 - 3 22 13 04931 1451 309 - 3 28 11 04931 1451 310 - 3 32 7 04931 1451 311 - 3 33 6 04931 1451 312 - 3 51 16 04931 1451 313 - 3 52 15 04931 1451 314 - 3 53 14 04931 1451 315 - 3 54 14 04931 1451 316 - 3 55 13 04931 1451 317 - 3 56 13 04931 1451 318 - 3 57 12 04931 1451 319 - 3 58 12 04931 1451 320 - 3 59 11 04931 1451 321 - 3 60 11 04931 1451 322 - 3 61 10 04931 1451 323 - 3 62 10 04931 1451 324 - 3 63 10 04931 1451 325 - 3 91 9 04931 1451 326 - 3 102 27 04931 1451 327 - 3 103 14 04931 1451 328 - 3 104 12 04931 1451 329 - 3 105 10 04931 1451 330 - 3 107 15 04931 1451 331 - 4 2 179 04931 1451 332 - 4 16 10 04931 1451 333 - 4 17 10 04931 1451 334 - 4 51 26 04931 1451 335 - 4 52 26 04931 1451 336 - 4 53 28 04931 1451 337 - 4 54 28 04931 1451 338 - 4 55 28 04931 1451 339 - 4 56 26 04931 1451 340 - 4 57 24 04931 1451 341 - 4 58 24 04931 1451 342 - 4 59 24 04931 1451 343 - 4 60 24 04931 1451 344 - 4 61 24 04931 1451 345 - 4 62 24 04931 1451 346 - 4 63 24 04931 1451 347 - 4 91 24 04931 1451 348 - 5 16 57 04931 1451 349 - 5 17 29 04931 1451 350 - 5 91 122 04931 1451 351 - 6 22 300 04931 1451 352 - 6 28 330 04931 1451 353 - 6 32 112 04931 1451 354 - 6 33 102 04931 1451 355 - 6 103 417 04931 1451 356 - 6 104 208 04931 1451 357 - 6 105 115 04931 1451 358 - 6 107 366 04931 1451 359 - 8 4 2 14931 1451 360 - 8 16 2 14931 1451 361 - 8 102 2 04931 1451 362 - 9 102 5 04931 1451 363 - 10 4 71 04931 1451 364 - 10 16 42 14931 1451 365 - 12 102 211 04931 1451 366 - 14 102 1 04931 1451 367 - 15 102 742 04931 1451 368 - 40 4 192 14931 1451 369 - 40 16 82 14931 1451 370 - 4931 1 0 0 - 4931 0 0 0 - 4.911500+4 1.139170+2 0 0 0 04931 3 4 1 - 0.000000+0-3.362000+5 0 0 1 374931 3 4 2 - 37 3 0 0 0 04931 3 4 3 - 3.391510+5 0.000000+0 5.000000+5 6.385660-3 6.022410+5 1.043320-24931 3 4 4 - 7.000000+5 2.842700-2 8.000000+5 4.247320-2 8.356720+5 4.731340-24931 3 4 5 - 8.715840+5 5.612760-2 9.000000+5 6.303840-2 9.417950+5 7.248120-24931 3 4 6 - 9.494620+5 8.697130-2 1.000000+6 1.569270-1 1.087460+6 2.390530-14931 3 4 7 - 1.142440+6 2.834560-1 1.250000+6 4.560630-1 1.301830+6 5.077670-14931 3 4 8 - 1.430450+6 6.681500-1 1.461420+6 7.115540-1 1.475340+6 7.367420-14931 3 4 9 - 1.498840+6 7.757070-1 1.500000+6 7.794430-1 1.513170+6 8.040690-14931 3 4 10 - 1.750000+6 1.118340+0 2.000000+6 1.345660+0 3.000000+6 1.820510+04931 3 4 11 - 4.000000+6 2.021200+0 5.000000+6 2.039710+0 6.000000+6 1.961460+04931 3 4 12 - 7.000000+6 1.874700+0 8.000000+6 1.816740+0 9.000000+6 1.792060+04931 3 4 13 - 1.000000+7 1.432750+0 1.200000+7 4.884340-1 1.400000+7 2.179820-14931 3 4 14 - 1.500000+7 1.673010-1 1.600000+7 1.444920-1 1.800000+7 1.179670-14931 3 4 15 - 2.000000+7 1.023800-1 4931 3 4 16 - 4931 3 0 0 - 4.911500+4 1.139170+2 0 0 0 04931 3 16 1 --9.041100+6-9.041100+6 0 0 1 194931 3 16 2 - 19 2 0 0 0 04931 3 16 3 - 9.120480+6 0.000000+0 9.438980+6 4.158420-2 1.000000+7 1.700000-14931 3 16 4 - 1.050000+7 3.950000-1 1.100000+7 6.700000-1 1.150000+7 8.900000-14931 3 16 5 - 1.200000+7 1.065000+0 1.250000+7 1.220000+0 1.300000+7 1.315000+04931 3 16 6 - 1.350000+7 1.410000+0 1.400000+7 1.460000+0 1.450000+7 1.490000+04931 3 16 7 - 1.500000+7 1.520000+0 1.600000+7 1.560000+0 1.650000+7 1.570000+04931 3 16 8 - 1.700000+7 1.525000+0 1.800000+7 1.370000+0 1.900000+7 1.150000+04931 3 16 9 - 2.000000+7 1.010000+0 4931 3 16 10 - 4931 3 0 0 - 4.911500+4 1.139170+2 0 0 0 04931 3102 1 - 6.783390+6 6.783390+6 0 0 2 714931 3102 2 - 3 2 71 5 0 04931 3102 3 - 1.000000-5 0.000000+0 2.000000+3 0.000000+0 2.000000+3 2.807000+04931 3102 4 - 3.000000+3 2.259800+0 4.000000+3 1.958400+0 5.000000+3 1.763500+04931 3102 5 - 6.000000+3 1.627200+0 7.000000+3 1.524500+0 8.000000+3 1.442900+04931 3102 6 - 9.000000+3 1.374700+0 1.000000+4 1.317100+0 1.500000+4 1.104000+04931 3102 7 - 2.000000+4 9.696000-1 2.500000+4 8.620000-1 3.000000+4 7.879000-14931 3102 8 - 4.000000+4 6.712000-1 5.000000+4 5.892000-1 6.000000+4 5.282000-14931 3102 9 - 7.000000+4 4.811000-1 8.000000+4 4.438000-1 9.000000+4 4.137000-14931 3102 10 - 1.000000+5 3.889000-1 1.500000+5 3.200000-1 2.000000+5 2.850000-14931 3102 11 - 2.500000+5 2.631000-1 3.000000+5 2.531000-1 3.391510+5 2.463900-14931 3102 12 - 5.000000+5 2.339370-1 6.022410+5 2.344100-1 7.000000+5 2.335040-14931 3102 13 - 8.000000+5 2.374170-1 8.356720+5 2.393810-1 8.715840+5 2.406570-14931 3102 14 - 9.000000+5 2.418730-1 9.417950+5 2.441070-1 9.494620+5 2.421380-14931 3102 15 - 1.000000+6 2.364020-1 1.087460+6 2.346890-1 1.142440+6 2.346620-14931 3102 16 - 1.250000+6 2.169470-1 1.301830+6 2.148440-1 1.430450+6 1.977490-14931 3102 17 - 1.461420+6 1.937340-1 1.475340+6 1.910670-1 1.498840+6 1.873680-14931 3102 18 - 1.500000+6 1.868780-1 1.513170+6 1.844070-1 1.750000+6 1.522470-14931 3102 19 - 2.000000+6 1.259090-1 3.000000+6 6.691250-2 4.000000+6 3.680660-24931 3102 20 - 5.000000+6 1.832850-2 6.000000+6 8.667820-3 7.000000+6 4.119510-34931 3102 21 - 7.483310+6 2.993630-3 8.000000+6 2.227840-3 8.485280+6 1.848590-34931 3102 22 - 9.000000+6 1.614580-3 9.486830+6 1.453840-3 1.000000+7 1.402720-34931 3102 23 - 1.048810+7 1.287820-3 1.100000+7 1.254070-3 1.200000+7 1.148900-34931 3102 24 - 1.300000+7 1.070960-3 1.400000+7 1.021220-3 1.500000+7 1.000400-34931 3102 25 - 1.600000+7 1.001000-3 1.700000+7 1.017570-3 1.800000+7 1.046240-34931 3102 26 - 1.900000+7 1.085550-3 2.000000+7 1.133590-3 4931 3102 27 - 4931 3 0 0 - 4931 0 0 0 - 4.911500+4 1.139170+2 0 0 1 14931 8 4 1 - 4.911500+4 3.362000+5 10 1 0 04931 8 4 2 - 4931 8 0 0 - 4.911500+4 1.139170+2 0 0 1 14931 8 16 1 - 4.911400+4 1.902682+5 10 1 0 04931 8 16 2 - 4931 8 0 0 - 4.911500+4 1.139170+2 0 0 1 14931 8102 1 - 4.911600+4 1.272697+5 9 1 0 04931 8102 2 - 4931 8 0 0 - 4931 0 0 0 - 4.911500+4 1.139170+2 0 0 1 04931 9102 1 - 6783389.7 6.656120+6 49116 1 1 54931 9102 2 - 5 2 0 0 0 04931 9102 3 - 1.000000-5 7.900000-1 2.530000-2 7.900000-1 1.000000+3 7.900000-14931 9102 4 - 1.000000+5 7.900000-1 2.000000+7 7.900000-1 4931 9102 5 - 4931 9 0 0 - 4931 0 0 0 - 4.911500+4 1.139170+2 0 0 1 0493110 4 1 - 0.000000+0-3.362000+5 49115 1 1 204493110 4 2 - 204 2 493110 4 3 - 3.391990+5 0.000000+0 4.000000+5 1.617850-3 4.500000+5 2.477560-3493110 4 4 - 5.000000+5 3.899920-3 5.500000+5 6.009780-3 6.000000+5 8.928949-3493110 4 5 - 6.500000+5 1.276430-2 7.000000+5 1.759410-2 7.500000+5 2.345550-2493110 4 6 - 8.000000+5 3.033580-2 8.500000+5 3.816960-2 9.000000+5 4.684450-2493110 4 7 - 9.500000+5 5.621340-2 1.000000+6 6.611190-2 1.100000+6 8.685830-2493110 4 8 - 1.200000+6 1.080250-1 1.300000+6 1.290290-1 1.400000+6 1.497310-1493110 4 9 - 1.500000+6 1.702710-1 1.600000+6 1.908860-1 1.700000+6 2.117730-1493110 4 10 - 1.800000+6 2.329800-1 1.900000+6 2.543440-1 2.000000+6 2.754460-1493110 4 11 - 2.100000+6 2.954040-1 2.200000+6 3.127970-1 2.300000+6 3.259070-1493110 4 12 - 2.400000+6 3.349800-1 2.500000+6 3.406570-1 2.600000+6 3.437040-1493110 4 13 - 2.700000+6 3.448370-1 2.800000+6 3.446570-1 2.900000+6 3.436260-1493110 4 14 - 3.000000+6 3.407750-1 3.100000+6 3.393480-1 3.200000+6 3.376800-1493110 4 15 - 3.300000+6 3.358510-1 3.400000+6 3.339310-1 3.500000+6 3.319810-1493110 4 16 - 3.600000+6 3.300570-1 3.700000+6 3.282140-1 3.800000+6 3.265010-1493110 4 17 - 3.900000+6 3.249680-1 4.000000+6 3.236640-1 4.100000+6 3.226360-1493110 4 18 - 4.200000+6 3.219300-1 4.300000+6 3.215880-1 4.400000+6 3.216450-1493110 4 19 - 4.500000+6 3.221240-1 4.600000+6 3.230330-1 4.700000+6 3.243610-1493110 4 20 - 4.800000+6 3.260660-1 4.900000+6 3.280840-1 5.000000+6 3.303180-1493110 4 21 - 5.100000+6 3.326510-1 5.200000+6 3.349520-1 5.300000+6 3.370890-1493110 4 22 - 5.400000+6 3.388670-1 5.500000+6 3.397320-1 5.600000+6 3.404230-1493110 4 23 - 5.700000+6 3.409300-1 5.800000+6 3.412490-1 5.900000+6 3.413760-1493110 4 24 - 6.000000+6 3.413120-1 6.100000+6 3.410550-1 6.200000+6 3.406110-1493110 4 25 - 6.300000+6 3.399820-1 6.400000+6 3.391760-1 6.500000+6 3.381980-1493110 4 26 - 6.600000+6 3.370570-1 6.700000+6 3.357600-1 6.800000+6 3.343180-1493110 4 27 - 6.900000+6 3.327400-1 7.000000+6 3.310340-1 7.100000+6 3.292110-1493110 4 28 - 7.200000+6 3.272800-1 7.300000+6 3.252510-1 7.400000+6 3.231340-1493110 4 29 - 7.500000+6 3.209350-1 7.600000+6 3.186650-1 7.700000+6 3.163310-1493110 4 30 - 7.799989+6 3.139410-1 7.899989+6 3.115010-1 8.000000+6 3.090170-1493110 4 31 - 8.099989+6 3.064960-1 8.200000+6 3.039410-1 8.300000+6 3.013570-1493110 4 32 - 8.400000+6 2.987470-1 8.500000+6 2.961140-1 8.600000+6 2.934600-1493110 4 33 - 8.700000+6 2.907860-1 8.800000+6 2.880910-1 8.900000+6 2.853750-1493110 4 34 - 9.000000+6 2.826360-1 9.100000+6 2.798720-1 9.200000+6 2.770800-1493110 4 35 - 9.300000+6 2.742540-1 9.400000+6 2.713890-1 9.500000+6 2.684780-1493110 4 36 - 9.600000+6 2.655150-1 9.700000+6 2.624890-1 9.800000+6 2.593930-1493110 4 37 - 9.900000+6 2.562130-1 1.000000+7 2.529400-1 1.010000+7 2.495590-1493110 4 38 - 1.020000+7 2.460580-1 1.030000+7 2.424220-1 1.040000+7 2.386370-1493110 4 39 - 1.050000+7 2.346880-1 1.060000+7 2.305600-1 1.070000+7 2.262410-1493110 4 40 - 1.080000+7 2.217170-1 1.090000+7 2.169790-1 1.100000+7 2.120180-1493110 4 41 - 1.110000+7 2.068300-1 1.120000+7 2.014160-1 1.130000+7 1.957780-1493110 4 42 - 1.140000+7 1.899290-1 1.150000+7 1.838840-1 1.160000+7 1.776650-1493110 4 43 - 1.170000+7 1.713020-1 1.180000+7 1.648290-1 1.190000+7 1.582870-1493110 4 44 - 1.200000+7 1.517200-1 1.210000+7 1.451760-1 1.220000+7 1.387040-1493110 4 45 - 1.230000+7 1.323530-1 1.240000+7 1.261690-1 1.250000+7 1.201950-1493110 4 46 - 1.260000+7 1.144710-1 1.270000+7 1.090280-1 1.280000+7 1.038910-1493110 4 47 - 1.290000+7 9.907850-2 1.300000+7 9.460240-2 1.310000+7 9.046700-2493110 4 48 - 1.320000+7 8.667089-2 1.330000+7 8.320740-2 1.340000+7 8.006531-2493110 4 49 - 1.350000+7 7.723000-2 1.360000+7 7.468450-2 1.370000+7 7.240970-2493110 4 50 - 1.380000+7 7.038580-2 1.390000+7 6.859240-2 1.400000+7 6.700921-2493110 4 51 - 1.410000+7 6.561660-2 1.420000+7 6.439550-2 1.430000+7 6.332830-2493110 4 52 - 1.440000+7 6.239810-2 1.450000+7 6.158950-2 1.460000+7 6.088830-2493110 4 53 - 1.470000+7 6.028151-2 1.480000+7 5.975760-2 1.490000+7 5.930580-2493110 4 54 - 1.500000+7 5.886940-2 1.510000+7 5.838350-2 1.520000+7 5.799260-2493110 4 55 - 1.530000+7 5.764350-2 1.540000+7 5.733109-2 1.550000+7 5.705060-2493110 4 56 - 1.560000+7 5.679800-2 1.570000+7 5.656960-2 1.580000+7 5.636230-2493110 4 57 - 1.590000+7 5.617320-2 1.600000+7 5.599990-2 1.610000+7 5.584020-2493110 4 58 - 1.620000+7 5.569240-2 1.630000+7 5.555480-2 1.640000+7 5.542590-2493110 4 59 - 1.650000+7 5.530460-2 1.660000+7 5.518970-2 1.670000+7 5.508030-2493110 4 60 - 1.680000+7 5.497560-2 1.690000+7 5.487500-2 1.700000+7 5.477780-2493110 4 61 - 1.710000+7 5.468350-2 1.720000+7 5.459170-2 1.730000+7 5.450190-2493110 4 62 - 1.740000+7 5.441400-2 1.750000+7 5.432750-2 1.760000+7 5.424230-2493110 4 63 - 1.770000+7 5.415820-2 1.780000+7 5.407500-2 1.790000+7 5.399260-2493110 4 64 - 1.800000+7 5.391080-2 1.810000+7 5.382960-2 1.820000+7 5.374890-2493110 4 65 - 1.830000+7 5.366860-2 1.840000+7 5.358870-2 1.850000+7 5.350920-2493110 4 66 - 1.860000+7 5.342999-2 1.870000+7 5.335100-2 1.880000+7 5.327240-2493110 4 67 - 1.890000+7 5.319400-2 1.900000+7 5.311600-2 1.910000+7 5.303820-2493110 4 68 - 1.920000+7 5.296070-2 1.930000+7 5.288350-2 1.940000+7 5.280661-2493110 4 69 - 1.950000+7 5.273000-2 1.960000+7 5.265380-2 1.970000+7 5.257780-2493110 4 70 - 1.980000+7 5.250230-2 1.990000+7 5.242710-2 2.000000+7 5.235230-2493110 4 71 - 493110 0 0 - 4.911500+4 1.139170+2 0 0 1 0493110 16 1 --9.035780+6-9.226080+6 49114 1 1 115493110 16 2 - 115 2 493110 16 3 - 9.307111+6 0.000000+0 9.350000+6 4.991810-3 9.400000+6 7.217300-3493110 16 4 - 9.450000+6 1.094950-2 9.500000+6 1.615590-2 9.550000+6 2.279810-2493110 16 5 - 9.600000+6 3.083200-2 9.650000+6 4.020840-2 9.700000+6 5.087340-2493110 16 6 - 9.750000+6 6.276920-2 9.800000+6 7.583460-2 9.850000+6 9.000520-2493110 16 7 - 9.900000+6 1.052150-1 9.950000+6 1.213950-1 1.000000+7 1.384750-1493110 16 8 - 1.010000+7 1.750600-1 1.020000+7 2.144100-1 1.030000+7 2.559770-1493110 16 9 - 1.040000+7 2.992390-1 1.050000+7 3.437060-1 1.060000+7 3.889280-1493110 16 10 - 1.070000+7 4.345000-1 1.080000+7 4.800620-1 1.090000+7 5.253000-1493110 16 11 - 1.100000+7 5.699480-1 1.110000+7 6.137790-1 1.120000+7 6.566080-1493110 16 12 - 1.130000+7 6.982870-1 1.140000+7 7.386980-1 1.150000+7 7.777540-1493110 16 13 - 1.160000+7 8.153910-1 1.170000+7 8.515700-1 1.180000+7 8.862659-1493110 16 14 - 1.190000+7 9.194719-1 1.200000+7 9.511940-1 1.210000+7 9.814480-1493110 16 15 - 1.220000+7 1.010260+0 1.230000+7 1.037650+0 1.240000+7 1.063670+0493110 16 16 - 1.250000+7 1.088350+0 1.260000+7 1.111740+0 1.270000+7 1.133870+0493110 16 17 - 1.280000+7 1.154790+0 1.290000+7 1.174560+0 1.300000+7 1.193200+0493110 16 18 - 1.310000+7 1.210780+0 1.320000+7 1.227330+0 1.330000+7 1.242890+0493110 16 19 - 1.340000+7 1.257510+0 1.350000+7 1.271230+0 1.360000+7 1.284080+0493110 16 20 - 1.370000+7 1.296110+0 1.380000+7 1.307340+0 1.390000+7 1.317820+0493110 16 21 - 1.400000+7 1.327570+0 1.410000+7 1.336630+0 1.420000+7 1.345030+0493110 16 22 - 1.430000+7 1.352790+0 1.440000+7 1.359940+0 1.450000+7 1.366500+0493110 16 23 - 1.460000+7 1.372510+0 1.470000+7 1.377980+0 1.480000+7 1.382930+0493110 16 24 - 1.490000+7 1.387380+0 1.500000+7 1.391350+0 1.510000+7 1.394870+0493110 16 25 - 1.520000+7 1.397940+0 1.530000+7 1.400580+0 1.540000+7 1.402810+0493110 16 26 - 1.550000+7 1.404650+0 1.560000+7 1.406090+0 1.570000+7 1.407170+0493110 16 27 - 1.580000+7 1.407880+0 1.590000+7 1.408250+0 1.600000+7 1.408270+0493110 16 28 - 1.610000+7 1.407970+0 1.620000+7 1.407340+0 1.630000+7 1.406400+0493110 16 29 - 1.640000+7 1.405160+0 1.650000+7 1.403620+0 1.660000+7 1.401790+0493110 16 30 - 1.670000+7 1.399680+0 1.680000+7 1.397290+0 1.690000+7 1.394630+0493110 16 31 - 1.700000+7 1.391700+0 1.710000+7 1.388500+0 1.720000+7 1.385060+0493110 16 32 - 1.730000+7 1.381350+0 1.740000+7 1.377400+0 1.750000+7 1.373200+0493110 16 33 - 1.760000+7 1.368760+0 1.770000+7 1.364070+0 1.780000+7 1.359150+0493110 16 34 - 1.790000+7 1.353990+0 1.800000+7 1.348600+0 1.810000+7 1.342980+0493110 16 35 - 1.820000+7 1.337120+0 1.830000+7 1.331030+0 1.840000+7 1.324710+0493110 16 36 - 1.850000+7 1.318170+0 1.860000+7 1.311400+0 1.870000+7 1.304390+0493110 16 37 - 1.880000+7 1.297160+0 1.890000+7 1.289700+0 1.900000+7 1.282020+0493110 16 38 - 1.910000+7 1.274100+0 1.920000+7 1.265950+0 1.930000+7 1.257570+0493110 16 39 - 1.940000+7 1.248960+0 1.950000+7 1.240110+0 1.960000+7 1.231020+0493110 16 40 - 1.970000+7 1.221700+0 1.980000+7 1.212130+0 1.990000+7 1.202330+0493110 16 41 - 2.000000+7 1.192270+0 493110 16 42 - 493110 0 0 - 4931 0 0 0 - 0 0 0 0 - -1 0 0 0 diff --git a/tests/n-049_In-115_trimmed.endf.xz b/tests/n-049_In-115_trimmed.endf.xz new file mode 100644 index 0000000..e458e13 Binary files /dev/null and b/tests/n-049_In-115_trimmed.endf.xz differ diff --git a/tests/n-054_Xe_136_trimmed.endf b/tests/n-054_Xe_136_trimmed.endf deleted file mode 100644 index 2d9cb68..0000000 --- a/tests/n-054_Xe_136_trimmed.endf +++ /dev/null @@ -1,799 +0,0 @@ - ENDF/B-VIII.1 0 0 - 5.413600+4 1.347400+2 1 0 0 15461 1451 - 0.000000+0 0.000000+0 0 0 0 65461 1451 - 1.000000+0 2.000000+7 1 0 10 85461 1451 - 0.000000+0 0.000000+0 0 0 141 635461 1451 - 54-Xe-136 CNDC,BNL EVAL-JAN05 Q.B.Shen+, Mughabghab 5461 1451 - NDS 148, 1 (2018) DIST-AUG24 REV1-JUL23 20240830 5461 1451 ----- ENDF/B-VIII.1 MATERIAL 5461 REVISION 1 5461 1451 ------ INCIDENT-NEUTRON DATA 5461 1451 ------- ENDF-6 5461 1451 - 5461 1451 -**************************************************************** 5461 1451 -Missing exit distributions imported from TENDL2019 5461 1451 -by I.J. Thompson (LLNL) on 2023-04-21T21:19:22 5461 1451 - 5461 1451 -Some neutron exit distributions, as noted, may be imported so all 5461 1451 -exit distributions have the same reference frame. 5461 1451 - 5461 1451 -Changes by program patchGNDS.py: 5461 1451 - H1 distribution for MT=28: n + H1 + I135. 5461 1451 - n distribution for MT=28: n + H1 + I135. 5461 1451 - per --forENDF option as needed by ENDF LCT flag. 5461 1451 - He4 distribution for MT=22: n + He4 + Te132. 5461 1451 - n distribution for MT=22: n + He4 + Te132. 5461 1451 - per --forENDF option as needed by ENDF LCT flag. 5461 1451 - H1 distribution for MT=103: H1 + I136 [inclusive]. 5461 1451 - H2 distribution for MT=104: H2 + I135 [inclusive]. 5461 1451 - H3 distribution for MT=105: H3 + I134 [inclusive]. 5461 1451 - He4 distribution for MT=107: He4 + Te133 [inclusive]. 5461 1451 - photon distribution for MT=102: Xe137 + photon. 5461 1451 - 5461 1451 - 5461 1451 - ============================================================== 5461 1451 - File produced by WPEC Subgroup 23 in 2004-2005 5461 1451 - - WPEC: NEA Working Party on Evaluation Cooperation 5461 1451 - - SG23: International library of fission product evaluations 5461 1451 - 5461 1451 - 5461 1451 - File obtained by merging: &&5461 1451 - - Resolved Resonances (MLBW) <490 keV : Ref.1 &&5461 1451 - - Fast neutron region >490 keV : CENDL 3 &&5461 1451 - V.G. Pronyaev, 23 June 2005: Negative resonance with the &&5461 1451 - parameters from CENDL-3 was added. Background capture cross &&5461 1451 - section was added to get get consistency with H. Beer &&5461 1451 - (X4=22253) at kT=25 keV and and B. Leist(X4=21991) at kT=30 keV&&5461 1451 - experimental data &&5461 1451 - Calculated thermal cross sections & resonance integrals: &&5461 1451 - --------------------------------------------- &&5461 1451 - Reaction Cross section Res. integral &&5461 1451 - (barn) (barn) &&5461 1451 - Total 8.4752E+00 - &&5461 1451 - Elastic 8.2145E+00 - &&5461 1451 - Capture 2.6065E-01 1.40E-01 &&5461 1451 - --------------------------------------------- &&5461 1451 - 5461 1451 - Reference: 5461 1451 - 1) S.F.Mughabghab: Atlas of Neutron Resonances, to be 5461 1451 - published by Elsevier, 2006 (5-th edition of BNL-325) 5461 1451 - ============================================================== 5461 1451 - 5461 1451 - 1997-2000.6 5461 1451 - Evaluated by Yu Baosheng (CIAE) 5461 1451 - Calculted by Shen Qingbiao (CIAE) AND 5461 1451 - Zhang Zhengjun( Northwest University, Xi'an) 5461 1451 - Completed by Yu Baosheng (CIAE) 5461 1451 -***************************************************************** 5461 1451 - MF=1 GENERAL INFORMATION 5461 1451 - MT=451 COMMENTS AND DICTIONARY 5461 1451 - 5461 1451 - **************************************************************** 5461 1451 - 5461 1451 -MF = 2 RESONANCE PARAMETERS TAKEN FROM JENDL-3.2 5461 1451 - MT=151 RESOLVED AND UNRESOLVED RESONANCE PARAMETERS 5461 1451 - RESOLVED RESONANCE REGION (MLBW FORMULA) : BELOW 490 KEV 5461 1451 - 5461 1451 - NO UNRESOLVED RESONANCE PARAMETERS 5461 1451 - 5461 1451 - 5461 1451 - CALCULATED 2200-M/S CROSS SECTIONS AND RES. INTEGRALS (BARNS) 5461 1451 - 2200 M/S RES. INTEG. 5461 1451 - TOTAL 6.348 - 5461 1451 - ELASTIC 6.088 - 5461 1451 - CAPTURE 0.260 0.1424 5461 1451 - 5461 1451 - *****************************************************************5461 1451 - ENERGY REGION 0.01 TO 20 MEV 5461 1451 - 5461 1451 - **********MF=3 SMOOTH CROSS SECTIONS*****************************5461 1451 - MF=3 NEUTRON CROSS SECTION 5461 1451 - 5461 1451 - MT=1 TOTAL CROSS SECTION 5461 1451 - EVALUATION WAS DONE IN THIS WORK BASED ON THE EXPERIMENTAL 5461 1451 - DATA OF REF./1/. 5461 1451 - 5461 1451 - MT=2 ELASTIC SCATTERING CROSS SECTION 5461 1451 - 0.1 TO 20 MEV, BASED ON SUBTRACTION OF MT=4,16,17,22,28,102,5461 1451 - 103,104,105 AND 107 FROM MT=1. 5461 1451 - 5461 1451 - MT=4 SUM of MT=51-91 5461 1451 - 5461 1451 - MT = 4, 51-66, 91 INELASTIC SCATTERING 5461 1451 - THE STATISTICAL MODEL CALCULATION WAS ADOPTED USING SUNF/2/ 5461 1451 - CODE, ADDING DIRECT REACTION USING DWUCK CODE. THE LEVEL 5461 1451 - SCHEME WAS TAKEN FROM CHINA NUCLEAR PARAMETER LIBRARY. 5461 1451 - THRESHOLD TO 20 MEV. 5461 1451 - 5461 1451 - MT = 16 (N,2N) CROSS SECTION 5461 1451 - MT = 17 (N,3N) CROSS SECTION 5461 1451 - MT = 22 (N,N'A) CROSS SECTION 5461 1451 - MT = 28 (N,N'P) CROSS SECTION 5461 1451 - MT =103 (N,P) CROSS SECTION 5461 1451 - MT =104 (N,D) CROSS SECTION 5461 1451 - MT =105 (N,T) CROSS SECTION 5461 1451 - MT =107 (N,ALPHA) CROSS SECTION 5461 1451 - 5461 1451 - THE (N,2N) CROSS SECTION WAS NORMALIZED TO THE EVALUATED VALUE 5461 1451 - FOR EXPERIMENTAL DATA AT 14.6 MEV. THE EXPERIMENTAL DATA FOR 5461 1451 - 136-XE(N,2N) REACTION WAS EVALUATED BY YU BAOSHEN/3/ BASED ON 5461 1451 - EXPERIMENTAL DATA. THE EVALUATED VALUE IS 1710+(-)105 MB AT 5461 1451 - 14.6 MEV. 5461 1451 - 5461 1451 - THESE REACTIONS WERE CALCULATED BY SHEN QINGBIAO ET AL/4/ WITH 5461 1451 - SUNF/2/. 5461 1451 - 5461 1451 - **********MF=4 NEUTRON ANGULAR DISTRIBUTIONS******************** 5461 1451 - 5461 1451 - MT=2 ELASTIC SCATTERING ANGULAR DISTRIBUTIION BASED ON OPTICAL 5461 1451 - MODEL CALCULATIONS, WITH A COMPOUND ELASTIC COMPONENT 5461 1451 - FROM SUNF CODE. 5461 1451 - 5461 1451 - MT=51~66,91 THRESHOLD TO 20.0 MeV 5461 1451 - MT=16,17,22,28 ANISOTROPIC IN THE LABORATORY SYSTEM 5461 1451 - 5461 1451 - 5461 1451 -*********MF = 5 ENERGY DISTRIBUTIONS OF SECONDARY NEUTRONS ******5461 1451 - ENERGY DISTRIBUTIONS OF SECONDARY NEUTRONS WERE CALCULATED WITH 5461 1451 - SUNF/2/ FOR INELASTIC SCATTERING TO OVERLAPPING LEVELS (MT=91) 5461 1451 - AND FOR OTHER NEUTRON EMITTING REACTIONS (MT=16,17,22,28) 5461 1451 - 5461 1451 - ******************References************************************ 5461 1451 - 1) F.J.VAUGHN ET AL., PHIS.REV.,118,683(1960) 5461 1451 - 2) ZHANG JINGSHANG INTER REPORT ON FUNF CODE(1998) 5461 1451 - 3) YU BAOSHENG INTER REPORT (2000) 5461 1451 - 4) SHEN QINGBIAO ET AL., PRIVATE COMMUNICATION(2000,3) 5461 1451 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 5461 1451 - 5461 1451 - 1 451 208 05461 1451 - 2 151 43 05461 1451 - 3 1 27 05461 1451 - 3 2 27 05461 1451 - 3 4 24 05461 1451 - 3 16 14 05461 1451 - 3 17 7 05461 1451 - 3 22 9 05461 1451 - 3 28 9 05461 1451 - 3 51 24 05461 1451 - 3 52 23 05461 1451 - 3 53 23 05461 1451 - 3 54 23 05461 1451 - 3 55 22 05461 1451 - 3 56 22 05461 1451 - 3 57 22 05461 1451 - 3 58 21 05461 1451 - 3 59 21 05461 1451 - 3 60 21 05461 1451 - 3 61 20 05461 1451 - 3 62 20 05461 1451 - 3 63 20 05461 1451 - 3 64 19 05461 1451 - 3 65 19 05461 1451 - 3 66 19 05461 1451 - 3 91 19 05461 1451 - 3 102 27 05461 1451 - 3 103 13 05461 1451 - 3 104 10 05461 1451 - 3 105 9 05461 1451 - 3 107 15 05461 1451 - 4 2 334 05461 1451 - 4 16 46 05461 1451 - 4 17 24 05461 1451 - 4 51 218 05461 1451 - 4 52 88 05461 1451 - 4 53 86 05461 1451 - 4 54 201 05461 1451 - 4 55 82 05461 1451 - 4 56 191 05461 1451 - 4 57 181 05461 1451 - 4 58 76 05461 1451 - 4 59 74 05461 1451 - 4 60 72 05461 1451 - 4 61 70 05461 1451 - 4 62 68 05461 1451 - 4 63 66 05461 1451 - 4 64 64 05461 1451 - 4 65 62 05461 1451 - 4 66 60 05461 1451 - 4 91 60 05461 1451 - 5 16 209 05461 1451 - 5 17 99 05461 1451 - 5 91 278 05461 1451 - 6 22 261 05461 1451 - 6 28 197 05461 1451 - 6 103 156 05461 1451 - 6 104 108 05461 1451 - 6 105 86 05461 1451 - 6 107 270 05461 1451 - 12 102 226 05461 1451 - 14 102 1 05461 1451 - 15 102 674 05461 1451 - 0.000000+0 0.000000+0 0 0 0 05461 1 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 1 - 0.000000+0 0.000000+0 0 0 3 725461 3 1 - 2 2 4 5 72 25461 3 1 - 1.000000-5 6.600000-4 4.900000+5 6.600000-4 4.900000+5 6.028620+05461 3 1 - 5.000000+5 6.042840+0 6.000000+5 6.552700+0 7.000000+5 6.670500+05461 3 1 - 8.000000+5 6.761000+0 1.000000+6 6.858600+0 1.250000+6 6.837100+05461 3 1 - 1.322700+6 6.805500+0 1.400000+6 6.761500+0 1.550000+6 6.650900+05461 3 1 - 1.707000+6 6.508400+0 1.905700+6 6.305100+0 2.141500+6 6.053300+05461 3 1 - 2.278300+6 5.910500+0 2.306500+6 5.881700+0 2.432700+6 5.756900+05461 3 1 - 2.483300+6 5.708800+0 2.578900+6 5.621400+0 2.627900+6 5.578400+05461 3 1 - 2.653800+6 5.556200+0 2.870400+6 5.384700+0 2.890300+6 5.370200+05461 3 1 - 3.001200+6 5.293100+0 3.235700+6 5.149600+0 3.299500+6 5.114700+05461 3 1 - 3.500000+6 5.015200+0 3.659000+6 4.945800+0 4.000000+6 4.819900+05461 3 1 - 4.500000+6 4.680300+0 5.000000+6 4.584900+0 5.500000+6 4.528800+05461 3 1 - 6.000000+6 4.508100+0 6.141900+6 4.508000+0 6.500000+6 4.517700+05461 3 1 - 7.000000+6 4.551200+0 7.500000+6 4.601300+0 7.729400+6 4.627900+05461 3 1 - 8.054100+6 4.667300+0 8.250000+6 4.691600+0 8.500000+6 4.722400+05461 3 1 - 8.750000+6 4.752300+0 9.000000+6 4.780800+0 9.250000+6 4.807400+05461 3 1 - 9.387100+6 4.821100+0 9.500000+6 4.831800+0 9.750000+6 4.853700+05461 3 1 - 9.970400+6 4.870800+0 1.025000+7 4.889400+0 1.050000+7 4.903100+05461 3 1 - 1.075000+7 4.913900+0 1.100000+7 4.922000+0 1.150000+7 4.930500+05461 3 1 - 1.200000+7 4.929800+0 1.250000+7 4.921300+0 1.300000+7 4.906700+05461 3 1 - 1.350000+7 4.887600+0 1.400000+7 4.865300+0 1.450000+7 4.841000+05461 3 1 - 1.455400+7 4.838300+0 1.500000+7 4.815300+0 1.550000+7 4.788800+05461 3 1 - 1.600000+7 4.761500+0 1.650000+7 4.733500+0 1.700000+7 4.704300+05461 3 1 - 1.750000+7 4.673800+0 1.800000+7 4.641500+0 1.850000+7 4.607500+05461 3 1 - 1.900000+7 4.571700+0 1.950000+7 4.534700+0 2.000000+7 4.496800+05461 3 1 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 2 - 0.000000+0 0.000000+0 0 0 3 725461 3 2 - 3 2 4 5 72 25461 3 2 - 1.000000-5 0.000000+0 4.900000+5 0.000000+0 4.900000+5 6.028210+05461 3 2 - 5.000000+5 6.042130+0 6.000000+5 6.551950+0 7.000000+5 6.669690+05461 3 2 - 8.000000+5 6.760130+0 1.000000+6 6.857580+0 1.250000+6 6.835810+05461 3 2 - 1.322700+6 6.804120+0 1.400000+6 6.443680+0 1.550000+6 6.126740+05461 3 2 - 1.707000+6 5.858150+0 1.905700+6 5.436870+0 2.141500+6 5.010650+05461 3 2 - 2.278300+6 4.712770+0 2.306500+6 4.659530+0 2.432700+6 4.371940+05461 3 2 - 2.483300+6 4.249750+0 2.578900+6 4.052610+0 2.627900+6 3.958480+05461 3 2 - 2.653800+6 3.909090+0 2.870400+6 3.534830+0 2.890300+6 3.500380+05461 3 2 - 3.001200+6 3.326580+0 3.235700+6 3.027810+0 3.299500+6 2.956230+05461 3 2 - 3.500000+6 2.736480+0 3.659000+6 2.585280+0 4.000000+6 2.327270+05461 3 2 - 4.500000+6 2.101560+0 5.000000+6 2.003540+0 5.500000+6 1.979450+05461 3 2 - 6.000000+6 1.994920+0 6.141900+6 2.004570+0 6.500000+6 2.035810+05461 3 2 - 7.000000+6 2.091290+0 7.500000+6 2.154650+0 7.729400+6 2.185010+05461 3 2 - 8.054100+6 2.228220+0 8.250000+6 2.252960+0 8.500000+6 2.280830+05461 3 2 - 8.750000+6 2.305170+0 9.000000+6 2.324780+0 9.250000+6 2.343960+05461 3 2 - 9.387100+6 2.351350+0 9.500000+6 2.358790+0 9.750000+6 2.374670+05461 3 2 - 9.970400+6 2.384650+0 1.025000+7 2.399630+0 1.050000+7 2.412590+05461 3 2 - 1.075000+7 2.424680+0 1.100000+7 2.435880+0 1.150000+7 2.451600+05461 3 2 - 1.200000+7 2.465840+0 1.250000+7 2.476170+0 1.300000+7 2.482560+05461 3 2 - 1.350000+7 2.485570+0 1.400000+7 2.485740+0 1.450000+7 2.483680+05461 3 2 - 1.455400+7 2.483350+0 1.500000+7 2.479600+0 1.550000+7 2.474700+05461 3 2 - 1.600000+7 2.469840+0 1.650000+7 2.465980+0 1.700000+7 2.463630+05461 3 2 - 1.750000+7 2.463310+0 1.800000+7 2.465370+0 1.850000+7 2.469820+05461 3 2 - 1.900000+7 2.476150+0 1.950000+7 2.484930+0 2.000000+7 2.494710+05461 3 2 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 4 - 0.000000+0-1.313000+6 0 0 1 635461 3 4 - 63 2 0 0 0 05461 3 4 - 1.322700+6 0.000000+0 1.400000+6 3.166900-1 1.550000+6 5.230400-15461 3 4 - 1.707000+6 6.490800-1 1.905700+6 8.676800-1 2.141500+6 1.042130+05461 3 4 - 2.278300+6 1.197240+0 2.306500+6 1.221680+0 2.432700+6 1.384510+05461 3 4 - 2.483300+6 1.458620+0 2.578900+6 1.568380+0 2.627900+6 1.619520+05461 3 4 - 2.653800+6 1.646710+0 2.870400+6 1.849510+0 2.890300+6 1.869460+05461 3 4 - 3.001200+6 1.966180+0 3.235700+6 2.121460+0 3.299500+6 2.158150+05461 3 4 - 3.500000+6 2.278420+0 3.659000+6 2.360240+0 4.000000+6 2.492410+05461 3 4 - 4.500000+6 2.578590+0 5.000000+6 2.581260+0 5.500000+6 2.549270+05461 3 4 - 6.000000+6 2.513110+0 6.141900+6 2.503360+0 6.500000+6 2.481820+05461 3 4 - 7.000000+6 2.459850+0 7.500000+6 2.446580+0 7.729400+6 2.442820+05461 3 4 - 8.054100+6 2.438990+0 8.250000+6 2.423030+0 8.500000+6 2.368790+05461 3 4 - 8.750000+6 2.285790+0 9.000000+6 2.164640+0 9.250000+6 2.051470+05461 3 4 - 9.387100+6 1.961470+0 9.500000+6 1.906130+0 9.750000+6 1.788710+05461 3 4 - 9.970400+6 1.656060+0 1.025000+7 1.531120+0 1.050000+7 1.434550+05461 3 4 - 1.075000+7 1.348030+0 1.100000+7 1.270450+0 1.150000+7 1.099500+05461 3 4 - 1.200000+7 9.813250-1 1.250000+7 8.869110-1 1.300000+7 8.092700-15461 3 4 - 1.350000+7 7.439070-1 1.400000+7 6.903160-1 1.450000+7 6.444540-15461 3 4 - 1.455400+7 6.398840-1 1.500000+7 6.020640-1 1.550000+7 5.643640-15461 3 4 - 1.600000+7 5.304380-1 1.650000+7 4.998740-1 1.700000+7 4.714840-15461 3 4 - 1.750000+7 4.447320-1 1.800000+7 4.193410-1 1.850000+7 3.956230-15461 3 4 - 1.900000+7 3.729850-1 1.950000+7 3.514230-1 2.000000+7 3.308720-15461 3 4 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 16 --7.994800+6-7.994800+6 0 0 1 335461 3 16 - 33 2 0 0 0 05461 3 16 - 8.054100+6 0.000000+0 8.250000+6 1.552230-2 8.500000+6 7.268340-25461 3 16 - 8.750000+6 1.612290-1 9.000000+6 2.912570-1 9.250000+6 4.118280-15461 3 16 - 9.387100+6 5.081250-1 9.500000+6 5.667230-1 9.750000+6 6.901320-15461 3 16 - 9.970400+6 8.298810-1 1.025000+7 9.583970-1 1.050000+7 1.055660+05461 3 16 - 1.075000+7 1.140830+0 1.100000+7 1.215240+0 1.150000+7 1.378750+05461 3 16 - 1.200000+7 1.481660+0 1.250000+7 1.556730+0 1.300000+7 1.612620+05461 3 16 - 1.350000+7 1.654810+0 1.400000+7 1.684510+0 1.450000+7 1.706320+05461 3 16 - 1.455400+7 1.708290+0 1.500000+7 1.724620+0 1.550000+7 1.735140+05461 3 16 - 1.600000+7 1.733930+0 1.650000+7 1.716730+0 1.700000+7 1.681000+05461 3 16 - 1.750000+7 1.624560+0 1.800000+7 1.545330+0 1.850000+7 1.449440+05461 3 16 - 1.900000+7 1.343680+0 1.950000+7 1.227850+0 2.000000+7 1.122530+05461 3 16 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 17 --1.444700+7-1.444700+7 0 0 1 125461 3 17 - 12 2 0 0 0 05461 3 17 - 1.455400+7 0.000000+0 1.500000+7 2.006500-4 1.550000+7 3.045000-35461 3 17 - 1.600000+7 1.250000-2 1.650000+7 3.238600-2 1.700000+7 6.538800-25461 3 17 - 1.750000+7 1.136200-1 1.800000+7 1.786100-1 1.850000+7 2.540700-15461 3 17 - 1.900000+7 3.342800-1 1.950000+7 4.196400-1 2.000000+7 4.915000-15461 3 17 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 22 --3.632100+6-3.632100+6 0 0 1 175461 3 22 - 17 2 0 0 0 05461 3 22 - 3.659000+6 0.000000+0 1.300000+7 0.000000+0 1.350000+7 1.754400-75461 3 22 - 1.400000+7 5.093800-7 1.450000+7 1.477200-6 1.455400+7 1.637000-65461 3 22 - 1.500000+7 3.745300-6 1.550000+7 9.016300-6 1.600000+7 2.037500-55461 3 22 - 1.650000+7 4.329200-5 1.700000+7 8.570900-5 1.750000+7 1.602900-45461 3 22 - 1.800000+7 2.866300-4 1.850000+7 4.791700-4 1.900000+7 7.539100-45461 3 22 - 1.950000+7 1.129400-3 2.000000+7 1.593600-3 5461 3 22 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 28 --9.897000+6-9.897000+6 0 0 1 185461 3 28 - 18 2 0 0 0 05461 3 28 - 9.970400+6 0.000000+0 1.250000+7 0.000000+0 1.300000+7 3.018600-75461 3 28 - 1.350000+7 2.516700-6 1.400000+7 1.337500-5 1.450000+7 5.078400-55461 3 28 - 1.455400+7 5.799500-5 1.500000+7 1.508600-4 1.550000+7 3.704100-45461 3 28 - 1.600000+7 7.770800-4 1.650000+7 1.440700-3 1.700000+7 2.410100-35461 3 28 - 1.750000+7 3.756600-3 1.800000+7 5.413600-3 1.850000+7 7.357500-35461 3 28 - 1.900000+7 9.546300-3 1.950000+7 1.192900-2 2.000000+7 1.444400-25461 3 28 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 51 - 0.000000+0-1.313000+6 0 0 1 635461 3 51 - 63 2 0 0 0 05461 3 51 - 1.322700+6 0.000000+0 1.400000+6 3.166900-1 1.550000+6 5.230400-15461 3 51 - 1.707000+6 6.490800-1 1.905700+6 7.113100-1 2.141500+6 7.880200-15461 3 51 - 2.278300+6 7.718200-1 2.306500+6 7.717400-1 2.432700+6 7.274200-15461 3 51 - 2.483300+6 6.996400-1 2.578900+6 6.629100-1 2.627900+6 6.451200-15461 3 51 - 2.653800+6 6.348400-1 2.870400+6 5.541100-1 2.890300+6 5.443900-15461 3 51 - 3.001200+6 4.995600-1 3.235700+6 4.289100-1 3.299500+6 4.115800-15461 3 51 - 3.500000+6 3.480600-1 3.659000+6 3.095500-1 4.000000+6 2.376400-15461 3 51 - 4.500000+6 1.648100-1 5.000000+6 1.227700-1 5.500000+6 9.834700-25461 3 51 - 6.000000+6 7.772600-2 6.141900+6 7.314600-2 6.500000+6 6.358400-25461 3 51 - 7.000000+6 5.346800-2 7.500000+6 4.615100-2 7.729400+6 4.331000-25461 3 51 - 8.054100+6 3.978900-2 8.250000+6 3.808200-2 8.500000+6 3.606300-25461 3 51 - 8.750000+6 3.419400-2 9.000000+6 3.244700-2 9.250000+6 3.109800-25461 3 51 - 9.387100+6 3.039800-2 9.500000+6 2.983600-2 9.750000+6 2.864400-25461 3 51 - 9.970400+6 2.764400-2 1.025000+7 2.663000-2 1.050000+7 2.579100-25461 3 51 - 1.075000+7 2.499100-2 1.100000+7 2.422400-2 1.150000+7 2.301200-25461 3 51 - 1.200000+7 2.189300-2 1.250000+7 2.095800-2 1.300000+7 2.008400-25461 3 51 - 1.350000+7 1.928700-2 1.400000+7 1.853300-2 1.450000+7 1.786800-25461 3 51 - 1.455400+7 1.779800-2 1.500000+7 1.723300-2 1.550000+7 1.662500-25461 3 51 - 1.600000+7 1.604000-2 1.650000+7 1.567300-2 1.700000+7 1.532200-25461 3 51 - 1.750000+7 1.498500-2 1.800000+7 1.465900-2 1.850000+7 1.447900-25461 3 51 - 1.900000+7 1.430500-2 1.950000+7 1.414100-2 2.000000+7 1.398100-25461 3 51 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 52 - 0.000000+0-1.694400+6 0 0 1 605461 3 52 - 60 2 0 0 0 05461 3 52 - 1.707000+6 0.000000+0 1.905700+6 1.563700-1 2.141500+6 2.463700-15461 3 52 - 2.278300+6 2.678700-1 2.306500+6 2.740600-1 2.432700+6 2.913700-15461 3 52 - 2.483300+6 2.948200-1 2.578900+6 2.916600-1 2.627900+6 2.868800-15461 3 52 - 2.653800+6 2.822500-1 2.870400+6 2.735000-1 2.890300+6 2.720000-15461 3 52 - 3.001200+6 2.655900-1 3.235700+6 2.540000-1 3.299500+6 2.508700-15461 3 52 - 3.500000+6 2.225000-1 3.659000+6 1.974900-1 4.000000+6 1.460600-15461 3 52 - 4.500000+6 9.081100-2 5.000000+6 5.845700-2 5.500000+6 4.094700-25461 3 52 - 6.000000+6 2.808000-2 6.141900+6 2.550200-2 6.500000+6 2.031000-25461 3 52 - 7.000000+6 1.536000-2 7.500000+6 1.208600-2 7.729400+6 1.095500-25461 3 52 - 8.054100+6 9.638600-3 8.250000+6 8.962900-3 8.500000+6 8.207700-35461 3 52 - 8.750000+6 7.557700-3 9.000000+6 6.990000-3 9.250000+6 6.487600-35461 3 52 - 9.387100+6 6.236800-3 9.500000+6 6.042000-3 9.750000+6 5.643800-35461 3 52 - 9.970400+6 5.324500-3 1.025000+7 4.957400-3 1.050000+7 4.657000-35461 3 52 - 1.075000+7 4.383800-3 1.100000+7 4.129900-3 1.150000+7 3.677400-35461 3 52 - 1.200000+7 3.285800-3 1.250000+7 2.943900-3 1.300000+7 2.644600-35461 3 52 - 1.350000+7 2.381600-3 1.400000+7 2.150500-3 1.450000+7 1.946500-35461 3 52 - 1.455400+7 1.925900-3 1.500000+7 1.766400-3 1.550000+7 1.606800-35461 3 52 - 1.600000+7 1.464700-3 1.650000+7 1.337300-3 1.700000+7 1.223300-35461 3 52 - 1.750000+7 1.120000-3 1.800000+7 1.026300-3 1.850000+7 9.399700-45461 3 52 - 1.900000+7 8.609100-4 1.950000+7 7.876000-4 2.000000+7 7.200600-45461 3 52 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 53 - 0.000000+0-1.891700+6 0 0 1 595461 3 53 - 59 2 0 0 0 05461 3 53 - 1.905700+6 0.000000+0 2.141500+6 7.735600-3 2.278300+6 1.546000-25461 3 53 - 2.306500+6 1.714100-2 2.432700+6 2.613200-2 2.483300+6 3.006800-25461 3 53 - 2.578900+6 3.465400-2 2.627900+6 3.606400-2 2.653800+6 3.621900-25461 3 53 - 2.870400+6 4.696700-2 2.890300+6 4.799500-2 3.001200+6 5.340300-25461 3 53 - 3.235700+6 6.306900-2 3.299500+6 6.529900-2 3.500000+6 6.530700-25461 3 53 - 3.659000+6 6.167900-2 4.000000+6 5.049900-2 4.500000+6 3.457900-25461 3 53 - 5.000000+6 2.324600-2 5.500000+6 1.619200-2 6.000000+6 1.129900-25461 3 53 - 6.141900+6 1.027000-2 6.500000+6 8.211300-3 7.000000+6 6.244700-35461 3 53 - 7.500000+6 4.977700-3 7.729400+6 4.551000-3 8.054100+6 4.069300-35461 3 53 - 8.250000+6 3.825700-3 8.500000+6 3.557800-3 8.750000+6 3.331000-35461 3 53 - 9.000000+6 3.134200-3 9.250000+6 2.961500-3 9.387100+6 2.875100-35461 3 53 - 9.500000+6 2.807900-3 9.750000+6 2.670200-3 9.970400+6 2.559200-35461 3 53 - 1.025000+7 2.428900-3 1.050000+7 2.321200-3 1.075000+7 2.220100-35461 3 53 - 1.100000+7 2.125500-3 1.150000+7 1.949300-3 1.200000+7 1.789400-35461 3 53 - 1.250000+7 1.643300-3 1.300000+7 1.510100-3 1.350000+7 1.388700-35461 3 53 - 1.400000+7 1.278600-3 1.450000+7 1.178600-3 1.455400+7 1.168300-35461 3 53 - 1.500000+7 1.088100-3 1.550000+7 1.005900-3 1.600000+7 9.312800-45461 3 53 - 1.650000+7 8.623900-4 1.700000+7 7.998400-4 1.750000+7 7.413500-45461 3 53 - 1.800000+7 6.875400-4 1.850000+7 6.363900-4 1.900000+7 5.890000-45461 3 53 - 1.950000+7 5.436500-4 2.000000+7 5.015800-4 5461 3 53 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 54 - 0.000000+0-2.125700+6 0 0 1 585461 3 54 - 58 2 0 0 0 05461 3 54 - 2.141500+6 0.000000+0 2.278300+6 1.420900-1 2.306500+6 1.582200-15461 3 54 - 2.432700+6 2.019200-1 2.483300+6 2.117700-1 2.578900+6 2.255000-15461 3 54 - 2.627900+6 2.304600-1 2.653800+6 2.319600-1 2.870400+6 2.480000-15461 3 54 - 2.890300+6 2.483200-1 3.001200+6 2.511200-1 3.235700+6 2.562700-15461 3 54 - 3.299500+6 2.567400-1 3.500000+6 2.409400-1 3.659000+6 2.193500-15461 3 54 - 4.000000+6 1.735200-1 4.500000+6 1.217100-1 5.000000+6 9.136800-25461 3 54 - 5.500000+6 7.440100-2 6.000000+6 6.489600-2 6.141900+6 6.242700-25461 3 54 - 6.500000+6 5.730200-2 7.000000+6 5.200800-2 7.500000+6 4.713700-25461 3 54 - 7.729400+6 4.517800-2 8.054100+6 4.265500-2 8.250000+6 4.136900-25461 3 54 - 8.500000+6 3.979900-2 8.750000+6 3.829800-2 9.000000+6 3.684700-25461 3 54 - 9.250000+6 3.580300-2 9.387100+6 3.524400-2 9.500000+6 3.479100-25461 3 54 - 9.750000+6 3.380700-2 9.970400+6 3.295800-2 1.025000+7 3.216600-25461 3 54 - 1.050000+7 3.150100-2 1.075000+7 3.084900-2 1.100000+7 3.020800-25461 3 54 - 1.150000+7 2.926000-2 1.200000+7 2.834000-2 1.250000+7 2.759100-25461 3 54 - 1.300000+7 2.685800-2 1.350000+7 2.618000-2 1.400000+7 2.551200-25461 3 54 - 1.450000+7 2.489700-2 1.455400+7 2.483100-2 1.500000+7 2.429000-25461 3 54 - 1.550000+7 2.369100-2 1.600000+7 2.309700-2 1.650000+7 2.276100-25461 3 54 - 1.700000+7 2.242900-2 1.750000+7 2.210100-2 1.800000+7 2.177600-25461 3 54 - 1.850000+7 2.166100-2 1.900000+7 2.154900-2 1.950000+7 2.143900-25461 3 54 - 2.000000+7 2.133000-2 5461 3 54 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 55 - 0.000000+0-2.261500+6 0 0 1 575461 3 55 - 57 2 0 0 0 05461 3 55 - 2.278300+6 0.000000+0 2.306500+6 5.211300-4 2.432700+6 2.998700-35461 3 55 - 2.483300+6 4.469100-3 2.578900+6 7.475300-3 2.627900+6 9.004400-35461 3 55 - 2.653800+6 9.685100-3 2.870400+6 1.900100-2 2.890300+6 1.998900-25461 3 55 - 3.001200+6 2.562700-2 3.235700+6 3.743200-2 3.299500+6 4.044500-25461 3 55 - 3.500000+6 4.478600-2 3.659000+6 4.440900-2 4.000000+6 3.848500-25461 3 55 - 4.500000+6 2.665400-2 5.000000+6 1.733100-2 5.500000+6 1.128800-25461 3 55 - 6.000000+6 7.529800-3 6.141900+6 6.735200-3 6.500000+6 5.124800-35461 3 55 - 7.000000+6 3.603100-3 7.500000+6 2.647300-3 7.729400+6 2.335600-35461 3 55 - 8.054100+6 1.992000-3 8.250000+6 1.824400-3 8.500000+6 1.646400-35461 3 55 - 8.750000+6 1.500100-3 9.000000+6 1.379100-3 9.250000+6 1.276600-35461 3 55 - 9.387100+6 1.227400-3 9.500000+6 1.190100-3 9.750000+6 1.115400-35461 3 55 - 9.970400+6 1.057700-3 1.025000+7 9.929200-4 1.050000+7 9.413400-45461 3 55 - 1.075000+7 8.948700-4 1.100000+7 8.523200-4 1.150000+7 7.764100-45461 3 55 - 1.200000+7 7.100900-4 1.250000+7 6.509500-4 1.300000+7 5.978400-45461 3 55 - 1.350000+7 5.498500-4 1.400000+7 5.065100-4 1.450000+7 4.671900-45461 3 55 - 1.455400+7 4.631600-4 1.500000+7 4.315900-4 1.550000+7 3.992600-45461 3 55 - 1.600000+7 3.698400-4 1.650000+7 3.427700-4 1.700000+7 3.178800-45461 3 55 - 1.750000+7 2.949800-4 1.800000+7 2.735600-4 1.850000+7 2.535900-45461 3 55 - 1.900000+7 2.347000-4 1.950000+7 2.170700-4 2.000000+7 2.002700-45461 3 55 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 56 - 0.000000+0-2.289500+6 0 0 1 565461 3 56 - 56 2 0 0 0 05461 3 56 - 2.306500+6 0.000000+0 2.432700+6 1.346700-1 2.483300+6 1.547700-15461 3 56 - 2.578900+6 1.825200-1 2.627900+6 1.927500-1 2.653800+6 1.972300-15461 3 56 - 2.870400+6 2.167300-1 2.890300+6 2.166600-1 3.001200+6 2.170600-15461 3 56 - 3.235700+6 2.185300-1 3.299500+6 2.175700-1 3.500000+6 2.025700-15461 3 56 - 3.659000+6 1.821700-1 4.000000+6 1.394800-1 4.500000+6 9.176600-25461 3 56 - 5.000000+6 6.398700-2 5.500000+6 4.897600-2 6.000000+6 4.101800-25461 3 56 - 6.141900+6 3.916200-2 6.500000+6 3.541100-2 7.000000+6 3.172400-25461 3 56 - 7.500000+6 2.853500-2 7.729400+6 2.729600-2 8.054100+6 2.572900-25461 3 56 - 8.250000+6 2.492000-2 8.500000+6 2.394600-2 8.750000+6 2.302400-25461 3 56 - 9.000000+6 2.214200-2 9.250000+6 2.150000-2 9.387100+6 2.116000-25461 3 56 - 9.500000+6 2.088400-2 9.750000+6 2.028800-2 9.970400+6 1.977600-25461 3 56 - 1.025000+7 1.929800-2 1.050000+7 1.889900-2 1.075000+7 1.850900-25461 3 56 - 1.100000+7 1.812700-2 1.150000+7 1.757400-2 1.200000+7 1.704000-25461 3 56 - 1.250000+7 1.660400-2 1.300000+7 1.618000-2 1.350000+7 1.578800-25461 3 56 - 1.400000+7 1.540400-2 1.450000+7 1.504300-2 1.455400+7 1.500400-25461 3 56 - 1.500000+7 1.468700-2 1.550000+7 1.433500-2 1.600000+7 1.398700-25461 3 56 - 1.650000+7 1.378600-2 1.700000+7 1.358800-2 1.750000+7 1.339200-25461 3 56 - 1.800000+7 1.319900-2 1.850000+7 1.313400-2 1.900000+7 1.307000-25461 3 56 - 1.950000+7 1.300800-2 2.000000+7 1.294700-2 5461 3 56 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 57 - 0.000000+0-2.414800+6 0 0 1 555461 3 57 - 55 2 0 0 0 05461 3 57 - 2.432700+6 0.000000+0 2.483300+6 6.308000-2 2.578900+6 1.165000-15461 3 57 - 2.627900+6 1.343700-1 2.653800+6 1.420700-1 2.870400+6 1.751600-15461 3 57 - 2.890300+6 1.759800-1 3.001200+6 1.803200-1 3.235700+6 1.883800-15461 3 57 - 3.299500+6 1.892700-1 3.500000+6 1.806700-1 3.659000+6 1.647500-15461 3 57 - 4.000000+6 1.287200-1 4.500000+6 8.559100-2 5.000000+6 5.959900-25461 3 57 - 5.500000+6 4.546800-2 6.000000+6 3.830500-2 6.141900+6 3.663900-25461 3 57 - 6.500000+6 3.330700-2 7.000000+6 3.008600-2 7.500000+6 2.721200-25461 3 57 - 7.729400+6 2.610000-2 8.054100+6 2.469400-2 8.250000+6 2.394600-25461 3 57 - 8.500000+6 2.304700-2 8.750000+6 2.219300-2 9.000000+6 2.137600-25461 3 57 - 9.250000+6 2.078100-2 9.387100+6 2.046500-2 9.500000+6 2.020900-25461 3 57 - 9.750000+6 1.965400-2 9.970400+6 1.917700-2 1.025000+7 1.873900-25461 3 57 - 1.050000+7 1.837300-2 1.075000+7 1.801500-2 1.100000+7 1.766300-25461 3 57 - 1.150000+7 1.715400-2 1.200000+7 1.665900-2 1.250000+7 1.626100-25461 3 57 - 1.300000+7 1.587100-2 1.350000+7 1.550700-2 1.400000+7 1.514900-25461 3 57 - 1.450000+7 1.481300-2 1.455400+7 1.477700-2 1.500000+7 1.448000-25461 3 57 - 1.550000+7 1.415100-2 1.600000+7 1.382400-2 1.650000+7 1.363200-25461 3 57 - 1.700000+7 1.344100-2 1.750000+7 1.325300-2 1.800000+7 1.306600-25461 3 57 - 1.850000+7 1.301200-2 1.900000+7 1.296000-2 1.950000+7 1.290800-25461 3 57 - 2.000000+7 1.285700-2 5461 3 57 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 58 - 0.000000+0-2.465000+6 0 0 1 545461 3 58 - 54 2 0 0 0 05461 3 58 - 2.483300+6 0.000000+0 2.578900+6 4.716300-2 2.627900+6 5.749700-25461 3 58 - 2.653800+6 6.107900-2 2.870400+6 8.763900-2 2.890300+6 8.960700-25461 3 58 - 3.001200+6 9.969600-2 3.235700+6 1.188400-1 3.299500+6 1.235200-15461 3 58 - 3.500000+6 1.248200-1 3.659000+6 1.172200-1 4.000000+6 9.239500-25461 3 58 - 4.500000+6 5.638600-2 5.000000+6 3.228300-2 5.500000+6 1.864500-25461 3 58 - 6.000000+6 1.137300-2 6.141900+6 9.942600-3 6.500000+6 7.163100-35461 3 58 - 7.000000+6 4.671900-3 7.500000+6 3.183600-3 7.729400+6 2.711800-35461 3 58 - 8.054100+6 2.203900-3 8.250000+6 1.960200-3 8.500000+6 1.705900-35461 3 58 - 8.750000+6 1.500200-3 9.000000+6 1.333000-3 9.250000+6 1.194300-35461 3 58 - 9.387100+6 1.128700-3 9.500000+6 1.079300-3 9.750000+6 9.823100-45461 3 58 - 9.970400+6 9.091000-4 1.025000+7 8.289400-4 1.050000+7 7.672800-45461 3 58 - 1.075000+7 7.131100-4 1.100000+7 6.653500-4 1.150000+7 5.839200-45461 3 58 - 1.200000+7 5.171000-4 1.250000+7 4.608800-4 1.300000+7 4.128800-45461 3 58 - 1.350000+7 3.713700-4 1.400000+7 3.352400-4 1.450000+7 3.034900-45461 3 58 - 1.455400+7 3.003200-4 1.500000+7 2.755300-4 1.550000+7 2.507700-45461 3 58 - 1.600000+7 2.287600-4 1.650000+7 2.090000-4 1.700000+7 1.912100-45461 3 58 - 1.750000+7 1.752500-4 1.800000+7 1.606600-4 1.850000+7 1.473900-45461 3 58 - 1.900000+7 1.351100-4 1.950000+7 1.238900-4 2.000000+7 1.134100-45461 3 58 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 59 - 0.000000+0-2.559900+6 0 0 1 535461 3 59 - 53 2 0 0 0 05461 3 59 - 2.578900+6 0.000000+0 2.627900+6 2.737300-2 2.653800+6 3.410600-25461 3 59 - 2.870400+6 6.968200-2 2.890300+6 7.191900-2 3.001200+6 8.287700-25461 3 59 - 3.235700+6 1.030200-1 3.299500+6 1.080700-1 3.500000+6 1.120000-15461 3 59 - 3.659000+6 1.068800-1 4.000000+6 8.637900-2 4.500000+6 5.361600-25461 3 59 - 5.000000+6 3.072700-2 5.500000+6 1.759200-2 6.000000+6 1.066000-25461 3 59 - 6.141900+6 9.298400-3 6.500000+6 6.649100-3 7.000000+6 4.276400-35461 3 59 - 7.500000+6 2.864800-3 7.729400+6 2.420900-3 8.054100+6 1.942900-35461 3 59 - 8.250000+6 1.715900-3 8.500000+6 1.479300-3 8.750000+6 1.290000-35461 3 59 - 9.000000+6 1.136900-3 9.250000+6 1.011200-3 9.387100+6 9.519800-45461 3 59 - 9.500000+6 9.076300-4 9.750000+6 8.211800-4 9.970400+6 7.564000-45461 3 59 - 1.025000+7 6.861900-4 1.050000+7 6.325900-4 1.075000+7 5.860100-45461 3 59 - 1.100000+7 5.451300-4 1.150000+7 4.763100-4 1.200000+7 4.205300-45461 3 59 - 1.250000+7 3.740500-4 1.300000+7 3.346600-4 1.350000+7 3.007600-45461 3 59 - 1.400000+7 2.713700-4 1.450000+7 2.456000-4 1.455400+7 2.430200-45461 3 59 - 1.500000+7 2.229400-4 1.550000+7 2.028900-4 1.600000+7 1.850700-45461 3 59 - 1.650000+7 1.690900-4 1.700000+7 1.547100-4 1.750000+7 1.417800-45461 3 59 - 1.800000+7 1.300100-4 1.850000+7 1.192500-4 1.900000+7 1.093500-45461 3 59 - 1.950000+7 1.002700-4 2.000000+7 9.182900-5 5461 3 59 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 60 - 0.000000+0-2.608500+6 0 0 1 525461 3 60 - 52 2 0 0 0 05461 3 60 - 2.627900+6 0.000000+0 2.653800+6 1.727500-2 2.870400+6 6.062000-25461 3 60 - 2.890300+6 6.306700-2 3.001200+6 7.469200-2 3.235700+6 9.525900-25461 3 60 - 3.299500+6 1.004300-1 3.500000+6 1.055000-1 3.659000+6 1.015800-15461 3 60 - 4.000000+6 8.327000-2 4.500000+6 5.222800-2 5.000000+6 2.998300-25461 3 60 - 5.500000+6 1.710700-2 6.000000+6 1.033900-2 6.141900+6 9.009200-35461 3 60 - 6.500000+6 6.422200-3 7.000000+6 4.104700-3 7.500000+6 2.727800-35461 3 60 - 7.729400+6 2.296200-3 8.054100+6 1.831200-3 8.250000+6 1.611500-35461 3 60 - 8.500000+6 1.382700-3 8.750000+6 1.200400-3 9.000000+6 1.053300-35461 3 60 - 9.250000+6 9.331600-4 9.387100+6 8.767400-4 9.500000+6 8.345500-45461 3 60 - 9.750000+6 7.526100-4 9.970400+6 6.914200-4 1.025000+7 6.254500-45461 3 60 - 1.050000+7 5.752900-4 1.075000+7 5.319400-4 1.100000+7 4.939900-45461 3 60 - 1.150000+7 4.305300-4 1.200000+7 3.794400-4 1.250000+7 3.371000-45461 3 60 - 1.300000+7 3.013600-4 1.350000+7 2.707000-4 1.400000+7 2.441600-45461 3 60 - 1.450000+7 2.209300-4 1.455400+7 2.186100-4 1.500000+7 2.005300-45461 3 60 - 1.550000+7 1.824800-4 1.600000+7 1.664500-4 1.650000+7 1.520700-45461 3 60 - 1.700000+7 1.391500-4 1.750000+7 1.275100-4 1.800000+7 1.169300-45461 3 60 - 1.850000+7 1.072500-4 1.900000+7 9.836700-5 1.950000+7 9.018900-55461 3 60 - 2.000000+7 8.261900-5 5461 3 60 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 61 - 0.000000+0-2.634200+6 0 0 1 515461 3 61 - 51 2 0 0 0 05461 3 61 - 2.653800+6 0.000000+0 2.870400+6 9.809800-2 2.890300+6 1.010100-15461 3 61 - 3.001200+6 1.128800-1 3.235700+6 1.277600-1 3.299500+6 1.303000-15461 3 61 - 3.500000+6 1.284400-1 3.659000+6 1.184900-1 4.000000+6 9.108500-25461 3 61 - 4.500000+6 5.363900-2 5.000000+6 2.933600-2 5.500000+6 1.607600-25461 3 61 - 6.000000+6 9.439800-3 6.141900+6 8.165300-3 6.500000+6 5.721000-35461 3 61 - 7.000000+6 3.578900-3 7.500000+6 2.333400-3 7.729400+6 1.948200-35461 3 61 - 8.054100+6 1.536100-3 8.250000+6 1.342900-3 8.500000+6 1.142300-35461 3 61 - 8.750000+6 9.833700-4 9.000000+6 8.554200-4 9.250000+6 7.513400-45461 3 61 - 9.387100+6 7.025200-4 9.500000+6 6.660800-4 9.750000+6 5.954900-45461 3 61 - 9.970400+6 5.428700-4 1.025000+7 4.863700-4 1.050000+7 4.435400-45461 3 61 - 1.075000+7 4.067300-4 1.100000+7 3.746400-4 1.150000+7 3.215000-45461 3 61 - 1.200000+7 2.793300-4 1.250000+7 2.449200-4 1.300000+7 2.163400-45461 3 61 - 1.350000+7 1.921800-4 1.400000+7 1.715700-4 1.450000+7 1.537600-45461 3 61 - 1.455400+7 1.519900-4 1.500000+7 1.383000-4 1.550000+7 1.247800-45461 3 61 - 1.600000+7 1.129000-4 1.650000+7 1.023600-4 1.700000+7 9.299200-55461 3 61 - 1.750000+7 8.464700-5 1.800000+7 7.716300-5 1.850000+7 7.038800-55461 3 61 - 1.900000+7 6.424300-5 1.950000+7 5.864000-5 2.000000+7 5.351200-55461 3 61 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 62 - 0.000000+0-2.849300+6 0 0 1 505461 3 62 - 50 2 0 0 0 05461 3 62 - 2.870400+6 0.000000+0 2.890300+6 1.852100-2 3.001200+6 5.479300-25461 3 62 - 3.235700+6 8.616100-2 3.299500+6 9.078900-2 3.500000+6 9.592300-25461 3 62 - 3.659000+6 9.215000-2 4.000000+6 7.587400-2 4.500000+6 4.736500-25461 3 62 - 5.000000+6 2.631900-2 5.500000+6 1.425500-2 6.000000+6 8.297200-35461 3 62 - 6.141900+6 7.153300-3 6.500000+6 4.959400-3 7.000000+6 3.037600-35461 3 62 - 7.500000+6 1.922800-3 7.729400+6 1.579400-3 8.054100+6 1.216500-35461 3 62 - 8.250000+6 1.047500-3 8.500000+6 8.745600-4 8.750000+6 7.386200-45461 3 62 - 9.000000+6 6.311800-4 9.250000+6 5.448300-4 9.387100+6 5.050200-45461 3 62 - 9.500000+6 4.754500-4 9.750000+6 4.188200-4 9.970400+6 3.774000-45461 3 62 - 1.025000+7 3.336000-4 1.050000+7 3.010800-4 1.075000+7 2.735300-45461 3 62 - 1.100000+7 2.499800-4 1.150000+7 2.118000-4 1.200000+7 1.823200-45461 3 62 - 1.250000+7 1.588100-4 1.300000+7 1.396400-4 1.350000+7 1.236600-45461 3 62 - 1.400000+7 1.101600-4 1.450000+7 9.858700-5 1.455400+7 9.742900-55461 3 62 - 1.500000+7 8.859000-5 1.550000+7 7.987700-5 1.600000+7 7.224100-55461 3 62 - 1.650000+7 6.547900-5 1.700000+7 5.948800-5 1.750000+7 5.412200-55461 3 62 - 1.800000+7 4.935600-5 1.850000+7 4.500600-5 1.900000+7 4.110200-55461 3 62 - 1.950000+7 3.750700-5 2.000000+7 3.425900-5 5461 3 62 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 63 - 0.000000+0-2.869000+6 0 0 1 495461 3 63 - 49 2 0 0 0 05461 3 63 - 2.890300+6 0.000000+0 3.001200+6 4.856000-2 3.235700+6 8.245800-25461 3 63 - 3.299500+6 8.732900-2 3.500000+6 9.307500-2 3.659000+6 8.979600-25461 3 63 - 4.000000+6 7.446300-2 4.500000+6 4.679100-2 5.000000+6 2.606200-25461 3 63 - 5.500000+6 1.411000-2 6.000000+6 8.208800-3 6.141900+6 7.075500-35461 3 63 - 6.500000+6 4.902200-3 7.000000+6 2.998400-3 7.500000+6 1.893700-35461 3 63 - 7.729400+6 1.553500-3 8.054100+6 1.194200-3 8.250000+6 1.027000-35461 3 63 - 8.500000+6 8.560300-4 8.750000+6 7.217200-4 9.000000+6 6.157200-45461 3 63 - 9.250000+6 5.306100-4 9.387100+6 4.914100-4 9.500000+6 4.623400-45461 3 63 - 9.750000+6 4.066800-4 9.970400+6 3.660400-4 1.025000+7 3.231100-45461 3 63 - 1.050000+7 2.913100-4 1.075000+7 2.643900-4 1.100000+7 2.414300-45461 3 63 - 1.150000+7 2.042800-4 1.200000+7 1.756700-4 1.250000+7 1.529100-45461 3 63 - 1.300000+7 1.343800-4 1.350000+7 1.189600-4 1.400000+7 1.059500-45461 3 63 - 1.450000+7 9.479900-5 1.455400+7 9.368400-5 1.500000+7 8.517600-55461 3 63 - 1.550000+7 7.679300-5 1.600000+7 6.944800-5 1.650000+7 6.294500-55461 3 63 - 1.700000+7 5.718600-5 1.750000+7 5.202400-5 1.800000+7 4.744400-55461 3 63 - 1.850000+7 4.326100-5 1.900000+7 3.950900-5 1.950000+7 3.605400-55461 3 63 - 2.000000+7 3.293100-5 5461 3 63 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 64 - 0.000000+0-2.979100+6 0 0 1 485461 3 64 - 48 2 0 0 0 05461 3 64 - 3.001200+6 0.000000+0 3.235700+6 6.136900-2 3.299500+6 6.807900-25461 3 64 - 3.500000+6 7.762800-2 3.659000+6 7.694800-2 4.000000+6 6.656600-25461 3 64 - 4.500000+6 4.356300-2 5.000000+6 2.466300-2 5.500000+6 1.334900-25461 3 64 - 6.000000+6 7.751200-3 6.141900+6 6.674700-3 6.500000+6 4.611100-35461 3 64 - 7.000000+6 2.801600-3 7.500000+6 1.750100-3 7.729400+6 1.426400-35461 3 64 - 8.054100+6 1.085500-3 8.250000+6 9.270300-4 8.500000+6 7.658000-45461 3 64 - 8.750000+6 6.397000-4 9.000000+6 5.407300-4 9.250000+6 4.617700-45461 3 64 - 9.387100+6 4.255500-4 9.500000+6 3.988600-4 9.750000+6 3.479700-45461 3 64 - 9.970400+6 3.110600-4 1.025000+7 2.724300-4 1.050000+7 2.440600-45461 3 64 - 1.075000+7 2.202500-4 1.100000+7 2.001100-4 1.150000+7 1.679300-45461 3 64 - 1.200000+7 1.435200-4 1.250000+7 1.243600-4 1.300000+7 1.089400-45461 3 64 - 1.350000+7 9.621600-5 1.400000+7 8.555800-5 1.450000+7 7.647200-55461 3 64 - 1.455400+7 7.557900-5 1.500000+7 6.866000-5 1.550000+7 6.187200-55461 3 64 - 1.600000+7 5.593500-5 1.650000+7 5.068600-5 1.700000+7 4.604100-55461 3 64 - 1.750000+7 4.188500-5 1.800000+7 3.818800-5 1.850000+7 3.482800-55461 3 64 - 1.900000+7 3.180100-5 1.950000+7 2.902900-5 2.000000+7 2.651100-55461 3 64 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 65 - 0.000000+0-3.211900+6 0 0 1 475461 3 65 - 47 2 0 0 0 05461 3 65 - 3.235700+6 0.000000+0 3.299500+6 1.785400-2 3.500000+6 3.741600-25461 3 65 - 3.659000+6 4.038100-2 4.000000+6 3.706600-2 4.500000+6 2.559000-25461 3 65 - 5.000000+6 1.483000-2 5.500000+6 8.002900-3 6.000000+6 4.666100-35461 3 65 - 6.141900+6 4.020600-3 6.500000+6 2.778600-3 7.000000+6 1.679200-35461 3 65 - 7.500000+6 1.032600-3 7.729400+6 8.332700-4 8.054100+6 6.224500-45461 3 65 - 8.250000+6 5.254100-4 8.500000+6 4.265400-4 8.750000+6 3.501700-45461 3 65 - 9.000000+6 2.905500-4 9.250000+6 2.436900-4 9.387100+6 2.223500-45461 3 65 - 9.500000+6 2.067000-4 9.750000+6 1.772400-4 9.970400+6 1.561100-45461 3 65 - 1.025000+7 1.343500-4 1.050000+7 1.185900-4 1.075000+7 1.055900-45461 3 65 - 1.100000+7 9.473700-5 1.150000+7 7.779200-5 1.200000+7 6.531500-55461 3 65 - 1.250000+7 5.578900-5 1.300000+7 4.830400-5 1.350000+7 4.226000-55461 3 65 - 1.400000+7 3.728700-5 1.450000+7 3.311000-5 1.455400+7 3.269900-55461 3 65 - 1.500000+7 2.956200-5 1.550000+7 2.651000-5 1.600000+7 2.386400-55461 3 65 - 1.650000+7 2.154200-5 1.700000+7 1.950300-5 1.750000+7 1.769500-55461 3 65 - 1.800000+7 1.608700-5 1.850000+7 1.464800-5 1.900000+7 1.334800-55461 3 65 - 1.950000+7 1.217600-5 2.000000+7 1.110400-5 5461 3 65 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 66 - 0.000000+0-3.275200+6 0 0 1 465461 3 66 - 46 2 0 0 0 05461 3 66 - 3.299500+6 0.000000+0 3.500000+6 3.970100-2 3.659000+6 4.944800-25461 3 66 - 4.000000+6 4.953800-2 4.500000+6 3.589200-2 5.000000+6 2.169500-25461 3 66 - 5.500000+6 1.211600-2 6.000000+6 7.119600-3 6.141900+6 6.143900-35461 3 66 - 6.500000+6 4.265400-3 7.000000+6 2.605600-3 7.500000+6 1.625700-35461 3 66 - 7.729400+6 1.320400-3 8.054100+6 9.945800-4 8.250000+6 8.428600-45461 3 66 - 8.500000+6 6.872200-4 8.750000+6 5.656300-4 9.000000+6 4.700800-45461 3 66 - 9.250000+6 3.943400-4 9.387100+6 3.597700-4 9.500000+6 3.343100-45461 3 66 - 9.750000+6 2.862900-4 9.970400+6 2.518100-4 1.025000+7 2.162700-45461 3 66 - 1.050000+7 1.906000-4 1.075000+7 1.694500-4 1.100000+7 1.518700-45461 3 66 - 1.150000+7 1.246000-4 1.200000+7 1.047100-4 1.250000+7 8.966400-55461 3 66 - 1.300000+7 7.792400-5 1.350000+7 6.848800-5 1.400000+7 6.074200-55461 3 66 - 1.450000+7 5.424200-5 1.455400+7 5.360000-5 1.500000+7 4.871900-55461 3 66 - 1.550000+7 4.396400-5 1.600000+7 3.983100-5 1.650000+7 3.619200-55461 3 66 - 1.700000+7 3.297900-5 1.750000+7 3.011300-5 1.800000+7 2.753800-55461 3 66 - 1.850000+7 2.521800-5 1.900000+7 2.309600-5 1.950000+7 2.116800-55461 3 66 - 2.000000+7 1.938200-5 5461 3 66 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3 91 - 0.000000+0-3.275200+6 0 0 1 465461 3 91 - 46 2 0 0 0 05461 3 91 - 3.299500+6 0.000000+0 3.500000+6 1.590800-1 3.659000+6 3.879500-15461 3 91 - 4.000000+6 9.213700-1 4.500000+6 1.547600+0 5.000000+6 1.908600+05461 3 91 - 5.500000+6 2.082400+0 6.000000+6 2.166400+0 6.141900+6 2.182000+05461 3 91 - 6.500000+6 2.211100+0 7.000000+6 2.237600+0 7.500000+6 2.258500+05461 3 91 - 7.729400+6 2.267000+0 8.054100+6 2.277800+0 8.250000+6 2.269100+05461 3 91 - 8.500000+6 2.223200+0 8.750000+6 2.147700+0 9.000000+6 2.033400+05461 3 91 - 9.250000+6 1.925500+0 9.387100+6 1.838200+0 9.500000+6 1.785000+05461 3 91 - 9.750000+6 1.672100+0 9.970400+6 1.543200+0 1.025000+7 1.422000+05461 3 91 - 1.050000+7 1.328500+0 1.075000+7 1.244900+0 1.100000+7 1.170100+05461 3 91 - 1.150000+7 1.003500+0 1.200000+7 8.893400-1 1.250000+7 7.982600-15461 3 91 - 1.300000+7 7.237500-1 1.350000+7 6.612400-1 1.400000+7 6.103600-15461 3 91 - 1.450000+7 5.669600-1 1.455400+7 5.626500-1 1.500000+7 5.269300-15461 3 91 - 1.550000+7 4.915000-1 1.600000+7 4.597700-1 1.650000+7 4.306100-15461 3 91 - 1.700000+7 4.035700-1 1.750000+7 3.781200-1 1.800000+7 3.539900-15461 3 91 - 1.850000+7 3.309000-1 1.900000+7 3.088600-1 1.950000+7 2.878700-15461 3 91 - 2.000000+7 2.678700-1 5461 3 91 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3102 - 4.024800+6 4.024800+6 0 0 3 725461 3102 - 2 2 4 5 72 25461 3102 - 1.000000-5 6.600000-4 4.900000+5 6.600000-4 4.900000+5 7.076790-45461 3102 - 5.000000+5 7.093160-4 6.000000+5 7.549200-4 7.000000+5 8.073900-45461 3102 - 8.000000+5 8.684700-4 1.000000+6 1.022300-3 1.250000+6 1.288600-35461 3102 - 1.322700+6 1.383900-3 1.400000+6 1.128500-3 1.550000+6 1.118600-35461 3102 - 1.707000+6 1.168500-3 1.905700+6 5.507800-4 2.141500+6 5.291500-45461 3102 - 2.278300+6 4.894800-4 2.306500+6 4.876600-4 2.432700+6 4.541300-45461 3102 - 2.483300+6 4.377500-4 2.578900+6 4.122400-4 2.627900+6 4.002300-45461 3102 - 2.653800+6 3.927000-4 2.870400+6 3.605700-4 2.890300+6 3.570700-45461 3102 - 3.001200+6 3.426900-4 3.235700+6 3.307400-4 3.299500+6 3.286800-45461 3102 - 3.500000+6 3.042300-4 3.659000+6 2.748200-4 4.000000+6 2.176600-45461 3102 - 4.500000+6 1.529500-4 5.000000+6 1.088900-4 5.500000+6 8.157300-55461 3102 - 6.000000+6 6.872000-5 6.141900+6 6.654300-5 6.500000+6 6.338000-55461 3102 - 7.000000+6 6.392500-5 7.500000+6 6.986200-5 7.729400+6 7.441000-55461 3102 - 8.054100+6 8.164700-5 8.250000+6 8.803200-5 8.500000+6 9.769500-55461 3102 - 8.750000+6 1.092300-4 9.000000+6 1.228300-4 9.250000+6 1.386900-45461 3102 - 9.387100+6 1.484300-4 9.500000+6 1.570400-4 9.750000+6 1.780500-45461 3102 - 9.970400+6 1.988700-4 1.025000+7 2.283900-4 1.050000+7 2.575800-45461 3102 - 1.075000+7 2.890400-4 1.100000+7 3.222300-4 1.150000+7 3.907200-45461 3102 - 1.200000+7 4.564400-4 1.250000+7 5.139300-4 1.300000+7 5.608700-45461 3102 - 1.350000+7 5.972400-4 1.400000+7 6.232200-4 1.450000+7 6.390200-45461 3102 - 1.455400+7 6.401800-4 1.500000+7 6.466600-4 1.550000+7 6.500400-45461 3102 - 1.600000+7 6.526200-4 1.650000+7 6.551500-4 1.700000+7 6.555800-45461 3102 - 1.750000+7 6.510400-4 1.800000+7 6.401800-4 1.850000+7 6.241700-45461 3102 - 1.900000+7 6.058800-4 1.950000+7 5.883900-4 2.000000+7 5.738200-45461 3102 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3103 - 6.096700+6-6.096700+6 0 0 1 305461 3103 - 30 2 0 0 0 05461 3103 - 6.141900+6 0.000000+0 9.000000+6 0.000000+0 9.250000+6 3.304100-75461 3103 - 9.387100+6 7.512200-7 9.500000+6 1.158600-6 9.750000+6 2.954400-65461 3103 - 9.970400+6 5.920600-6 1.025000+7 1.312900-5 1.050000+7 2.481000-55461 3103 - 1.075000+7 4.419900-5 1.100000+7 7.506800-5 1.150000+7 1.888400-45461 3103 - 1.200000+7 4.101500-4 1.250000+7 7.884500-4 1.300000+7 1.377400-35461 3103 - 1.350000+7 2.214800-3 1.400000+7 3.323800-3 1.450000+7 4.700000-35461 3103 - 1.455400+7 4.862500-3 1.500000+7 6.309700-3 1.550000+7 8.082000-35461 3103 - 1.600000+7 9.926000-3 1.650000+7 1.173700-2 1.700000+7 1.342700-25461 3103 - 1.750000+7 1.488400-2 1.800000+7 1.612700-2 1.850000+7 1.712100-25461 3103 - 1.900000+7 1.787200-2 1.950000+7 1.838200-2 2.000000+7 1.866000-25461 3103 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3104 - 7.672500+6-7.672500+6 0 0 1 215461 3104 - 21 2 0 0 0 05461 3104 - 7.729400+6 0.000000+0 1.100000+7 0.000000+0 1.150000+7 1.266000-75461 3104 - 1.200000+7 7.342600-7 1.250000+7 3.550900-6 1.300000+7 1.229200-55461 3104 - 1.350000+7 3.361100-5 1.400000+7 7.813400-5 1.450000+7 1.600300-45461 3104 - 1.455400+7 1.715400-4 1.500000+7 2.969000-4 1.550000+7 5.123700-45461 3104 - 1.600000+7 8.320000-4 1.650000+7 1.282300-3 1.700000+7 1.882200-35461 3104 - 1.750000+7 2.645000-3 1.800000+7 3.564100-3 1.850000+7 4.619600-35461 3104 - 1.900000+7 5.794600-3 1.950000+7 7.046900-3 2.000000+7 8.359400-35461 3104 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3105 - 9.317900+6-9.317900+6 0 0 1 165461 3105 - 16 2 0 0 0 05461 3105 - 9.387100+6 0.000000+0 1.350000+7 0.000000+0 1.400000+7 1.277500-65461 3105 - 1.450000+7 6.482600-6 1.455400+7 7.664700-6 1.500000+7 2.460300-55461 3105 - 1.550000+7 7.250600-5 1.600000+7 1.750600-4 1.650000+7 3.612500-45461 3105 - 1.700000+7 6.694900-4 1.750000+7 1.152100-3 1.800000+7 1.856400-35461 3105 - 1.850000+7 2.813600-3 1.900000+7 4.004400-3 1.950000+7 5.399500-35461 3105 - 2.000000+7 6.944300-3 5461 3105 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 5.413600+4 1.347400+2 0 0 0 05461 3107 - 2.186800+6 2.186800+6 0 0 1 365461 3107 - 36 2 0 0 0 05461 3107 - 1.000000-5 0.000000+0 7.500000+6 0.000000+0 7.729400+6 1.189700-75461 3107 - 8.054100+6 2.048300-7 8.250000+6 4.880700-7 8.500000+6 7.262100-75461 3107 - 8.750000+6 1.240100-6 9.000000+6 1.866000-6 9.250000+6 2.892700-65461 3107 - 9.387100+6 3.596600-6 9.500000+6 4.257300-6 9.750000+6 6.199900-65461 3107 - 9.970400+6 8.547500-6 1.025000+7 1.266000-5 1.050000+7 1.784800-55461 3107 - 1.075000+7 2.490500-5 1.100000+7 3.431000-5 1.150000+7 6.285600-55461 3107 - 1.200000+7 1.100100-4 1.250000+7 1.853100-4 1.300000+7 2.990300-45461 3107 - 1.350000+7 4.627500-4 1.400000+7 6.914500-4 1.450000+7 9.963900-45461 3107 - 1.455400+7 1.035300-3 1.500000+7 1.383900-3 1.550000+7 1.854300-35461 3107 - 1.600000+7 2.403100-3 1.650000+7 3.012200-3 1.700000+7 3.662000-35461 3107 - 1.750000+7 4.324400-3 1.800000+7 4.960600-3 1.850000+7 5.537500-35461 3107 - 1.900000+7 6.022300-3 1.950000+7 6.381900-3 2.000000+7 6.610700-35461 3107 - 0.000000+0 0.000000+0 0 0 0 05461 3 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 05461 0 0 - 0.000000+0 0.000000+0 0 0 0 0 0 0 0 - 0.000000+0 0.000000+0 0 0 0 0 -1 0 0 diff --git a/tests/n-054_Xe_136_trimmed.endf.xz b/tests/n-054_Xe_136_trimmed.endf.xz new file mode 100644 index 0000000..4dee2b6 Binary files /dev/null and b/tests/n-054_Xe_136_trimmed.endf.xz differ diff --git a/tests/n-092_U_235_trimmed.endf.xz b/tests/n-092_U_235_trimmed.endf.xz new file mode 100644 index 0000000..d281a9c Binary files /dev/null and b/tests/n-092_U_235_trimmed.endf.xz differ diff --git a/tests/n-095_Am_242_trimmed.endf b/tests/n-095_Am_242_trimmed.endf deleted file mode 100644 index 7286809..0000000 --- a/tests/n-095_Am_242_trimmed.endf +++ /dev/null @@ -1,277 +0,0 @@ - ENDF/B-VIII.1 0 0 - 9.524200+4 2.399801+2 1 1 0 19546 1451 - 0.000000+0 0.000000+0 0 0 0 69546 1451 - 1.000000+0 2.000000+7 1 0 10 89546 1451 - 0.000000+0 0.000000+0 0 0 134 899546 1451 - 95-Am-242 LANL EVAL-DEC04 Talou,Young,Kawano 9546 1451 - NDS 148, 1 (2018) DIST-AUG24 REV1-JUL23 20240830 9546 1451 ----- ENDF/B-VIII.1 MATERIAL 9546 REVISION 1 9546 1451 ------ INCIDENT-NEUTRON DATA 9546 1451 ------- ENDF-6 9546 1451 - 9546 1451 -**************************************************************** 9546 1451 -Missing exit distributions imported from TENDL2019 9546 1451 -by I.J. Thompson (LLNL) on 2023-04-21T21:44:24 9546 1451 - 9546 1451 -Some neutron exit distributions, as noted, may be imported so all 9546 1451 -exit distributions have the same reference frame. 9546 1451 - 9546 1451 -Changes by program patchGNDS.py: 9546 1451 - photon distribution for MT=102: Am243 + photon. 9546 1451 - 9546 1451 - 9546 1451 -AUG11 Added MT458 fission energy release data based on R. Vogt 9546 1451 -Energy-Dependent Fission Q Values Generalized for All Actinides 9546 1451 -Oct 8, 2008 report LLNL-TR-407620 9546 1451 - 9546 1451 - 9546 1451 -********************* DESCRIPTION / REFERENCES *******************9546 1451 - 9546 1451 -This file contains an evaluation of the products of the neutron- 9546 1451 -induced reaction on Am-242g, i.e., in its ground-state (1-) [as 9546 1451 -opposed to its long-lived (141yr) metastable state (5-,48.63keV)],9546 1451 -for neutron incident energies up to 20 MeV. The following cross- 9546 1451 -sections are present in this file: (n,n'), (n,2n), (n,3n), (n,f), 9546 1451 -and (n,gamma). Secondary neutrons double-differential spectra were9546 1451 -also obtained. Details on the evaluation procedure are given 9546 1451 -below. 9546 1451 - 9546 1451 -A coupled-channels calculation (using the ECIS96 code by J.Raynal 9546 1451 -[Ra94]) was used to infer the total, elastic and reaction cross 9546 1451 -sections, and direct elastic and inelastic scattering cross 9546 1451 -sections and angular distributions for 33 excited states. The 9546 1451 -deformed optical potential used was developed by P.G.Young for 9546 1451 -Am-241 and Am-243 isotopes [Yo94,Yo95]. The details are as 9546 1451 -follows: 9546 1451 - 9546 1451 -------------------------------------------------------------------9546 1451 -Well depth (MeV) range (MeV) geometry (fm) 9546 1451 -------------------------------------------------------------------9546 1451 -VR=52.102-27.75*X-0.30*E 0<=E<=30 rR=1.25, aR=0.60 9546 1451 -WD=5.3243-9.4995*X+0.45*E 0<=E<8 rD=1.24, aD=0.55 9546 1451 -WD=8.9243-9.4995*X-0.046*(E-8) 8<=E<=30 9546 1451 -WV=0 0<=E<8 rV=1.24, aV=0.55 9546 1451 -WV=-1.6+0.20*E 8<=E<=30 9546 1451 -Vso=6.2 0<=E<=30 rso=1.01,aso=0.75 9546 1451 -------------------------------------------------------------------9546 1451 - 9546 1451 -where X=(N-Z)/A characterizes the isospin dependence. The ECIS96 9546 1451 -code [Ra94] was used for the present coupled-channels calculation.9546 1451 - 9546 1451 -The adopted first discrete levels for Am-242 are: 9546 1451 - 9546 1451 - No. Energy (MeV) Spin, Parity K-Band 9546 1451 - -------------------------------------------- 9546 1451 - 1 0.00000 1,- 0 9546 1451 - 2 0.04410 0,- 0 9546 1451 - 3 0.04863 5,- 9546 1451 - 4 0.05290 3,- 0 9546 1451 - 5 0.07580 2,- 0 9546 1451 - 6 0.09900 2,- 9546 1451 - 7 0.11400 6,- 9546 1451 - 8 0.14800 5,- 9546 1451 - 9 0.14990 4,- 9546 1451 - 10 0.17100 5,+ 9546 1451 - 11 0.19000 7,- 9546 1451 - 12 0.19760 3,- 9546 1451 - 13 0.23050 1,+ 9546 1451 - 14 0.24410 3,- 9546 1451 - 15 0.26300 6,- 9546 1451 - 16 0.26301 7,- 9546 1451 - 17 0.27010 2,+ 9546 1451 - .. ....... ... 9546 1451 - 9546 1451 -The four levels built on top of the K=0 rotational band are 9546 1451 -coupled in the present calculation. 9546 1451 - 9546 1451 -(n,xn) and (n,gamma) cross sections, and secondary neutrons 9546 1451 -spectra were obtained with the GNASH nuclear reaction code [Yo96].9546 1451 -The neutron spin-dependent transmission coefficients were obtained9546 1451 -from the ECIS calculation. 9546 1451 - 9546 1451 -The neutron-induced fission cross section was taken directly from 9546 1451 -our evaluation work on Am-242m, where experimental data exist. No 9546 1451 -experimental data exist on Am-242g, due to the very short half- 9546 1451 -life of about 16 hours. The (n,f) cross section for Am-242m was 9546 1451 -obtained through a Bayesian analysis of available experimental 9546 1451 -data. 9546 1451 - 9546 1451 -At low incident neutron energies, the resonance parameters were 9546 1451 -directly taken from the JENDL-3.3 evaluation file. The resolved 9546 1451 -resonance region extends up to 100eV, and the unresolved resonance9546 1451 -region up to 44.2838 keV. A smooth transition from 44.2838 keV to 9546 1451 -100 keV was established to connect to our ECIS results for the 9546 1451 -total cross section and to our fission and capture cross sections 9546 1451 -at higher energies. 9546 1451 - 9546 1451 -The sections MF1,MT452,455,456 and MF5,MT18 were also adopted from9546 1451 -the JENDL-3.3 evaluation. 9546 1451 - 9546 1451 - 9546 1451 ------------------------------- REFERENCES ------------------------9546 1451 - 9546 1451 -[Ra94] "Notes on ECIS94". J.Raynal. Technical report #CEA-N-2772, 9546 1451 - CEA Saclay, France (1994). 9546 1451 - 9546 1451 -[Yo94] "Experience at Los Alamos with use of the optical model for9546 1451 - applied nuclear data calculations". P.G.Young, LA-UR-94- 9546 1451 - 3104, LANL (1994). IAEA First Research Coordination 9546 1451 - Meeting of 'Development of Reference Input Parameter 9546 1451 - Library for Nuclear Model Calculations of Nuclear Data', 9546 1451 - Sep. 19-23, 1994, Cervia, Italy. 9546 1451 - 9546 1451 -[Yo95] "Status of optical model activities at Los Alamos National 9546 1451 - Laboratory". P.G.Young, LA-UR-95-3654, LANL (1995). 9546 1451 - Presented at the Second Research Coordination Meeting on 9546 1451 - the 'Development of Reference Input Parameter Library for 9546 1451 - Nuclear Model Calculations of Nuclear Data', Oct.30-Nov.3, 9546 1451 - 1995, Vienna, IAEA Headquarters. 9546 1451 - 9546 1451 -[Yo96] "Comprehensive nuclear model calculations: theory and use 9546 1451 - of the GNASH code". P.G.Young, E.D.Arthur,and M.B.Chadwick.9546 1451 - A.Gandini & G.Reffo, Ed., Proceedings of the IAEA Workshop 9546 1451 - on nuclear reaction data and nuclear reactors: physics, 9546 1451 - design, and safety. Trieste, Italy, April 15-May 17, 1996, 9546 1451 - pages 227-404, World Scientific Publishing, Ltd, Singapore,9546 1451 - 1998. 9546 1451 - 9546 1451 -*************************** DICTIONARY ***************************9546 1451 - 9546 1451 - 1 451 227 09546 1451 - 1 452 7 09546 1451 - 1 455 7 09546 1451 - 1 456 7 09546 1451 - 1 458 11 09546 1451 - 2 151 285 09546 1451 - 3 1 48 09546 1451 - 3 2 48 09546 1451 - 3 4 43 09546 1451 - 3 16 16 09546 1451 - 3 17 8 09546 1451 - 3 18 31 09546 1451 - 3 51 17 09546 1451 - 3 52 17 09546 1451 - 3 53 19 09546 1451 - 3 54 16 09546 1451 - 3 55 15 09546 1451 - 3 56 15 09546 1451 - 3 57 14 09546 1451 - 3 58 14 09546 1451 - 3 59 14 09546 1451 - 3 60 14 09546 1451 - 3 61 14 09546 1451 - 3 62 13 09546 1451 - 3 63 14 09546 1451 - 3 64 14 09546 1451 - 3 65 14 09546 1451 - 3 66 14 09546 1451 - 3 67 14 09546 1451 - 3 68 14 09546 1451 - 3 69 14 09546 1451 - 3 70 13 09546 1451 - 3 71 13 09546 1451 - 3 72 13 09546 1451 - 3 73 13 09546 1451 - 3 74 13 09546 1451 - 3 75 13 09546 1451 - 3 76 13 09546 1451 - 3 77 13 09546 1451 - 3 78 13 09546 1451 - 3 79 13 09546 1451 - 3 80 13 09546 1451 - 3 81 13 09546 1451 - 3 82 13 09546 1451 - 3 83 13 09546 1451 - 3 91 27 09546 1451 - 3 102 31 09546 1451 - 4 2 198 09546 1451 - 4 18 2 09546 1451 - 4 51 131 09546 1451 - 4 52 135 09546 1451 - 4 53 186 09546 1451 - 4 54 125 09546 1451 - 4 55 120 09546 1451 - 4 56 120 09546 1451 - 4 57 116 09546 1451 - 4 58 113 09546 1451 - 4 59 109 09546 1451 - 4 60 114 09546 1451 - 4 61 110 09546 1451 - 4 62 101 09546 1451 - 4 63 108 09546 1451 - 4 64 111 09546 1451 - 4 65 111 09546 1451 - 4 66 106 09546 1451 - 4 67 103 09546 1451 - 4 68 108 09546 1451 - 4 69 108 09546 1451 - 4 70 106 09546 1451 - 4 71 106 09546 1451 - 4 72 107 09546 1451 - 4 73 102 09546 1451 - 4 74 105 09546 1451 - 4 75 102 09546 1451 - 4 76 99 09546 1451 - 4 77 105 09546 1451 - 4 78 100 09546 1451 - 4 79 103 09546 1451 - 4 80 99 09546 1451 - 4 81 105 09546 1451 - 4 82 103 09546 1451 - 4 83 102 09546 1451 - 5 18 554 09546 1451 - 6 16 2235 09546 1451 - 6 17 367 09546 1451 - 6 91 4893 09546 1451 - 12 102 301 09546 1451 - 14 102 1 09546 1451 - 15 102 727 09546 1451 - 0.000000+0 0.000000+0 0 0 0 09546 1 0 - 9.524200+4 2.399801+2 0 2 0 09546 1452 - 0.000000+0 0.000000+0 0 0 1 129546 1452 - 12 2 0 0 0 09546 1452 - 1.000000-5 3.271800+0 4.000000+6 3.863800+0 6.000000+6 4.149450+09546 1452 - 7.000000+6 4.287270+0 8.000000+6 4.425270+0 1.000000+7 4.678270+09546 1452 - 1.200000+7 4.929270+0 1.223090+7 4.955270+0 1.400000+7 5.159270+09546 1452 - 1.600000+7 5.382270+0 1.800000+7 5.599270+0 2.000000+7 5.812270+09546 1452 - 0.000000+0 0.000000+0 0 0 0 09546 1 0 - 9.524200+4 2.399801+2 0 2 0 09546 1455 - 0.000000+0 0.000000+0 0 0 6 09546 1455 - 1.350000-2 3.010000-2 1.152000-1 2.994000-1 8.646000-1 2.810700+09546 1455 - 0.000000+0 0.000000+0 0 0 1 49546 1455 - 4 2 0 0 0 09546 1455 - 1.000000-5 7.800000-3 4.000000+6 7.800000-3 7.000000+6 4.270000-39546 1455 - 2.000000+7 4.270000-3 9546 1455 - 0.000000+0 0.000000+0 0 0 0 09546 1 0 - 9.524200+4 2.399801+2 0 2 0 09546 1456 - 0.000000+0 0.000000+0 0 0 1 129546 1456 - 12 2 0 0 0 09546 1456 - 1.000000-5 3.264000+0 4.000000+6 3.856000+0 6.000000+6 4.144000+09546 1456 - 7.000000+6 4.283000+0 8.000000+6 4.421000+0 1.000000+7 4.674000+09546 1456 - 1.200000+7 4.925000+0 1.223090+7 4.951000+0 1.400000+7 5.155000+09546 1456 - 1.600000+7 5.378000+0 1.800000+7 5.595000+0 2.000000+7 5.808000+09546 1456 - 0.000000+0 0.000000+0 0 0 0 09546 1 0 - 9.524200+4 2.399801+2 0 0 0 09546 1458 - 0.000000+0 0.000000+0 0 2 54 279546 1458 - 1.800888+8 9.904882+6 7.150000+6 6.300000+4 1.803000+4 7.700000+29546 1458 - 6.949000+6 6.949000+4 5.675684+6 2.903658+4 5.836353+6 1.935772+49546 1458 - 7.845685+6 2.903658+4 2.057178+8 1.463876+7 2.135635+8 1.521760+79546 1458 --5.440482-1 2.992265-2 3.473000-1 1.710000-2-1.117000-3 2.155000-49546 1458 - 1.693000-2 1.693000-4-7.500000-2 7.500000-3-7.500000-2 7.500000-39546 1458 --1.000000-1 1.000000-2-1.330935+0 3.334525-1-1.430935+0 3.860086-19546 1458 - 0.000000+0 0.000000+0 2.294000-9 8.95000-10 3.88200-11 1.11900-119546 1458 - 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+09546 1458 - 0.000000+0 0.000000+0 2.332820-9 1.131612-9 2.332820-9 1.131612-99546 1458 - 0.000000+0 0.000000+0 0 0 0 09546 1 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 09546 0 0 - 0.000000+0 0.000000+0 0 0 0 0 0 0 0 - 0.000000+0 0.000000+0 0 0 0 0 -1 0 0 - -1 0 0 0 diff --git a/tests/n-095_Am_242_trimmed.endf.xz b/tests/n-095_Am_242_trimmed.endf.xz new file mode 100644 index 0000000..108804f Binary files /dev/null and b/tests/n-095_Am_242_trimmed.endf.xz differ diff --git a/tests/n-095_Am_244.endf b/tests/n-095_Am_244.endf deleted file mode 100644 index fcaa917..0000000 --- a/tests/n-095_Am_244.endf +++ /dev/null @@ -1,2148 +0,0 @@ - $Rev:: 1451 $ $Date:: 2018-01-17#$ 1 0 0 - 9.524400+4 2.419680+2 0 1 0 29552 1451 - 0.000000+0 1.000000+0 0 0 0 69552 1451 - 1.000000+0 2.000000+7 0 0 10 89552 1451 - 0.000000+0 0.000000+0 0 0 145 769552 1451 - 95-Am-244 JAERI EVAL-MAR88 T.Nakagawa 9552 1451 -JAERI-M 89-008 DIST-FEB18 REV2-FEB02 20111222 9552 1451 -----ENDF/B-VIII.0 MATERIAL 9552 REVISION 2 9552 1451 ------INCIDENT NEUTRON DATA 9552 1451 -------ENDF-6 FORMAT 9552 1451 - 9552 1451 -AUG11 Added MT458 fission energy release data based on R. Vogt 9552 1451 -Energy-Dependent Fission Q Values Generalized for All Actinides 9552 1451 -Oct 8, 2008 report LLNL-TR-407620 9552 1451 - 9552 1451 - 9552 1451 - =========================================================== 9552 1451 - JENDL-3.2 data were automatically transformed to JENDL-3.3. 9552 1451 - Interpolation of spectra: 22 (unit base interpolation) 9552 1451 - (3,251) deleted, T-matrix of (4,2) deleted, and others. 9552 1451 - =========================================================== 9552 1451 - 9552 1451 -HISTORY 9552 1451 -88-03 EVALUATED FOR JENDL-3 WAS MADE BY T.NAKAGAWA (JAERI)/1/. 9552 1451 - 9552 1451 -MF=1 GENERAL INFORMATION 9552 1451 - MT=451 COMMENT AND DICTIONARY 9552 1451 - MT=452 NUMBER OF NEUTRONS PER FISSION 9552 1451 - SUM OF NU-P (MT=456) AND NU-D (MT=455). 9552 1451 - MT=455 DELAYED NEUTRON DATA 9552 1451 - ESTIMATED FROM SEMI-EMPIRICAL FORMULA BY TUTTLE /2/. 9552 1451 - MT=456 NUMBER OF PROMPT NEUTRONS 9552 1451 - ESTIMATED FROM SEMI-EMPIRICAL FORMULA BY HOWERTON/3/. 9552 1451 - 9552 1451 -MF=2,MT=151 RESONANCE PARAMETERS 9552 1451 - NO RESONANCE PARAMETERS WERE GIVEN. 9552 1451 - 9552 1451 - 2200-M/S CROSS SECTIONS AND RESONANCE INTEGRALS 9552 1451 - 2200 M/S VALUE RES. INT. 9552 1451 - TOTAL 2912. B - 9552 1451 - ELASTIC 11.62 B - 9552 1451 - FISSION 2300. B 1260 B 9552 1451 - CAPTURE 600. B 316 B 9552 1451 - 9552 1451 -MF=3 NEUTRON CROSS SECTIONS 9552 1451 - MT=1 TOTAL CROSS SECTION 9552 1451 - BELOW 0.07 EV, SUM OF PARTIAL CROSS SECTIONS. ABOVE 0.07 9552 1451 - EV, CALCULATED WITH OPTICAL AND STATISTICAL MODEL CODE 9552 1451 - CASTHY/4/. THE SAME OPTICAL POTENTIAL PARAMETERS AS THOSE 9552 1451 - FOR AM-242 WHICH WERE OBTAINED /5/ BY FITTING THE DATA OF 9552 1451 - PHILLIPS AND HOWE /6/ FOR AM-241, AND MODIFIED A LITTLE. 9552 1451 - V = 42.0 - 0.107*EN (MEV) 9552 1451 - WS= 9.0 - 0.339*EN + 0.0531*EN**2 (MEV) 9552 1451 - VSO = 7.0 (MEV) 9552 1451 - R = RSO = 1.282 , RS = 1.29 (FM) 9552 1451 - A = ASO = 0.60 , B = 0.5 (FM) 9552 1451 - 9552 1451 - MT=2 ELASTIC SCATTERING CROSS SECTION 9552 1451 - CALCULATED WITH CASTHY/4/. 9552 1451 - 9552 1451 - MT=4,51-75,91 INELASTIC SCATTERING CROSS SECTIONS 9552 1451 - CALCULATED WITH CASTHY/4/. THE LEVEL SCHEME WAS TAKEN 9552 1451 - FROM REF. /7/ 9552 1451 - NO ENERGY(KEV) SPIN-PARITY 9552 1451 - G.S. 0 6 - 9552 1451 - 1 88.0 1 + 9552 1451 - 2 100.309 2 + 9552 1451 - 3 123.281 3 + 9552 1451 - 4 148.283 4 + 9552 1451 - 5 175.657 1 - 9552 1451 - 6 183.511 5 - 9552 1451 - 7 197.295 2 - 9552 1451 - 8 228.299 3 - 9552 1451 - 9 261.696 2 - 9552 1451 - 10 272.202 4 - 9552 1451 - 11 289.212 1 - 9552 1451 - 12 296.658 3 - 9552 1451 - 13 322.751 5 - 9552 1451 - 14 355.575 0 - 9552 1451 - 15 342.650 3 - 9552 1451 - 16 343.658 4 - 9552 1451 - 17 348.405 3 + 9552 1451 - 18 361.838 2 - 9552 1451 - 19 377.057 0 + 9552 1451 - 20 390.028 4 + 9552 1451 - 21 398.743 5 - 9552 1451 - 22 414.689 2 + 9552 1451 - 23 418.957 2 + 9552 1451 - 24 420.131 2 + 9552 1451 - 25 421.204 3 - 9552 1451 - LEVELS ABOVE 435 KEV WERE ASSUMED TO BE OVERLAPPING. 9552 1451 - THE LEVEL DENSITY PARAMETERS WERE DETERMINED ON THE BASIS 9552 1451 - OF NUMBER OF EXCITED LEVELS/8/ AND RESONANCE LEVEL 9552 1451 - SPACING/9/. 9552 1451 - AM-245 AM-244 9552 1451 - A(1/MEV) 31.3 30.3 9552 1451 - T(MEV) 0.360 0.340 9552 1451 - C(1/MEV) 18.06 26.47 9552 1451 - E-X(MEV) 3.265 2.373 9552 1451 - SPIN-CUTOFF(1/MEV**0.5) 31.98 31.39 9552 1451 - PAIRING E(MEV) 0.39 0.0 9552 1451 - 9552 1451 - MT=16,17,37 (N,2N), (N,3N) AND (N,4N) REACTION CROSS SECTIONS 9552 1451 - CALCULATED WITH EVAPORATION MODEL. 9552 1451 - 9552 1451 - MT=18 FISSION CROSS SECTION 9552 1451 - BELOW 0.07 EV, 1/V SHAPED CROSS SECTION WAS NORMALIZED TO 9552 1451 - 2300 +- 300 B AT 0.0253 EV/9/. ABOVE 0.07 EV, THE CROSS 9552 1451 - SECTION WAS ASSUMED TO BE THE SAME AS THAT OF AM-242G 9552 1451 - (MAT=3952 OF JENDL-3). 9552 1451 - 9552 1451 - MT=102 CAPTURE CROSS SECTION 9552 1451 - BELOW 0.07 EV, 1/V CROSS SECTION WAS NORMALIZED TO 600 B 9552 1451 - AT 0.0253 EV THAT WAS ESTIMATED BY ASSUMING THE SAME CROSS9552 1451 - SECTION RATIO AS HIGHER ENERGY REGION. ABOVE 0.07 EV, 9552 1451 - CALCULATED WITH CASTHY/4/. THE GAMMA-RAY STRENGTH 9552 1451 - FUNCTION WAS DETERMINED FROM D-OBS=0.13 EV CALCULATED FROM9552 1451 - LEVEL DENSITY PARAMETERS AND WG=0.05 EV. 9552 1451 - 9552 1451 - MT=251 MU-L BAR 9552 1451 - CALCULATED WITH CASTHY/4/. 9552 1451 - 9552 1451 -MF=4 ANGULAR DISTRIBUTIONS OF SECONDARY NEUTRONS 9552 1451 - MT=2,51-75,91 9552 1451 - LEGENDRE COEFFICIENTS WERE GIVEN BY THE OPTICAL AND 9552 1451 - STATISTICAL MODEL CALCULATION. 9552 1451 - MT=16,17,18,37 9552 1451 - ISOTROPIC DISTRIBUTIONS IN THE LABORATORY SYSTEM. 9552 1451 - 9552 1451 -MF=5 ENERGY DISTRIBUTIONS OF SECONDARY NEUTRONS 9552 1451 - MT=16,17,37,91 9552 1451 - EVAPORATION SPECTRUM WITH NUCLEAR TEMPERATURE CALCULATED9552 1451 - FROM LEVEL DENSITIES. 9552 1451 - MT=18 9552 1451 - MAXWELLIAN FISSION SPECTRUM ESTIMATED FROM Z**2/A 9552 1451 - SYSTEMATICS BY SMITH ET AL./10/. 9552 1451 - 9552 1451 -REFERENCES 9552 1451 - 1) NAKAGAWA T.: JAERI-M 89-008 (1989). 9552 1451 - 2) TUTTLE R.J.: INDC(NDS)-107/G+SPECIAL , P.29 (1979). 9552 1451 - 3) HOWERTON R.J.: NUCL. SCI. ENG., 62, 438 (1977). 9552 1451 - 4) IGARASI S.: J. NUCL. SCI. TECHNOL., 12, 67 (1975). 9552 1451 - 5) IGARASI S. AND NAKAGAWA T.: JAERI-M 8342 (1979). 9552 1451 - 6) PHILLIPS T.W. AND HOWE R.E.: NUCL. SCI. ENG., 69, 375 (1979). 9552 1451 - 7) SHURSHIKOV E.N.: NUCL. DATA SHEETS, 49, 785 (1986). 9552 1451 - 8) ENSDF, EVALUATED NUCLEAR STRUCTURE DATA FILE (1988). 9552 1451 - 9) MUGHABGHAB S.F.: "NEUTRON CROSS SECTIONS, VOL. 1, PART B", 9552 1451 - ACADEMIC PRESS, INC. (1984). 9552 1451 -10) SMITH A.B.: ANL/NDM-50 (1979). 9552 1451 - 9552 1451 - 1 451 225 19552 1451 - 1 452 5 19552 1451 - 1 455 7 19552 1451 - 1 456 4 19552 1451 - 1 458 11 19552 1451 - 2 151 4 19552 1451 - 3 1 74 19552 1451 - 3 2 29 19552 1451 - 3 4 24 19552 1451 - 3 16 9 19552 1451 - 3 17 7 19552 1451 - 3 18 63 19552 1451 - 3 37 5 19552 1451 - 3 51 24 19552 1451 - 3 52 23 19552 1451 - 3 53 23 19552 1451 - 3 54 22 19552 1451 - 3 55 22 19552 1451 - 3 56 22 19552 1451 - 3 57 21 19552 1451 - 3 58 21 19552 1451 - 3 59 20 19552 1451 - 3 60 20 19552 1451 - 3 61 19 19552 1451 - 3 62 19 19552 1451 - 3 63 18 19552 1451 - 3 64 18 19552 1451 - 3 65 18 19552 1451 - 3 66 17 19552 1451 - 3 67 17 19552 1451 - 3 68 17 19552 1451 - 3 69 16 19552 1451 - 3 70 16 19552 1451 - 3 71 15 19552 1451 - 3 72 15 19552 1451 - 3 73 15 19552 1451 - 3 74 14 19552 1451 - 3 75 14 19552 1451 - 3 91 14 19552 1451 - 3 102 30 19552 1451 - 4 2 238 29552 1451 - 4 16 10 19552 1451 - 4 17 10 19552 1451 - 4 18 10 19552 1451 - 4 37 10 19552 1451 - 4 51 28 19552 1451 - 4 52 28 19552 1451 - 4 53 28 19552 1451 - 4 54 28 19552 1451 - 4 55 28 19552 1451 - 4 56 28 19552 1451 - 4 57 28 19552 1451 - 4 58 28 19552 1451 - 4 59 28 19552 1451 - 4 60 28 19552 1451 - 4 61 28 19552 1451 - 4 62 28 19552 1451 - 4 63 28 19552 1451 - 4 64 28 19552 1451 - 4 65 28 19552 1451 - 4 66 28 19552 1451 - 4 67 28 19552 1451 - 4 68 28 19552 1451 - 4 69 28 19552 1451 - 4 70 28 19552 1451 - 4 71 28 19552 1451 - 4 72 28 19552 1451 - 4 73 28 19552 1451 - 4 74 28 19552 1451 - 4 75 28 19552 1451 - 4 91 28 19552 1451 - 5 16 17 29552 1451 - 5 17 22 29552 1451 - 5 18 7 19552 1451 - 5 37 25 29552 1451 - 5 91 10 29552 1451 - 0.000000+0 0.000000+0 0 0 0 09552 1 0 - 9.524400+4 2.419680+2 0 2 0 09552 1452 - 0.000000+0 0.000000+0 0 0 1 49552 1452 - 4 2 9552 1452 - 1.000000-5 3.151800+0 6.000000+6 4.255800+0 8.000000+6 4.619460+09552 1452 - 2.000000+7 6.827460+0 9552 1452 - 0.000000+0 0.000000+0 0 0 0 09552 1 0 - 9.524400+4 2.419680+2 0 2 0 09552 1455 - 0.000000+0 0.000000+0 0 0 6 09552 1455 - 1.290000-2 3.130000-2 1.350000-1 3.330000-1 1.360000+0 4.040000+09552 1455 - 0.000000+0 0.000000+0 0 0 1 49552 1455 - 4 2 9552 1455 - 1.000000-5 1.380000-2 6.000000+6 1.380000-2 8.000000+6 9.460000-39552 1455 - 2.000000+7 9.460000-3 9552 1455 - 0.000000+0 0.000000+0 0 0 0 09552 1 0 - 9.524400+4 2.419680+2 0 2 0 09552 1456 - 0.000000+0 0.000000+0 0 0 1 29552 1456 - 2 2 9552 1456 - 1.000000-5 3.138000+0 2.000000+7 6.818000+0 9552 1456 - 0.000000+0 0.000000+0 0 0 0 09552 1 0 - 9.524400+4 2.419680+2 0 0 0 09552 1458 - 0.000000+0 0.000000+0 0 2 54 279552 1458 - 1.805606+8 9.930834+6 6.651000+6 0.000000+0 3.120000+3 2.500000+29552 1458 - 6.949000+6 6.949000+4 5.106197+6 2.612311+4 5.250745+6 1.741541+49552 1458 - 7.058464+6 2.612311+4 2.045207+8 2.002079+7 2.115791+8 2.072655+79552 1458 --5.454736-1 3.000105-2 3.780000-1 0.000000+0-8.200000-5 3.700000-59552 1458 - 1.693000-2 1.693000-4-7.500000-2 7.500000-3-7.500000-2 7.500000-39552 1458 --1.000000-1 1.000000-2-1.300626+0 6.193000-1-1.400626+0 6.814645-19552 1458 - 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+09552 1458 - 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+09552 1458 - 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+0 0.000000+09552 1458 - 0.000000+0 0.000000+0 0 0 0 09552 1 0 - 0.000000+0 0.000000+0 0 0 0 09552 0 0 - 9.524400+4 2.419680+2 0 0 1 09552 2151 - 9.524400+4 1.000000+0 0 0 1 09552 2151 - 0.000000+0 0.000000+0 0 0 0 09552 2151 - 6.000000+0 7.988660-1 0 0 0 09552 2151 - 0.000000+0 0.000000+0 0 0 0 09552 2 0 - 0.000000+0 0.000000+0 0 0 0 09552 0 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 1 - 0.000000+0 0.000000+0 0 0 1 2139552 3 1 - 213 5 9552 3 1 - 1.000000-5 1.462120+5 2.530000-2 2.911620+3 7.000000-2 1.751620+39552 3 1 - 7.000000-2 2.102320+3 2.400000-1 1.139690+3 2.600000-1 1.095390+39552 3 1 - 2.800000-1 1.055970+3 3.000000-1 1.020550+3 3.500000-1 9.457100+29552 3 1 - 4.000000-1 8.853520+2 4.500000-1 8.353780+2 5.000000-1 7.931040+29552 3 1 - 5.500000-1 7.567250+2 6.000000-1 7.249810+2 6.500000-1 6.969940+29552 3 1 - 7.000000-1 6.720650+2 7.500000-1 6.496640+2 8.000000-1 6.294020+29552 3 1 - 9.000000-1 5.940400+2 1.000000+0 5.641500+2 1.200000+0 5.160360+29552 3 1 - 1.400000+0 4.786220+2 1.600000+0 4.484760+2 1.800000+0 4.235050+29552 3 1 - 2.000000+0 4.023790+2 2.200000+0 3.841880+2 2.400000+0 3.683340+29552 3 1 - 2.600000+0 3.543470+2 2.800000+0 3.418830+2 3.000000+0 3.306880+29552 3 1 - 3.500000+0 3.070160+2 4.000000+0 2.879420+2 4.500000+0 2.721430+29552 3 1 - 5.000000+0 2.587670+2 5.500000+0 2.472650+2 6.000000+0 2.372450+29552 3 1 - 6.500000+0 2.283950+2 7.000000+0 2.205090+2 7.500000+0 2.134350+29552 3 1 - 8.000000+0 2.070270+2 9.000000+0 1.958510+2 1.000000+1 1.863960+29552 3 1 - 1.200000+1 1.710820+2 1.400000+1 1.591890+2 1.600000+1 1.496080+29552 3 1 - 1.800000+1 1.416690+2 2.000000+1 1.349570+2 2.200000+1 1.291830+29552 3 1 - 2.400000+1 1.241490+2 2.600000+1 1.197030+2 2.800000+1 1.157470+29552 3 1 - 3.000000+1 1.121970+2 3.500000+1 1.046910+2 4.000000+1 9.863830+19552 3 1 - 4.500000+1 9.363180+1 5.000000+1 8.939640+1 5.500000+1 8.575520+19552 3 1 - 6.000000+1 8.257900+1 6.500000+1 7.977670+1 7.000000+1 7.728120+19552 3 1 - 7.500000+1 7.503880+1 8.000000+1 7.301250+1 9.000000+1 6.947500+19552 3 1 - 1.000000+2 6.648430+1 1.200000+2 6.165140+1 1.400000+2 5.789610+19552 3 1 - 1.600000+2 5.487080+1 1.800000+2 5.236910+1 2.000000+2 5.025080+19552 3 1 - 2.200000+2 4.843030+1 2.400000+2 4.684260+1 2.600000+2 4.544250+19552 3 1 - 2.800000+2 4.419560+1 3.000000+2 4.307680+1 3.500000+2 4.071140+19552 3 1 - 4.000000+2 3.880660+1 4.500000+2 3.723120+1 5.000000+2 3.589730+19552 3 1 - 5.500000+2 3.475230+1 6.000000+2 3.375340+1 6.500000+2 3.287290+19552 3 1 - 7.000000+2 3.208850+1 7.500000+2 3.138440+1 8.000000+2 3.074880+19552 3 1 - 9.000000+2 2.964050+1 1.000000+3 2.870340+1 1.200000+3 2.719800+19552 3 1 - 1.400000+3 2.602990+1 1.600000+3 2.508830+1 1.800000+3 2.430920+19552 3 1 - 2.000000+3 2.365150+1 2.200000+3 2.307970+1 2.400000+3 2.258170+19552 3 1 - 2.600000+3 2.214200+1 2.800000+3 2.175110+1 3.000000+3 2.140010+19552 3 1 - 3.500000+3 2.065970+1 4.000000+3 2.006500+1 4.500000+3 1.957040+19552 3 1 - 5.000000+3 1.915260+1 5.500000+3 1.879360+1 6.000000+3 1.848090+19552 3 1 - 6.500000+3 1.820300+1 7.000000+3 1.795550+1 7.500000+3 1.773350+19552 3 1 - 8.000000+3 1.753280+1 9.000000+3 1.718320+1 1.000000+4 1.688860+19552 3 1 - 1.200000+4 1.634890+1 1.400000+4 1.593350+1 1.600000+4 1.566460+19552 3 1 - 1.800000+4 1.544290+1 2.000000+4 1.525620+1 2.200000+4 1.506200+19552 3 1 - 2.400000+4 1.489250+1 2.600000+4 1.474300+1 2.800000+4 1.460980+19552 3 1 - 3.000000+4 1.449020+1 3.500000+4 1.421770+1 4.000000+4 1.399730+19552 3 1 - 4.500000+4 1.379210+1 5.000000+4 1.361700+1 5.500000+4 1.346510+19552 3 1 - 6.000000+4 1.333140+1 6.500000+4 1.319350+1 7.000000+4 1.306910+19552 3 1 - 7.500000+4 1.295610+1 8.000000+4 1.285230+1 8.836370+4 1.267890+19552 3 1 - 9.000000+4 1.264630+1 1.000000+5 1.246250+1 1.007240+5 1.244920+19552 3 1 - 1.200000+5 1.211920+1 1.237900+5 1.206090+1 1.400000+5 1.181850+19552 3 1 - 1.488960+5 1.169180+1 1.600000+5 1.153810+1 1.763830+5 1.132800+19552 3 1 - 1.800000+5 1.128270+1 1.842690+5 1.122900+1 1.981100+5 1.106080+19552 3 1 - 2.000000+5 1.103860+1 2.200000+5 1.080960+1 2.292430+5 1.070940+19552 3 1 - 2.400000+5 1.059510+1 2.600000+5 1.039170+1 2.627780+5 1.036420+19552 3 1 - 2.733270+5 1.026100+1 2.800000+5 1.019750+1 2.904070+5 1.009970+19552 3 1 - 2.978840+5 1.003160+1 3.000000+5 1.001260+1 3.240850+5 9.797360+09552 3 1 - 3.369620+5 9.689860+0 3.440660+5 9.632680+0 3.450780+5 9.624650+09552 3 1 - 3.498450+5 9.587230+0 3.500000+5 9.586020+0 3.633330+5 9.479930+09552 3 1 - 3.786150+5 9.364550+0 3.916400+5 9.271130+0 4.000000+5 9.213450+09552 3 1 - 4.003910+5 9.210560+0 4.164030+5 9.095390+0 4.206880+5 9.065640+09552 3 1 - 4.218670+5 9.057530+0 4.229450+5 9.050150+0 4.367980+5 8.957670+09552 3 1 - 4.500000+5 8.873740+0 5.000000+5 8.584780+0 5.500000+5 8.318290+09552 3 1 - 6.000000+5 8.093840+0 6.500000+5 7.886730+0 7.000000+5 7.718960+09552 3 1 - 7.500000+5 7.564190+0 8.000000+5 7.442440+0 9.000000+5 7.246920+09552 3 1 - 1.000000+6 7.119080+0 1.200000+6 7.009710+0 1.400000+6 7.026590+09552 3 1 - 1.600000+6 7.108340+0 1.800000+6 7.214590+0 2.000000+6 7.327060+09552 3 1 - 2.200000+6 7.425750+0 2.400000+6 7.530650+0 2.600000+6 7.598380+09552 3 1 - 2.800000+6 7.669140+0 3.000000+6 7.739490+0 3.500000+6 7.805880+09552 3 1 - 4.000000+6 7.775820+0 4.500000+6 7.636850+0 5.000000+6 7.504650+09552 3 1 - 5.385400+6 7.360690+0 5.500000+6 7.299720+0 6.000000+6 7.114090+09552 3 1 - 6.500000+6 6.851340+0 7.000000+6 6.689290+0 7.500000+6 6.481720+09552 3 1 - 8.000000+6 6.299690+0 9.000000+6 6.020340+0 1.000000+7 5.869020+09552 3 1 - 1.100000+7 5.815070+0 1.177590+7 5.815210+0 1.200000+7 5.824320+09552 3 1 - 1.300000+7 5.860720+0 1.400000+7 5.925180+0 1.500000+7 6.001163+09552 3 1 - 1.600000+7 6.082040+0 1.700000+7 6.153618+0 1.734000+7 6.176980+09552 3 1 - 1.800000+7 6.214500+0 1.900000+7 6.266780+0 2.000000+7 6.305010+09552 3 1 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 2 - 0.000000+0 0.000000+0 0 0 1 779552 3 2 - 77 5 9552 3 2 - 1.000000-5 1.162230+1 1.000000+0 1.162230+1 1.000000+1 1.161200+19552 3 2 - 1.000000+2 1.156890+1 1.000000+3 1.143180+1 2.000000+3 1.134720+19552 3 2 - 4.000000+3 1.121780+1 6.000000+3 1.111370+1 1.000000+4 1.094000+19552 3 2 - 1.400000+4 1.077740+1 2.000000+4 1.059680+1 3.000000+4 1.031640+19552 3 2 - 4.000000+4 1.007160+1 6.000000+4 9.648880+0 8.000000+4 9.285770+09552 3 2 - 8.836370+4 9.146370+0 1.000000+5 8.964140+0 1.007240+5 8.953070+09552 3 2 - 1.237900+5 8.621030+0 1.400000+5 8.408110+0 1.488960+5 8.297250+09552 3 2 - 1.763830+5 7.975920+0 1.842690+5 7.889460+0 1.981100+5 7.741270+09552 3 2 - 2.000000+5 7.721600+0 2.292430+5 7.433220+0 2.400000+5 7.333110+09552 3 2 - 2.627780+5 7.131720+0 2.733270+5 7.042530+0 2.904070+5 6.902930+09552 3 2 - 2.978840+5 6.843680+0 3.000000+5 6.827110+0 3.240850+5 6.644170+09552 3 2 - 3.369620+5 6.549530+0 3.440660+5 6.498720+0 3.450780+5 6.491550+09552 3 2 - 3.498450+5 6.457930+0 3.633330+5 6.364750+0 3.786150+5 6.262670+09552 3 2 - 3.916400+5 6.178480+0 4.000000+5 6.125440+0 4.003910+5 6.122950+09552 3 2 - 4.164030+5 6.021990+0 4.206880+5 5.995670+0 4.218670+5 5.988480+09552 3 2 - 4.229450+5 5.981920+0 4.367980+5 5.899030+0 5.000000+5 5.546890+09552 3 2 - 6.000000+5 5.058240+0 7.000000+5 4.650920+0 8.000000+5 4.320360+09552 3 2 - 9.000000+5 4.070180+0 1.000000+6 3.885850+0 1.200000+6 3.659840+09552 3 2 - 1.400000+6 3.584830+0 1.600000+6 3.614930+0 1.800000+6 3.712560+09552 3 2 - 2.000000+6 3.848320+0 2.400000+6 4.152330+0 3.000000+6 4.523160+09552 3 2 - 3.500000+6 4.685450+0 4.000000+6 4.715210+0 5.000000+6 4.485890+09552 3 2 - 5.385400+6 4.335630+0 6.000000+6 4.068040+0 7.000000+6 3.631090+09552 3 2 - 8.000000+6 3.256350+0 9.000000+6 2.980500+0 1.000000+7 2.811700+09552 3 2 - 1.100000+7 2.735850+0 1.177590+7 2.724200+0 1.300000+7 2.757640+09552 3 2 - 1.400000+7 2.810560+0 1.600000+7 2.934490+0 1.734000+7 3.008010+09552 3 2 - 1.900000+7 3.075070+0 2.000000+7 3.102100+0 9552 3 2 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 4 - 0.000000+0-8.799990+4 0 0 1 629552 3 4 - 62 3 9552 3 4 - 8.836370+4 0.000000+0 1.000000+5 2.670220-9 1.007240+5 3.153100-99552 3 4 - 1.237900+5 3.455080-5 1.400000+5 1.791280-4 1.488960+5 3.031220-49552 3 4 - 1.763830+5 6.766740-3 1.842690+5 8.019350-3 1.981100+5 1.722030-29552 3 4 - 2.000000+5 1.816880-2 2.292430+5 3.283760-2 2.400000+5 3.850760-29552 3 4 - 2.627780+5 5.057940-2 2.733270+5 5.611090-2 2.904070+5 6.664590-29552 3 4 - 2.978840+5 7.124020-2 3.000000+5 7.260570-2 3.240850+5 8.777750-29552 3 4 - 3.369620+5 1.003920-1 3.440660+5 1.065220-1 3.450780+5 1.074290-19552 3 4 - 3.498450+5 1.120510-1 3.633330+5 1.248300-1 3.786150+5 1.392110-19552 3 4 - 3.916400+5 1.512850-1 4.000000+5 1.601080-1 4.003910+5 1.604890-19552 3 4 - 4.164030+5 1.792860-1 4.206880+5 1.838830-1 4.218670+5 1.851420-19552 3 4 - 4.229450+5 1.862920-1 4.367980+5 2.009560-1 5.000000+5 2.874210-19552 3 4 - 6.000000+5 4.623640-1 7.000000+5 6.492230-1 8.000000+5 8.091190-19552 3 4 - 9.000000+5 9.805310-1 1.000000+6 1.170610+0 1.200000+6 1.441900+09552 3 4 - 1.400000+6 1.609720+0 1.600000+6 1.700170+0 1.800000+6 1.727800+09552 3 4 - 2.000000+6 1.711590+0 2.400000+6 1.604750+0 3.000000+6 1.411450+09552 3 4 - 3.500000+6 1.298990+0 4.000000+6 1.253300+0 5.000000+6 1.303590+09552 3 4 - 5.385400+6 1.330990+0 6.000000+6 8.610920-1 7.000000+6 2.085490-19552 3 4 - 8.000000+6 4.400060-2 9.000000+6 1.600770-2 1.000000+7 1.181020-29552 3 4 - 1.100000+7 8.937100-3 1.177590+7 1.086620-2 1.300000+7 1.025450-29552 3 4 - 1.400000+7 9.354570-3 1.600000+7 9.594320-3 1.734000+7 1.052340-29552 3 4 - 1.900000+7 9.938810-3 2.000000+7 9.714910-3 9552 3 4 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 16 --5.363190+6-5.363190+6 0 0 1 169552 3 16 - 16 2 9552 3 16 - 5.385400+6 0.000000+0 6.000000+6 4.830000-1 7.000000+6 9.750000-19552 3 16 - 8.000000+6 8.500000-1 9.000000+6 6.950000-1 1.000000+7 5.860000-19552 3 16 - 1.100000+7 5.620000-1 1.200000+7 5.290000-1 1.300000+7 5.110000-19552 3 16 - 1.400000+7 3.380000-1 1.500000+7 1.740000-1 1.600000+7 7.990000-29552 3 16 - 1.700000+7 3.330000-2 1.800000+7 1.330000-2 1.900000+7 5.190000-39552 3 16 - 2.000000+7 1.990000-3 9552 3 16 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 17 --1.172750+7-1.172750+7 0 0 1 109552 3 17 - 10 2 9552 3 17 - 1.177590+7 0.000000+0 1.200000+7 3.780000-4 1.300000+7 9.460000-29552 3 17 - 1.400000+7 3.400000-1 1.500000+7 5.630000-1 1.600000+7 7.200000-19552 3 17 - 1.700000+7 8.060000-1 1.800000+7 8.630000-1 1.900000+7 8.580000-19552 3 17 - 2.000000+7 7.310000-1 9552 3 17 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 18 - 2.045207+8 2.045207+8 0 0 1 1799552 3 18 - 179 5 9552 3 18 - 1.000000-5 1.160000+5 2.530000-2 2.300000+3 7.000000-2 1.380000+39552 3 18 - 7.000000-2 1.670000+3 2.400000-1 9.008630+2 2.600000-1 8.654740+29552 3 18 - 2.800000-1 8.339970+2 3.000000-1 8.057120+2 3.500000-1 7.459450+29552 3 18 - 4.000000-1 6.977380+2 4.500000-1 6.578290+2 5.000000-1 6.240700+29552 3 18 - 5.500000-1 5.950160+2 6.000000-1 5.696620+2 6.500000-1 5.473120+29552 3 18 - 7.000000-1 5.274050+2 7.500000-1 5.095150+2 8.000000-1 4.933350+29552 3 18 - 9.000000-1 4.650900+2 1.000000+0 4.412210+2 1.200000+0 4.027670+29552 3 18 - 1.400000+0 3.728640+2 1.600000+0 3.487740+2 1.800000+0 3.288200+29552 3 18 - 2.000000+0 3.119400+2 2.200000+0 2.974030+2 2.400000+0 2.847360+29552 3 18 - 2.600000+0 2.735620+2 2.800000+0 2.636040+2 3.000000+0 2.546600+29552 3 18 - 3.500000+0 2.357480+2 4.000000+0 2.205120+2 4.500000+0 2.078920+29552 3 18 - 5.000000+0 1.972070+2 5.500000+0 1.880200+2 6.000000+0 1.800200+29552 3 18 - 6.500000+0 1.729520+2 7.000000+0 1.666550+2 7.500000+0 1.610070+29552 3 18 - 8.000000+0 1.558900+2 9.000000+0 1.469660+2 1.000000+1 1.394170+29552 3 18 - 1.200000+1 1.272520+2 1.400000+1 1.178030+2 1.600000+1 1.101880+29552 3 18 - 1.800000+1 1.038760+2 2.000000+1 9.853880+1 2.200000+1 9.394730+19552 3 18 - 2.400000+1 8.994240+1 2.600000+1 8.640380+1 2.800000+1 8.325600+19552 3 18 - 3.000000+1 8.043170+1 3.500000+1 7.445600+1 4.000000+1 6.963600+19552 3 18 - 4.500000+1 6.564900+1 5.000000+1 6.227510+1 5.500000+1 5.937440+19552 3 18 - 6.000000+1 5.684350+1 6.500000+1 5.461000+1 7.000000+1 5.262090+19552 3 18 - 7.500000+1 5.083310+1 8.000000+1 4.921780+1 9.000000+1 4.639640+19552 3 18 - 1.000000+2 4.401080+1 1.200000+2 4.017150+1 1.400000+2 3.718680+19552 3 18 - 1.600000+2 3.478160+1 1.800000+2 3.279290+1 2.000000+2 3.110800+19552 3 18 - 2.200000+2 2.966000+1 2.400000+2 2.839690+1 2.600000+2 2.728300+19552 3 18 - 2.800000+2 2.629080+1 3.000000+2 2.540070+1 3.500000+2 2.351820+19552 3 18 - 4.000000+2 2.200220+1 4.500000+2 2.074850+1 5.000000+2 1.968660+19552 3 18 - 5.500000+2 1.877550+1 6.000000+2 1.798050+1 6.500000+2 1.727980+19552 3 18 - 7.000000+2 1.665550+1 7.500000+2 1.609530+1 8.000000+2 1.558970+19552 3 18 - 9.000000+2 1.470820+1 1.000000+3 1.396290+1 1.200000+3 1.276500+19552 3 18 - 1.400000+3 1.183750+1 1.600000+3 1.109110+1 1.800000+3 1.047470+19552 3 18 - 2.000000+3 9.955370+0 2.200000+3 9.509300+0 2.400000+3 9.121760+09552 3 18 - 2.600000+3 8.780190+0 2.800000+3 8.477240+0 3.000000+3 8.205700+09552 3 18 - 3.500000+3 7.634770+0 4.000000+3 7.178540+0 4.500000+3 6.802870+09552 3 18 - 5.000000+3 6.487470+0 5.500000+3 6.217850+0 6.000000+3 5.984270+09552 3 18 - 6.500000+3 5.779950+0 7.000000+3 5.599110+0 7.500000+3 5.437960+09552 3 18 - 8.000000+3 5.293120+0 9.000000+3 5.043170+0 1.000000+4 4.835030+09552 3 18 - 1.200000+4 4.506800+0 1.400000+4 4.258940+0 1.600000+4 4.065160+09552 3 18 - 1.800000+4 3.909300+0 2.000000+4 3.781180+0 2.200000+4 3.674360+09552 3 18 - 2.400000+4 3.583930+0 2.600000+4 3.506430+0 2.800000+4 3.439440+09552 3 18 - 3.000000+4 3.380900+0 3.500000+4 3.263490+0 4.000000+4 3.175480+09552 3 18 - 4.500000+4 3.107820+0 5.000000+4 3.054260+0 5.500000+4 3.011090+09552 3 18 - 6.000000+4 2.975680+0 6.500000+4 2.946150+0 7.000000+4 2.921010+09552 3 18 - 7.500000+4 2.899470+0 8.000000+4 2.880610+0 9.000000+4 2.848860+09552 3 18 - 1.000000+5 2.822370+0 1.200000+5 2.777620+0 1.400000+5 2.736980+09552 3 18 - 1.600000+5 2.696310+0 1.800000+5 2.653950+0 2.000000+5 2.609240+09552 3 18 - 2.200000+5 2.562250+0 2.400000+5 2.513290+0 2.600000+5 2.463070+09552 3 18 - 2.800000+5 2.411660+0 3.000000+5 2.359770+0 3.500000+5 2.231090+09552 3 18 - 4.000000+5 2.108720+0 4.500000+5 1.996970+0 5.000000+5 1.898370+09552 3 18 - 5.500000+5 1.814490+0 6.000000+5 1.745830+0 6.500000+5 1.693600+09552 3 18 - 7.000000+5 1.659600+0 7.500000+5 1.645750+0 8.000000+5 1.646990+09552 3 18 - 9.000000+5 1.596780+0 1.000000+6 1.509490+0 1.200000+6 1.467070+09552 3 18 - 1.400000+6 1.492500+0 1.600000+6 1.536290+0 1.800000+6 1.582750+09552 3 18 - 2.000000+6 1.626170+0 2.200000+6 1.665050+0 2.400000+6 1.699640+09552 3 18 - 2.600000+6 1.730010+0 2.800000+6 1.756330+0 3.000000+6 1.778270+09552 3 18 - 3.500000+6 1.809800+0 4.000000+6 1.801740+0 4.500000+6 1.761290+09552 3 18 - 5.000000+6 1.713470+0 5.500000+6 1.687130+0 6.000000+6 1.701540+09552 3 18 - 6.500000+6 1.764980+0 7.000000+6 1.874600+0 7.500000+6 2.013300+09552 3 18 - 8.000000+6 2.149330+0 9.000000+6 2.328830+0 1.000000+7 2.459510+09552 3 18 - 1.200000+7 2.553650+0 1.400000+7 2.427270+0 1.600000+7 2.338060+09552 3 18 - 1.800000+7 2.292090+0 2.000000+7 2.267200+0 9552 3 18 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 37 --1.726870+7-1.726870+7 0 0 1 49552 3 37 - 4 2 9552 3 37 - 1.734000+7 0.000000+0 1.800000+7 5.930000-4 1.900000+7 3.930000-29552 3 37 - 2.000000+7 1.930000-1 9552 3 37 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 51 - 0.000000+0-8.799990+4 0 0 1 629552 3 51 - 62 3 9552 3 51 - 8.836370+4 0.000000+0 1.000000+5 2.670220-9 1.007240+5 3.153100-99552 3 51 - 1.237900+5 6.438420-8 1.400000+5 1.966780-7 1.488960+5 4.695520-79552 3 51 - 1.763830+5 1.700990-6 1.842690+5 2.303770-6 1.981100+5 3.674620-69552 3 51 - 2.000000+5 3.901180-6 2.292430+5 8.845230-6 2.400000+5 1.136080-59552 3 51 - 2.627780+5 1.919750-5 2.733270+5 2.338980-5 2.904070+5 3.092200-59552 3 51 - 2.978840+5 3.476390-5 3.000000+5 3.582800-5 3.240850+5 5.025820-59552 3 51 - 3.369620+5 5.898140-5 3.440660+5 6.436750-5 3.450780+5 6.508290-59552 3 51 - 3.498450+5 6.831350-5 3.633330+5 8.018630-5 3.786150+5 9.357620-59552 3 51 - 3.916400+5 1.063110-4 4.000000+5 1.146680-4 4.003910+5 1.150650-49552 3 51 - 4.164030+5 1.313940-4 4.206880+5 1.358130-4 4.218670+5 1.369180-49552 3 51 - 4.229450+5 1.378650-4 4.367980+5 1.525550-4 5.000000+5 2.337740-49552 3 51 - 6.000000+5 3.824780-4 7.000000+5 5.313350-4 8.000000+5 6.440160-49552 3 51 - 9.000000+5 7.472070-4 1.000000+6 8.394230-4 1.200000+6 8.678650-49552 3 51 - 1.400000+6 7.643070-4 1.600000+6 6.092300-4 1.800000+6 4.523540-49552 3 51 - 2.000000+6 3.202940-4 2.400000+6 1.462840-4 3.000000+6 3.961610-59552 3 51 - 3.500000+6 1.298610-5 4.000000+6 4.467310-6 5.000000+6 6.276270-79552 3 51 - 5.385400+6 3.036990-7 6.000000+6 6.109000-8 7.000000+6 2.330270-99552 3 51 - 8.000000+6 8.35461-11 9.000000+6 5.62988-12 1.000000+7 8.34364-139552 3 51 - 1.100000+7 1.35828-13 1.177590+7 5.21445-14 1.300000+7 8.48932-159552 3 51 - 1.400000+7 1.93951-15 1.600000+7 1.40984-16 1.734000+7 2.84488-179552 3 51 - 1.900000+7 3.56505-18 2.000000+7 1.07168-18 9552 3 51 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 52 - 0.000000+0-1.003090+5 0 0 1 609552 3 52 - 60 3 9552 3 52 - 1.007240+5 0.000000+0 1.237900+5 3.448640-5 1.400000+5 8.056760-59552 3 52 - 1.488960+5 1.132890-4 1.763830+5 2.404830-4 1.842690+5 2.838360-49552 3 52 - 1.981100+5 3.657420-4 2.000000+5 3.774850-4 2.292430+5 5.792590-49552 3 52 - 2.400000+5 6.482720-4 2.627780+5 8.252770-4 2.733270+5 9.122880-49552 3 52 - 2.904070+5 1.040430-3 2.978840+5 1.102210-3 3.000000+5 1.113820-39552 3 52 - 3.240850+5 1.305090-3 3.369620+5 1.410680-3 3.440660+5 1.470470-39552 3 52 - 3.450780+5 1.474840-3 3.498450+5 1.500320-3 3.633330+5 1.592410-39552 3 52 - 3.786150+5 1.709730-3 3.916400+5 1.809900-3 4.000000+5 1.857650-39552 3 52 - 4.003910+5 1.866560-3 4.164030+5 1.969530-3 4.206880+5 1.996770-39552 3 52 - 4.218670+5 2.003720-3 4.229450+5 2.009780-3 4.367980+5 2.084460-39552 3 52 - 5.000000+5 2.446510-3 6.000000+5 2.887650-3 7.000000+5 3.144870-39552 3 52 - 8.000000+5 3.195190-3 9.000000+5 3.235000-3 1.000000+6 3.266820-39552 3 52 - 1.200000+6 2.893940-3 1.400000+6 2.287760-3 1.600000+6 1.678610-39552 3 52 - 1.800000+6 1.165070-3 2.000000+6 7.784340-4 2.400000+6 3.228030-49552 3 52 - 3.000000+6 7.860750-5 3.500000+6 2.427290-5 4.000000+6 8.011130-69552 3 52 - 5.000000+6 1.069110-6 5.385400+6 5.105510-7 6.000000+6 1.011310-79552 3 52 - 7.000000+6 3.804270-9 8.000000+6 1.35537-10 9.000000+6 9.10741-129552 3 52 - 1.000000+7 1.34818-12 1.100000+7 2.19385-13 1.177590+7 8.42149-149552 3 52 - 1.300000+7 1.37132-14 1.400000+7 3.13452-15 1.600000+7 2.28252-169552 3 52 - 1.734000+7 4.61244-17 1.900000+7 5.79017-18 2.000000+7 1.74228-189552 3 52 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 53 - 0.000000+0-1.232810+5 0 0 1 599552 3 53 - 59 3 9552 3 53 - 1.237900+5 0.000000+0 1.400000+5 9.836410-5 1.488960+5 1.893630-49552 3 53 - 1.763830+5 6.073100-4 1.842690+5 7.645880-4 1.981100+5 1.048580-39552 3 53 - 2.000000+5 1.091520-3 2.292430+5 1.844110-3 2.400000+5 2.136410-39552 3 53 - 2.627780+5 2.838880-3 2.733270+5 3.185560-3 2.904070+5 3.695960-39552 3 53 - 2.978840+5 3.942110-3 3.000000+5 4.001120-3 3.240850+5 4.799550-39552 3 53 - 3.369620+5 5.195330-3 3.440660+5 5.428710-3 3.450780+5 5.455170-39552 3 53 - 3.498450+5 5.563200-3 3.633330+5 5.944970-3 3.786150+5 6.398060-39552 3 53 - 3.916400+5 6.796720-3 4.000000+5 7.015860-3 4.003910+5 7.034080-39552 3 53 - 4.164030+5 7.404680-3 4.206880+5 7.508780-3 4.218670+5 7.536890-39552 3 53 - 4.229450+5 7.562270-3 4.367980+5 7.874150-3 5.000000+5 9.162100-39552 3 53 - 6.000000+5 1.028910-2 7.000000+5 1.046150-2 8.000000+5 9.870880-39552 3 53 - 9.000000+5 9.325240-3 1.000000+6 8.847160-3 1.200000+6 7.076790-39552 3 53 - 1.400000+6 5.178900-3 1.600000+6 3.577170-3 1.800000+6 2.362630-39552 3 53 - 2.000000+6 1.511930-3 2.400000+6 5.818980-4 3.000000+6 1.295060-49552 3 53 - 3.500000+6 3.781340-5 4.000000+6 1.197240-5 5.000000+6 1.514100-69552 3 53 - 5.385400+6 7.130810-7 6.000000+6 1.389920-7 7.000000+6 5.153310-99552 3 53 - 8.000000+6 1.82360-10 9.000000+6 1.22106-11 1.000000+7 1.80417-129552 3 53 - 1.100000+7 2.93322-13 1.177590+7 1.12566-13 1.300000+7 1.83320-149552 3 53 - 1.400000+7 4.19254-15 1.600000+7 3.05932-16 1.734000+7 6.19320-179552 3 53 - 1.900000+7 7.79268-18 2.000000+7 2.34808-18 9552 3 53 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 54 - 0.000000+0-1.482830+5 0 0 1 579552 3 54 - 57 3 9552 3 54 - 1.488960+5 0.000000+0 1.763830+5 5.917240-3 1.842690+5 6.968200-39552 3 54 - 1.981100+5 8.601540-3 2.000000+5 8.821040-3 2.292430+5 1.214650-29552 3 54 - 2.400000+5 1.329660-2 2.627780+5 1.572400-2 2.733270+5 1.682570-29552 3 54 - 2.904070+5 1.845990-2 2.978840+5 1.917950-2 3.000000+5 1.937020-29552 3 54 - 3.240850+5 2.158280-2 3.369620+5 2.247120-2 3.440660+5 2.302750-29552 3 54 - 3.450780+5 2.310060-2 3.498450+5 2.340530-2 3.633330+5 2.434890-29552 3 54 - 3.786150+5 2.541880-2 3.916400+5 2.632540-2 4.000000+5 2.678930-29552 3 54 - 4.003910+5 2.681060-2 4.164030+5 2.739500-2 4.206880+5 2.758840-29552 3 54 - 4.218670+5 2.764190-2 4.229450+5 2.769080-2 4.367980+5 2.829970-29552 3 54 - 5.000000+5 3.043740-2 6.000000+5 3.080430-2 7.000000+5 2.860440-29552 3 54 - 8.000000+5 2.488240-2 9.000000+5 2.188020-2 1.000000+6 1.949740-29552 3 54 - 1.200000+6 1.410870-2 1.400000+6 9.598070-3 1.600000+6 6.281160-39552 3 54 - 1.800000+6 3.979830-3 2.000000+6 2.461940-3 2.400000+6 8.965290-49552 3 54 - 3.000000+6 1.868660-4 3.500000+6 5.229710-5 4.000000+6 1.601560-59552 3 54 - 5.000000+6 1.933990-6 5.385400+6 8.994970-7 6.000000+6 1.727550-79552 3 54 - 7.000000+6 6.318360-9 8.000000+6 2.22126-10 9.000000+6 1.48218-119552 3 54 - 1.000000+7 2.18600-12 1.100000+7 3.55095-13 1.177590+7 1.36235-139552 3 54 - 1.300000+7 2.21881-14 1.400000+7 5.07677-15 1.600000+7 3.71194-169552 3 54 - 1.734000+7 7.52841-17 1.900000+7 9.49729-18 2.000000+7 2.86632-189552 3 54 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 55 - 0.000000+0-1.756570+5 0 0 1 569552 3 55 - 56 3 9552 3 55 - 1.763830+5 0.000000+0 1.842690+5 4.269190-7 1.981100+5 2.258650-69552 3 55 - 2.000000+5 2.604730-6 2.292430+5 1.087030-5 2.400000+5 1.587820-59552 3 55 - 2.627780+5 2.884820-5 2.733270+5 3.612620-5 2.904070+5 4.925690-59552 3 55 - 2.978840+5 5.571970-5 3.000000+5 5.745550-5 3.240850+5 8.053400-59552 3 55 - 3.369620+5 9.468180-5 3.440660+5 1.030530-4 3.450780+5 1.041010-49552 3 55 - 3.498450+5 1.092800-4 3.633330+5 1.238410-4 3.786150+5 1.427860-49552 3 55 - 3.916400+5 1.602830-4 4.000000+5 1.716060-4 4.003910+5 1.721500-49552 3 55 - 4.164030+5 1.948380-4 4.206880+5 2.002100-4 4.218670+5 2.013380-49552 3 55 - 4.229450+5 2.021810-4 4.367980+5 2.193170-4 5.000000+5 3.175570-49552 3 55 - 6.000000+5 4.874840-4 7.000000+5 6.517000-4 8.000000+5 7.888450-49552 3 55 - 9.000000+5 9.295560-4 1.000000+6 1.075570-3 1.200000+6 1.203320-39552 3 55 - 1.400000+6 1.142790-3 1.600000+6 9.602780-4 1.800000+6 7.321030-49552 3 55 - 2.000000+6 5.192600-4 2.400000+6 2.261410-4 3.000000+6 5.447180-59552 3 55 - 3.500000+6 1.627590-5 4.000000+6 5.169370-6 5.000000+6 6.384690-79552 3 55 - 5.385400+6 2.986430-7 6.000000+6 5.845470-8 7.000000+6 2.244880-99552 3 55 - 8.000000+6 8.23914-11 9.000000+6 5.62706-12 1.000000+7 8.35509-139552 3 55 - 1.100000+7 1.35677-13 1.177590+7 5.19946-14 1.300000+7 8.45074-159552 3 55 - 1.400000+7 1.92916-15 1.600000+7 1.40197-16 1.734000+7 2.83052-179552 3 55 - 1.900000+7 3.55043-18 2.000000+7 1.06783-18 9552 3 55 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 56 - 0.000000+0-1.835110+5 0 0 1 559552 3 56 - 55 3 9552 3 56 - 1.842690+5 0.000000+0 1.981100+5 7.198460-3 2.000000+5 7.872080-39552 3 56 - 2.292430+5 1.822950-2 2.400000+5 2.200600-2 2.627780+5 2.988300-29552 3 56 - 2.733270+5 3.341140-2 2.904070+5 3.879670-2 2.978840+5 4.106460-29552 3 56 - 3.000000+5 4.169560-2 3.240850+5 4.849270-2 3.369620+5 5.153330-29552 3 56 - 3.440660+5 5.320080-2 3.450780+5 5.343400-2 3.498450+5 5.447800-29552 3 56 - 3.633330+5 5.731890-2 3.786150+5 6.032370-2 3.916400+5 6.273390-29552 3 56 - 4.000000+5 6.407310-2 4.003910+5 6.413400-2 4.164030+5 6.603930-29552 3 56 - 4.206880+5 6.655290-2 4.218670+5 6.669240-2 4.229450+5 6.681930-29552 3 56 - 4.367980+5 6.838810-2 5.000000+5 7.307430-2 6.000000+5 7.177440-29552 3 56 - 7.000000+5 6.422060-2 8.000000+5 5.387370-2 9.000000+5 4.590220-29552 3 56 - 1.000000+6 3.989410-2 1.200000+6 2.804510-2 1.400000+6 1.893650-29552 3 56 - 1.600000+6 1.241620-2 1.800000+6 7.880860-3 2.000000+6 4.855350-39552 3 56 - 2.400000+6 1.713460-3 3.000000+6 3.272480-4 3.500000+6 8.413100-59552 3 56 - 4.000000+6 2.369560-5 5.000000+6 2.470910-6 5.385400+6 1.101680-69552 3 56 - 6.000000+6 2.029680-7 7.000000+6 7.315250-9 8.000000+6 2.58716-109552 3 56 - 9.000000+6 1.72457-11 1.000000+7 2.52039-12 1.100000+7 4.05701-139552 3 56 - 1.177590+7 1.54995-13 1.300000+7 2.51780-14 1.400000+7 5.75980-159552 3 56 - 1.600000+7 4.21880-16 1.734000+7 8.57297-17 1.900000+7 1.08451-179552 3 56 - 2.000000+7 3.27886-18 9552 3 56 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 57 - 0.000000+0-1.972950+5 0 0 1 549552 3 57 - 54 3 9552 3 57 - 1.981100+5 0.000000+0 2.000000+5 2.066770-7 2.292430+5 1.854380-59552 3 57 - 2.400000+5 3.118960-5 2.627780+5 7.164320-5 2.733270+5 9.543880-59552 3 57 - 2.904070+5 1.401230-4 2.978840+5 1.626510-4 3.000000+5 1.690790-49552 3 57 - 3.240850+5 2.532340-4 3.369620+5 3.044350-4 3.440660+5 3.352550-49552 3 57 - 3.450780+5 3.394640-4 3.498450+5 3.589760-4 3.633330+5 4.146350-49552 3 57 - 3.786150+5 4.870130-4 3.916400+5 5.542100-4 4.000000+5 5.969670-49552 3 57 - 4.003910+5 5.989960-4 4.164030+5 6.836770-4 4.206880+5 7.061580-49552 3 57 - 4.218670+5 7.118080-4 4.229450+5 7.166780-4 4.367980+5 7.906360-49552 3 57 - 5.000000+5 1.179790-3 6.000000+5 1.813390-3 7.000000+5 2.359580-39552 3 57 - 8.000000+5 2.728020-3 9.000000+5 3.054660-3 1.000000+6 3.350940-39552 3 57 - 1.200000+6 3.389310-3 1.400000+6 2.960430-3 1.600000+6 2.330660-39552 3 57 - 1.800000+6 1.690370-3 2.000000+6 1.152790-3 2.400000+6 4.727770-49552 3 57 - 3.000000+6 1.063520-4 3.500000+6 3.040250-5 4.000000+6 9.332010-69552 3 57 - 5.000000+6 1.100500-6 5.385400+6 5.081000-7 6.000000+6 9.784960-89552 3 57 - 7.000000+6 3.697220-9 8.000000+6 1.34506-10 9.000000+6 9.13637-129552 3 57 - 1.000000+7 1.35202-12 1.100000+7 2.19165-13 1.177590+7 8.39419-149552 3 57 - 1.300000+7 1.36439-14 1.400000+7 3.11655-15 1.600000+7 2.26949-169552 3 57 - 1.734000+7 4.58883-17 1.900000+7 5.76588-18 2.000000+7 1.73580-189552 3 57 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 58 - 0.000000+0-2.282990+5 0 0 1 529552 3 58 - 52 3 9552 3 58 - 2.292430+5 0.000000+0 2.400000+5 3.617800-4 2.627780+5 1.188550-39552 3 58 - 2.733270+5 1.615950-3 2.904070+5 2.311290-3 2.978840+5 2.617360-39552 3 58 - 3.000000+5 2.699050-3 3.240850+5 3.643190-3 3.369620+5 4.118420-39552 3 58 - 3.440660+5 4.373340-3 3.450780+5 4.405550-3 3.498450+5 4.556290-39552 3 58 - 3.633330+5 4.975080-3 3.786150+5 5.430320-3 3.916400+5 5.804120-39552 3 58 - 4.000000+5 5.974820-3 4.003910+5 5.985620-3 4.164030+5 6.331180-39552 3 58 - 4.206880+5 6.423060-3 4.218670+5 6.447690-3 4.229450+5 6.469880-39552 3 58 - 4.367980+5 6.746120-3 5.000000+5 7.854230-3 6.000000+5 8.922700-39552 3 58 - 7.000000+5 9.316740-3 8.000000+5 9.119330-3 9.000000+5 9.003840-39552 3 58 - 1.000000+6 8.949780-3 1.200000+6 7.867770-3 1.400000+6 6.270960-39552 3 58 - 1.600000+6 4.639870-3 1.800000+6 3.219880-3 2.000000+6 2.122660-39552 3 58 - 2.400000+6 8.259430-4 3.000000+6 1.743460-4 3.500000+6 4.767820-59552 3 58 - 4.000000+6 1.411600-5 5.000000+6 1.582850-6 5.385400+6 7.205220-79552 3 58 - 6.000000+6 1.363390-7 7.000000+6 5.061640-9 8.000000+6 1.82336-109552 3 58 - 9.000000+6 1.23037-11 1.000000+7 1.81269-12 1.100000+7 2.93121-139552 3 58 - 1.177590+7 1.12177-13 1.300000+7 1.82323-14 1.400000+7 4.16728-159552 3 58 - 1.600000+7 3.04143-16 1.734000+7 6.16051-17 1.900000+7 7.75788-189552 3 58 - 2.000000+7 2.33855-18 9552 3 58 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 59 - 0.000000+0-2.616960+5 0 0 1 509552 3 59 - 50 3 9552 3 59 - 2.627780+5 0.000000+0 2.733270+5 5.068260-6 2.904070+5 2.243130-59552 3 59 - 2.978840+5 3.290740-5 3.000000+5 3.614400-5 3.240850+5 8.312260-59552 3 59 - 3.369620+5 1.145840-4 3.440660+5 1.340910-4 3.450780+5 1.369030-49552 3 59 - 3.498450+5 1.502430-4 3.633330+5 1.883730-4 3.786150+5 2.386460-49552 3 59 - 3.916400+5 2.863670-4 4.000000+5 3.175900-4 4.003910+5 3.190830-49552 3 59 - 4.164030+5 3.829700-4 4.206880+5 4.000940-4 4.218670+5 4.044330-49552 3 59 - 4.229450+5 4.081900-4 4.367980+5 4.656020-4 5.000000+5 7.762640-49552 3 59 - 6.000000+5 1.326600-3 7.000000+5 1.835100-3 8.000000+5 2.204800-39552 3 59 - 9.000000+5 2.545070-3 1.000000+6 2.855620-3 1.200000+6 2.990890-39552 3 59 - 1.400000+6 2.683400-3 1.600000+6 2.159410-3 1.800000+6 1.594080-39552 3 59 - 2.000000+6 1.101420-3 2.400000+6 4.588800-4 3.000000+6 1.041910-49552 3 59 - 3.500000+6 2.987360-5 4.000000+6 9.189020-6 5.000000+6 1.086700-69552 3 59 - 5.385400+6 5.019020-7 6.000000+6 9.672110-8 7.000000+6 3.662460-99552 3 59 - 8.000000+6 1.33497-10 9.000000+6 9.07659-12 1.000000+7 1.34402-129552 3 59 - 1.100000+7 2.18013-13 1.177590+7 8.35446-14 1.300000+7 1.35881-149552 3 59 - 1.400000+7 3.10478-15 1.600000+7 2.26213-16 1.734000+7 4.57548-179552 3 59 - 1.900000+7 5.75131-18 2.000000+7 1.73173-18 9552 3 59 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 60 - 0.000000+0-2.722020+5 0 0 1 499552 3 60 - 49 3 9552 3 60 - 2.733270+5 0.000000+0 2.904070+5 2.098870-3 2.978840+5 3.047500-39552 3 60 - 3.000000+5 3.322430-3 3.240850+5 6.648890-3 3.369620+5 8.429240-39552 3 60 - 3.440660+5 9.403800-3 3.450780+5 9.538810-3 3.498450+5 1.015130-29552 3 60 - 3.633330+5 1.187650-2 3.786150+5 1.373880-2 3.916400+5 1.525090-29552 3 60 - 4.000000+5 1.610470-2 4.003910+5 1.614460-2 4.164030+5 1.763000-29552 3 60 - 4.206880+5 1.801410-2 4.218670+5 1.811830-2 4.229450+5 1.821280-29552 3 60 - 4.367980+5 1.937640-2 5.000000+5 2.348820-2 6.000000+5 2.608020-29552 3 60 - 7.000000+5 2.550410-2 8.000000+5 2.306240-2 9.000000+5 2.101630-29552 3 60 - 1.000000+6 1.940640-2 1.200000+6 1.513340-2 1.400000+6 1.109400-29552 3 60 - 1.600000+6 7.759540-3 1.800000+6 5.180810-3 2.000000+6 3.320410-39552 3 60 - 2.400000+6 1.239470-3 3.000000+6 2.493350-4 3.500000+6 6.594580-59552 3 60 - 4.000000+6 1.898620-5 5.000000+6 2.043340-6 5.385400+6 9.189680-79552 3 60 - 6.000000+6 1.712500-7 7.000000+6 6.259960-9 8.000000+6 2.23515-109552 3 60 - 9.000000+6 1.49900-11 1.000000+7 2.19930-12 1.100000+7 3.54848-139552 3 60 - 1.177590+7 1.35708-13 1.300000+7 2.20573-14 1.400000+7 5.04436-159552 3 60 - 1.600000+7 3.68937-16 1.734000+7 7.48677-17 1.900000+7 9.45186-189552 3 60 - 2.000000+7 2.85368-18 9552 3 60 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 61 - 0.000000+0-2.892120+5 0 0 1 489552 3 61 - 48 3 9552 3 61 - 2.904070+5 0.000000+0 2.978840+5 9.428020-7 3.000000+5 1.352530-69552 3 61 - 3.240850+5 8.866250-6 3.369620+5 1.460170-5 3.440660+5 1.821550-59552 3 61 - 3.450780+5 1.874230-5 3.498450+5 2.174090-5 3.633330+5 2.940430-59552 3 61 - 3.786150+5 3.957340-5 3.916400+5 4.927970-5 4.000000+5 5.598720-59552 3 61 - 4.003910+5 5.630040-5 4.164030+5 7.003490-5 4.206880+5 7.341030-59552 3 61 - 4.218670+5 7.414870-5 4.229450+5 7.471950-5 4.367980+5 8.593100-59552 3 61 - 5.000000+5 1.511130-4 6.000000+5 2.774740-4 7.000000+5 4.102140-49552 3 61 - 8.000000+5 5.276210-4 9.000000+5 6.542080-4 1.000000+6 7.870690-49552 3 61 - 1.200000+6 9.392530-4 1.400000+6 9.407910-4 1.600000+6 8.260790-49552 3 61 - 1.800000+6 6.523220-4 2.000000+6 4.747500-4 2.400000+6 2.131840-49552 3 61 - 3.000000+6 5.227020-5 3.500000+6 1.571330-5 4.000000+6 5.013700-69552 3 61 - 5.000000+6 6.230940-7 5.385400+6 2.917200-7 6.000000+6 5.719340-89552 3 61 - 7.000000+6 2.206150-9 8.000000+6 8.12705-11 9.000000+6 5.56074-129552 3 61 - 1.000000+7 8.26668-13 1.100000+7 1.34408-13 1.177590+7 5.15587-149552 3 61 - 1.300000+7 8.38994-15 1.400000+7 1.91638-15 1.600000+7 1.39404-169552 3 61 - 1.734000+7 2.81615-17 1.900000+7 3.53477-18 2.000000+7 1.06347-189552 3 61 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 62 - 0.000000+0-2.966580+5 0 0 1 479552 3 62 - 47 3 9552 3 62 - 2.978840+5 0.000000+0 3.000000+5 1.036120-4 3.240850+5 8.293700-49552 3 62 - 3.369620+5 1.272510-3 3.440660+5 1.523200-3 3.450780+5 1.556610-39552 3 62 - 3.498450+5 1.716250-3 3.633330+5 2.176840-3 3.786150+5 2.686690-39552 3 62 - 3.916400+5 3.109440-3 4.000000+5 3.338620-3 4.003910+5 3.349520-39552 3 62 - 4.164030+5 3.786260-3 4.206880+5 3.899640-3 4.218670+5 3.930220-39552 3 62 - 4.229450+5 3.957860-3 4.367980+5 4.299590-3 5.000000+5 5.646690-39552 3 62 - 6.000000+5 7.007710-3 7.000000+5 7.647340-3 8.000000+5 7.687160-39552 3 62 - 9.000000+5 7.729500-3 1.000000+6 7.795180-3 1.200000+6 7.018640-39552 3 62 - 1.400000+6 5.713490-3 1.600000+6 4.308450-3 1.800000+6 3.038360-39552 3 62 - 2.000000+6 2.028500-3 2.400000+6 8.021400-4 3.000000+6 1.710350-49552 3 62 - 3.500000+6 4.691510-5 4.000000+6 1.391530-5 5.000000+6 1.563880-69552 3 62 - 5.385400+6 7.120070-7 6.000000+6 1.347790-7 7.000000+6 5.013110-99552 3 62 - 8.000000+6 1.80928-10 9.000000+6 1.22205-11 1.000000+7 1.80153-129552 3 62 - 1.100000+7 2.91501-13 1.177590+7 1.11615-13 1.300000+7 1.81530-149552 3 62 - 1.400000+7 4.15047-15 1.600000+7 3.03085-16 1.734000+7 6.14124-179552 3 62 - 1.900000+7 7.73676-18 2.000000+7 2.33265-18 9552 3 62 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 63 - 0.000000+0-3.227510+5 0 0 1 459552 3 63 - 45 3 9552 3 63 - 3.240850+5 0.000000+0 3.369620+5 5.374380-3 3.440660+5 7.439660-39552 3 63 - 3.450780+5 7.732340-3 3.498450+5 9.097960-3 3.633330+5 1.297290-29552 3 63 - 3.786150+5 1.731490-2 3.916400+5 2.093770-2 4.000000+5 2.316360-29552 3 63 - 4.003910+5 2.325990-2 4.164030+5 2.707140-2 4.206880+5 2.806880-29552 3 63 - 4.218670+5 2.834020-2 4.229450+5 2.858730-2 4.367980+5 3.166200-29552 3 63 - 5.000000+5 4.269860-2 6.000000+5 4.997820-2 7.000000+5 4.872250-29552 3 63 - 8.000000+5 4.286730-2 9.000000+5 3.758490-2 1.000000+6 3.327740-29552 3 63 - 1.200000+6 2.396140-2 1.400000+6 1.651180-2 1.600000+6 1.106020-29552 3 63 - 1.800000+6 7.170300-3 2.000000+6 4.500350-3 2.400000+6 1.630550-39552 3 63 - 3.000000+6 3.171390-4 3.500000+6 8.198420-5 4.000000+6 2.315570-59552 3 63 - 5.000000+6 2.421230-6 5.385400+6 1.079290-6 6.000000+6 1.988270-79552 3 63 - 7.000000+6 7.184810-9 8.000000+6 2.54924-10 9.000000+6 1.70216-119552 3 63 - 1.000000+7 2.49017-12 1.100000+7 4.01266-13 1.177590+7 1.53444-139552 3 63 - 1.300000+7 2.49566-14 1.400000+7 5.71253-15 1.600000+7 4.18865-169552 3 63 - 1.734000+7 8.51756-17 1.900000+7 1.07836-17 2.000000+7 3.26155-189552 3 63 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 64 - 0.000000+0-3.355750+5 0 0 1 449552 3 64 - 44 3 9552 3 64 - 3.369620+5 0.000000+0 3.440660+5 3.28256-11 3.450780+5 4.58431-119552 3 64 - 3.498450+5 1.48664-10 3.633330+5 9.52166-10 3.786150+5 3.134860-99552 3 64 - 3.916400+5 6.527790-9 4.000000+5 2.804570-8 4.003910+5 2.861540-89552 3 64 - 4.164030+5 6.027460-8 4.206880+5 7.178340-8 4.218670+5 7.516170-89552 3 64 - 4.229450+5 7.832040-8 4.367980+5 1.286980-7 5.000000+5 6.881900-79552 3 64 - 6.000000+5 3.948060-6 7.000000+5 1.162580-5 8.000000+5 2.433230-59552 3 64 - 9.000000+5 4.355790-5 1.000000+6 7.087530-5 1.200000+6 1.266360-49552 3 64 - 1.400000+6 1.637120-4 1.600000+6 1.696500-4 1.800000+6 1.497440-49552 3 64 - 2.000000+6 1.176900-4 2.400000+6 5.810520-5 3.000000+6 1.532700-59552 3 64 - 3.500000+6 4.768660-6 4.000000+6 1.557770-6 5.000000+6 1.997360-79552 3 64 - 5.385400+6 9.434490-8 6.000000+6 1.871520-8 7.000000+6 7.31738-109552 3 64 - 8.000000+6 2.71652-11 9.000000+6 1.86629-12 1.000000+7 2.78069-139552 3 64 - 1.100000+7 4.52758-14 1.177590+7 1.73819-14 1.300000+7 2.83071-159552 3 64 - 1.400000+7 6.46672-16 1.600000+7 4.70212-17 1.734000+7 9.49418-189552 3 64 - 1.900000+7 1.19096-18 2.000000+7 3.58185-19 9552 3 64 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 65 - 0.000000+0-3.426500+5 0 0 1 439552 3 65 - 43 3 9552 3 65 - 3.440660+5 0.000000+0 3.450780+5 6.654720-5 3.498450+5 1.963500-49552 3 65 - 3.633330+5 5.567780-4 3.786150+5 1.010490-3 3.916400+5 1.414860-39552 3 65 - 4.000000+5 1.660270-3 4.003910+5 1.671890-3 4.164030+5 2.142790-39552 3 65 - 4.206880+5 2.265750-3 4.218670+5 2.299190-3 4.229450+5 2.329570-39552 3 65 - 4.367980+5 2.706670-3 5.000000+5 4.211520-3 6.000000+5 5.791140-39552 3 65 - 7.000000+5 6.606840-3 8.000000+5 6.801380-3 9.000000+5 6.938630-39552 3 65 - 1.000000+6 7.077070-3 1.200000+6 6.477970-3 1.400000+6 5.350230-39552 3 65 - 1.600000+6 4.087150-3 1.800000+6 2.914630-3 2.000000+6 1.963490-39552 3 65 - 2.400000+6 7.856410-4 3.000000+6 1.687800-4 3.500000+6 4.640030-59552 3 65 - 4.000000+6 1.378010-5 5.000000+6 1.551120-6 5.385400+6 7.062980-79552 3 65 - 6.000000+6 1.337310-7 7.000000+6 4.980210-9 8.000000+6 1.79973-109552 3 65 - 9.000000+6 1.21643-11 1.000000+7 1.79401-12 1.100000+7 2.90408-139552 3 65 - 1.177590+7 1.11236-13 1.300000+7 1.80994-14 1.400000+7 4.13913-159552 3 65 - 1.600000+7 3.02371-16 1.734000+7 6.12823-17 1.900000+7 7.72250-189552 3 65 - 2.000000+7 2.32866-18 9552 3 65 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 66 - 0.000000+0-3.436580+5 0 0 1 429552 3 66 - 42 3 9552 3 66 - 3.450780+5 0.000000+0 3.498450+5 6.772170-4 3.633330+5 2.058860-39552 3 66 - 3.786150+5 3.787120-3 3.916400+5 5.328190-3 4.000000+5 6.297140-39552 3 66 - 4.003910+5 6.342060-3 4.164030+5 8.124790-3 4.206880+5 8.592590-39552 3 66 - 4.218670+5 8.720290-3 4.229450+5 8.836620-3 4.367980+5 1.028880-29552 3 66 - 5.000000+5 1.576510-2 6.000000+5 2.030550-2 7.000000+5 2.118660-29552 3 66 - 8.000000+5 1.982140-2 9.000000+5 1.842370-2 1.000000+6 1.723930-29552 3 66 - 1.200000+6 1.368310-2 1.400000+6 1.018520-2 1.600000+6 7.230410-39552 3 66 - 1.800000+6 4.894460-3 2.000000+6 3.173790-3 2.400000+6 1.203960-39552 3 66 - 3.000000+6 2.448260-4 3.500000+6 6.496390-5 4.000000+6 1.873520-59552 3 66 - 5.000000+6 2.020060-6 5.385400+6 9.085330-7 6.000000+6 1.693250-79552 3 66 - 7.000000+6 6.199310-9 8.000000+6 2.21755-10 9.000000+6 1.48864-119552 3 66 - 1.000000+7 2.18540-12 1.100000+7 3.52816-13 1.177590+7 1.35000-139552 3 66 - 1.300000+7 2.19567-14 1.400000+7 5.02298-15 1.600000+7 3.67581-169552 3 66 - 1.734000+7 7.46196-17 1.900000+7 9.42451-18 2.000000+7 2.84600-189552 3 66 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 67 - 0.000000+0-3.484050+5 0 0 1 419552 3 67 - 41 3 9552 3 67 - 3.498450+5 0.000000+0 3.633330+5 1.710220-4 3.786150+5 3.790230-49552 3 67 - 3.916400+5 5.877220-4 4.000000+5 7.315430-4 4.003910+5 7.383080-49552 3 67 - 4.164030+5 1.024970-3 4.206880+5 1.104910-3 4.218670+5 1.126870-39552 3 67 - 4.229450+5 1.146880-3 4.367980+5 1.408760-3 5.000000+5 2.643190-39552 3 67 - 6.000000+5 4.272820-3 7.000000+5 5.260990-3 8.000000+5 5.580240-39552 3 67 - 9.000000+5 5.716080-3 1.000000+6 5.765470-3 1.200000+6 5.050440-39552 3 67 - 1.400000+6 3.959030-3 1.600000+6 2.886150-3 1.800000+6 1.988420-39552 3 67 - 2.000000+6 1.312800-3 2.400000+6 5.249110-4 3.000000+6 1.197210-49552 3 67 - 3.500000+6 3.528600-5 4.000000+6 1.124890-5 5.000000+6 1.438320-69552 3 67 - 5.385400+6 6.798290-7 6.000000+6 1.333910-7 7.000000+6 5.000770-99552 3 67 - 8.000000+6 1.78041-10 9.000000+6 1.19416-11 1.000000+7 1.76649-129552 3 67 - 1.100000+7 2.87824-13 1.177590+7 1.10673-13 1.300000+7 1.80675-149552 3 67 - 1.400000+7 4.13679-15 1.600000+7 3.02444-16 1.734000+7 6.12983-179552 3 67 - 1.900000+7 7.72329-18 2.000000+7 2.32867-18 9552 3 67 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 68 - 0.000000+0-3.618370+5 0 0 1 409552 3 68 - 40 3 9552 3 68 - 3.633330+5 0.000000+0 3.786150+5 1.212520-5 3.916400+5 3.019950-59552 3 68 - 4.000000+5 4.430450-5 4.003910+5 4.500210-5 4.164030+5 7.710010-59552 3 68 - 4.206880+5 8.638540-5 4.218670+5 9.012120-5 4.229450+5 9.239760-59552 3 68 - 4.367980+5 1.261450-4 5.000000+5 3.293400-4 6.000000+5 7.490180-49552 3 68 - 7.000000+5 1.189370-3 8.000000+5 1.547350-3 9.000000+5 1.878560-39552 3 68 - 1.000000+6 2.192200-3 1.200000+6 2.427280-3 1.400000+6 2.274940-39552 3 68 - 1.600000+6 1.897660-3 1.800000+6 1.442090-3 2.000000+6 1.018930-39552 3 68 - 2.400000+6 4.365350-4 3.000000+6 1.008080-4 3.500000+6 2.905360-59552 3 68 - 4.000000+6 8.966860-6 5.000000+6 1.065300-6 5.385400+6 4.923200-79552 3 68 - 6.000000+6 9.496800-8 7.000000+6 3.607820-9 8.000000+6 1.31914-109552 3 68 - 9.000000+6 8.98336-12 1.000000+7 1.33157-12 1.100000+7 2.16212-139552 3 68 - 1.177590+7 8.29231-14 1.300000+7 1.35010-14 1.400000+7 3.08642-159552 3 68 - 1.600000+7 2.25066-16 1.734000+7 4.55464-17 1.900000+7 5.72853-189552 3 68 - 2.000000+7 1.72538-18 9552 3 68 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 69 - 0.000000+0-3.770560+5 0 0 1 399552 3 69 - 39 3 9552 3 69 - 3.786150+5 0.000000+0 3.916400+5 2.267320-8 4.000000+5 5.885550-89552 3 69 - 4.003910+5 6.099410-8 4.164030+5 1.890200-7 4.206880+5 2.361440-79552 3 69 - 4.218670+5 2.495270-7 4.229450+5 2.617510-7 4.367980+5 4.956330-79552 3 69 - 5.000000+5 2.711560-6 6.000000+5 1.136890-5 7.000000+5 2.608970-59552 3 69 - 8.000000+5 4.357150-5 9.000000+5 6.340370-5 1.000000+6 8.491550-59552 3 69 - 1.200000+6 1.124820-4 1.400000+6 1.178860-4 1.600000+6 1.067950-49552 3 69 - 1.800000+6 8.761600-5 2.000000+6 6.697780-5 2.400000+6 3.411760-59552 3 69 - 3.000000+6 1.023690-5 3.500000+6 3.547830-6 4.000000+6 1.271320-69552 3 69 - 5.000000+6 1.888530-7 5.385400+6 9.288150-8 6.000000+6 1.912100-89552 3 69 - 7.000000+6 7.51009-10 8.000000+6 2.73235-11 9.000000+6 1.84993-129552 3 69 - 1.000000+7 2.74770-13 1.100000+7 4.48614-14 1.177590+7 1.72672-149552 3 69 - 1.300000+7 2.82029-15 1.400000+7 6.45259-16 1.600000+7 4.69889-179552 3 69 - 1.734000+7 9.48920-18 1.900000+7 1.19004-18 2.000000+7 3.57832-199552 3 69 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 70 - 0.000000+0-3.900270+5 0 0 1 389552 3 70 - 38 3 9552 3 70 - 3.916400+5 0.000000+0 4.000000+5 1.800590-3 4.003910+5 1.845510-39552 3 70 - 4.164030+5 3.361170-3 4.206880+5 3.719520-3 4.218670+5 3.816420-39552 3 70 - 4.229450+5 3.904490-3 4.367980+5 4.996960-3 5.000000+5 9.345540-39552 3 70 - 6.000000+5 1.378310-2 7.000000+5 1.544390-2 8.000000+5 1.502520-29552 3 70 - 9.000000+5 1.422690-2 1.000000+6 1.336690-2 1.200000+6 1.041600-29552 3 70 - 1.400000+6 7.486320-3 1.600000+6 5.124940-3 1.800000+6 3.370170-39552 3 70 - 2.000000+6 2.146290-3 2.400000+6 8.115820-4 3.000000+6 1.734440-49552 3 70 - 3.500000+6 4.897320-5 4.000000+6 1.508580-5 5.000000+6 1.838890-69552 3 70 - 5.385400+6 8.578720-7 6.000000+6 1.657320-7 7.000000+6 6.124920-99552 3 70 - 8.000000+6 2.16602-10 9.000000+6 1.44766-11 1.000000+7 2.13750-129552 3 70 - 1.100000+7 3.47989-13 1.177590+7 1.33782-13 1.300000+7 2.18443-149552 3 70 - 1.400000+7 5.00409-15 1.600000+7 3.66609-16 1.734000+7 7.44464-179552 3 70 - 1.900000+7 9.40501-18 2.000000+7 2.84043-18 9552 3 70 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 71 - 0.000000+0-3.987420+5 0 0 1 369552 3 71 - 36 3 9552 3 71 - 4.003910+5 0.000000+0 4.164030+5 5.464290-3 4.206880+5 6.522910-39552 3 71 - 4.218670+5 6.812770-3 4.229450+5 7.077450-3 4.367980+5 1.045680-29552 3 71 - 5.000000+5 2.433750-2 6.000000+5 3.696700-2 7.000000+5 3.978340-29552 3 71 - 8.000000+5 3.676220-2 9.000000+5 3.312320-2 1.000000+6 2.980170-29552 3 71 - 1.200000+6 2.184390-2 1.400000+6 1.522970-2 1.600000+6 1.032030-29552 3 71 - 1.800000+6 6.769480-3 2.000000+6 4.295560-3 2.400000+6 1.582030-39552 3 71 - 3.000000+6 3.113780-4 3.500000+6 8.078860-5 4.000000+6 2.285750-59552 3 71 - 5.000000+6 2.394030-6 5.385400+6 1.067150-6 6.000000+6 1.965680-79552 3 71 - 7.000000+6 7.112550-9 8.000000+6 2.52824-10 9.000000+6 1.68987-119552 3 71 - 1.000000+7 2.47363-12 1.100000+7 3.98831-13 1.177590+7 1.52592-139552 3 71 - 1.300000+7 2.48349-14 1.400000+7 5.68664-15 1.600000+7 4.17213-169552 3 71 - 1.734000+7 8.48715-17 1.900000+7 1.07499-17 2.000000+7 3.25205-189552 3 71 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 72 - 0.000000+0-4.146880+5 0 0 1 359552 3 72 - 35 3 9552 3 72 - 4.164030+5 0.000000+0 4.206880+5 2.227900-5 4.218670+5 2.579950-59552 3 72 - 4.229450+5 2.892130-5 4.367980+5 6.843900-5 5.000000+5 2.870770-49552 3 72 - 6.000000+5 6.603660-4 7.000000+5 9.816620-4 8.000000+5 1.210140-39552 3 72 - 9.000000+5 1.405390-3 1.000000+6 1.578790-3 1.200000+6 1.647550-39552 3 72 - 1.400000+6 1.470420-3 1.600000+6 1.182590-3 1.800000+6 8.795390-49552 3 72 - 2.000000+6 6.183520-4 2.400000+6 2.724710-4 3.000000+6 6.907420-59552 3 72 - 3.500000+6 2.170150-5 4.000000+6 7.257470-6 5.000000+6 9.882260-79552 3 72 - 5.385400+6 4.748720-7 6.000000+6 9.509140-8 7.000000+6 3.640160-99552 3 72 - 8.000000+6 1.30943-10 9.000000+6 8.82368-12 1.000000+7 1.30855-129552 3 72 - 1.100000+7 2.13603-13 1.177590+7 8.22265-14 1.300000+7 1.34366-149552 3 72 - 1.400000+7 3.07648-15 1.600000+7 2.24650-16 1.734000+7 4.54724-179552 3 72 - 1.900000+7 5.71909-18 2.000000+7 1.72244-18 9552 3 72 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 73 - 0.000000+0-4.189560+5 0 0 1 349552 3 73 - 34 3 9552 3 73 - 4.206880+5 0.000000+0 4.218670+5 1.079230-5 4.229450+5 1.522770-59552 3 73 - 4.367980+5 5.586560-5 5.000000+5 2.698590-4 6.000000+5 6.404630-49552 3 73 - 7.000000+5 9.613270-4 8.000000+5 1.190550-3 9.000000+5 1.386600-39552 3 73 - 1.000000+6 1.560790-3 1.200000+6 1.633100-3 1.400000+6 1.460250-39552 3 73 - 1.600000+6 1.176060-3 1.800000+6 8.756620-4 2.000000+6 6.161490-49552 3 73 - 2.400000+6 2.717900-4 3.000000+6 6.894840-5 3.500000+6 2.166780-59552 3 73 - 4.000000+6 7.247550-6 5.000000+6 9.871600-7 5.385400+6 4.743970-79552 3 73 - 6.000000+6 9.500990-8 7.000000+6 3.637880-9 8.000000+6 1.30880-109552 3 73 - 9.000000+6 8.81985-12 1.000000+7 1.30801-12 1.100000+7 2.13524-139552 3 73 - 1.177590+7 8.21992-14 1.300000+7 1.34328-14 1.400000+7 3.07569-159552 3 73 - 1.600000+7 2.24601-16 1.734000+7 4.54634-17 1.900000+7 5.71811-189552 3 73 - 2.000000+7 1.72217-18 9552 3 73 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 74 - 0.000000+0-4.201300+5 0 0 1 339552 3 74 - 33 3 9552 3 74 - 4.218670+5 0.000000+0 4.229450+5 1.023470-5 4.367980+5 5.247140-59552 3 74 - 5.000000+5 2.651670-4 6.000000+5 6.350310-4 7.000000+5 9.557690-49552 3 74 - 8.000000+5 1.185200-3 9.000000+5 1.381460-3 1.000000+6 1.555860-39552 3 74 - 1.200000+6 1.629140-3 1.400000+6 1.457450-3 1.600000+6 1.174260-39552 3 74 - 1.800000+6 8.745950-4 2.000000+6 6.155440-4 2.400000+6 2.716020-49552 3 74 - 3.000000+6 6.891380-5 3.500000+6 2.165850-5 4.000000+6 7.244820-69552 3 74 - 5.000000+6 9.868670-7 5.385400+6 4.742660-7 6.000000+6 9.498750-89552 3 74 - 7.000000+6 3.637260-9 8.000000+6 1.30862-10 9.000000+6 8.81879-129552 3 74 - 1.000000+7 1.30786-12 1.100000+7 2.13502-13 1.177590+7 8.21917-149552 3 74 - 1.300000+7 1.34318-14 1.400000+7 3.07547-15 1.600000+7 2.24587-169552 3 74 - 1.734000+7 4.54610-17 1.900000+7 5.71785-18 2.000000+7 1.72209-189552 3 74 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 75 - 0.000000+0-4.212030+5 0 0 1 329552 3 75 - 32 3 9552 3 75 - 4.229450+5 0.000000+0 4.367980+5 3.497520-4 5.000000+5 1.872910-39552 3 75 - 6.000000+5 3.813290-3 7.000000+5 4.944210-3 8.000000+5 5.410190-39552 3 75 - 9.000000+5 5.712060-3 1.000000+6 5.952820-3 1.200000+6 5.617780-39552 3 75 - 1.400000+6 4.753820-3 1.600000+6 3.712760-3 1.800000+6 2.700210-39552 3 75 - 2.000000+6 1.849410-3 2.400000+6 7.565620-4 3.000000+6 1.648720-49552 3 75 - 3.500000+6 4.551770-5 4.000000+6 1.354860-5 5.000000+6 1.529330-69552 3 75 - 5.385400+6 6.966100-7 6.000000+6 1.319410-7 7.000000+6 4.923560-99552 3 75 - 8.000000+6 1.78330-10 9.000000+6 1.20682-11 1.000000+7 1.78116-129552 3 75 - 1.100000+7 2.88536-13 1.177590+7 1.10585-13 1.300000+7 1.80076-149552 3 75 - 1.400000+7 4.11973-15 1.600000+7 3.01149-16 1.734000+7 6.10594-179552 3 75 - 1.900000+7 7.69804-18 2.000000+7 2.32182-18 9552 3 75 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3 91 - 0.000000+0-4.349990+5 0 0 1 319552 3 91 - 31 3 9552 3 91 - 4.367980+5 0.000000+0 5.000000+5 3.062370-2 6.000000+5 1.627000-19552 3 91 - 7.000000+5 3.484610-1 8.000000+5 5.330650-1 9.000000+5 7.266240-19552 3 91 - 1.000000+6 9.345160-1 1.200000+6 1.255740+0 1.400000+6 1.471730+09552 3 91 - 1.600000+6 1.602500+0 1.800000+6 1.661740+0 2.000000+6 1.668650+09552 3 91 - 2.400000+6 1.588220+0 3.000000+6 1.407950+0 3.500000+6 1.298020+09552 3 91 - 4.000000+6 1.253010+0 5.000000+6 1.303560+0 5.385400+6 1.330980+09552 3 91 - 6.000000+6 8.610890-1 7.000000+6 2.085490-1 8.000000+6 4.400060-29552 3 91 - 9.000000+6 1.600770-2 1.000000+7 1.181020-2 1.100000+7 8.937100-39552 3 91 - 1.177590+7 1.086620-2 1.300000+7 1.025450-2 1.400000+7 9.354570-39552 3 91 - 1.600000+7 9.594320-3 1.734000+7 1.052340-2 1.900000+7 9.938810-39552 3 91 - 2.000000+7 9.714910-3 9552 3 91 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 9.524400+4 2.419680+2 0 0 0 09552 3102 - 6.052990+6 6.052990+6 0 0 1 809552 3102 - 80 5 9552 3102 - 1.000000-5 3.020000+4 2.530000-2 6.000000+2 7.000000-2 3.600000+29552 3102 - 7.000000-2 4.207000+2 1.000000+0 1.113070+2 1.000000+1 3.536750+19552 3102 - 1.000000+2 1.090460+1 1.000000+3 3.308670+0 2.000000+3 2.348940+09552 3102 - 4.000000+3 1.668690+0 6.000000+3 1.382890+0 1.000000+4 1.113590+09552 3102 - 1.400000+4 8.971370-1 2.000000+4 8.782670-1 3.000000+4 7.929090-19552 3102 - 4.000000+4 7.502380-1 6.000000+4 7.068050-1 8.000000+4 6.859620-19552 3102 - 8.836370+4 6.787450-1 1.000000+5 6.759740-1 1.007240+5 6.755480-19552 3102 - 1.237900+5 6.704830-1 1.400000+5 6.732560-1 1.488960+5 6.761210-19552 3102 - 1.763830+5 6.840690-1 1.842690+5 6.875750-1 1.981100+5 6.890930-19552 3102 - 2.000000+5 6.895910-1 2.292430+5 7.043990-1 2.400000+5 7.102310-19552 3102 - 2.627780+5 7.262880-1 2.733270+5 7.341060-1 2.904070+5 7.460730-19552 3102 - 2.978840+5 7.515940-1 3.000000+5 7.531220-1 3.240850+5 7.710120-19552 3102 - 3.369620+5 7.778260-1 3.440660+5 7.824250-1 3.450780+5 7.830600-19552 3102 - 3.498450+5 7.857960-1 3.633330+5 7.942220-1 3.786150+5 8.044340-19552 3102 - 3.916400+5 8.137410-1 4.000000+5 8.191790-1 4.003910+5 8.193490-19552 3102 - 4.164030+5 8.242100-1 4.206880+5 8.259530-1 4.218670+5 8.264430-19552 3102 - 4.229450+5 8.268950-1 4.367980+5 8.330300-1 5.000000+5 8.520960-19552 3102 - 6.000000+5 8.274080-1 7.000000+5 7.592200-1 8.000000+5 6.659690-19552 3102 - 9.000000+5 5.994340-1 1.000000+6 5.531330-1 1.200000+6 4.409030-19552 3102 - 1.400000+6 3.395360-1 1.600000+6 2.569470-1 1.800000+6 1.914840-19552 3102 - 2.000000+6 1.409850-1 2.400000+6 7.392750-2 3.000000+6 2.660600-29552 3102 - 3.500000+6 1.163890-2 4.000000+6 5.566870-3 5.000000+6 1.698610-39552 3102 - 5.385400+6 1.155690-3 6.000000+6 4.207960-4 7.000000+6 4.720190-59552 3102 - 8.000000+6 5.407830-6 9.000000+6 1.209780-6 1.000000+7 6.043620-79552 3102 - 1.100000+7 3.328650-7 1.177590+7 3.290090-7 1.300000+7 2.346820-79552 3102 - 1.400000+7 1.775500-7 1.600000+7 1.369660-7 1.734000+7 1.308020-79552 3102 - 1.900000+7 1.089670-7 2.000000+7 1.006410-7 9552 3102 - 0.000000+0 0.000000+0 0 0 0 09552 3 0 - 0.000000+0 0.000000+0 0 0 0 09552 0 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 2 - 0.000000+0 2.419680+2 0 2 0 09552 4 2 - 0.000000+0 0.000000+0 0 0 1 779552 4 2 - 77 2 9552 4 2 - 0.000000+0 1.000000-5 0 0 2 09552 4 2 - 0.000000+0 0.000000+0 9552 4 2 - 0.000000+0 1.000000+0 0 0 2 09552 4 2 - 0.000000+0 0.000000+0 9552 4 2 - 0.000000+0 1.000000+1 0 0 2 09552 4 2 - 1.096000-5 6.61151-11 9552 4 2 - 0.000000+0 1.000000+2 0 0 2 09552 4 2 - 1.110930-4 6.629160-9 9552 4 2 - 0.000000+0 1.000000+3 0 0 2 09552 4 2 - 1.155890-3 6.685320-7 9552 4 2 - 0.000000+0 2.000000+3 0 0 2 09552 4 2 - 2.362730-3 2.688010-6 9552 4 2 - 0.000000+0 4.000000+3 0 0 4 09552 4 2 - 4.862920-3 2.175660-5 3.989010-8 4.59669-11 9552 4 2 - 0.000000+0 6.000000+3 0 0 4 09552 4 2 - 7.442190-3 4.924640-5 1.352120-7 2.33916-10 9552 4 2 - 0.000000+0 1.000000+4 0 0 4 09552 4 2 - 1.276120-2 1.377850-4 6.294900-7 1.818380-9 9552 4 2 - 0.000000+0 1.400000+4 0 0 4 09552 4 2 - 1.825100-2 2.705720-4 1.735370-6 7.027580-9 9552 4 2 - 0.000000+0 2.000000+4 0 0 4 09552 4 2 - 2.659900-2 5.542560-4 5.065330-6 2.941320-8 9552 4 2 - 0.000000+0 3.000000+4 0 0 4 09552 4 2 - 4.079340-2 1.243770-3 1.709790-5 1.497450-7 9552 4 2 - 0.000000+0 4.000000+4 0 0 4 09552 4 2 - 5.506580-2 2.195670-3 4.040200-5 4.745080-7 9552 4 2 - 0.000000+0 6.000000+4 0 0 6 09552 4 2 - 8.325880-2 4.835200-3 1.390640-4 2.778100-6 4.357710-9 9.38927-119552 4 2 - 0.000000+0 8.000000+4 0 0 6 09552 4 2 - 1.104440-1 8.362600-3 3.268510-4 8.737850-6 1.843440-8 5.39335-109552 4 2 - 0.000000+0 8.836370+4 0 0 6 09552 4 2 - 1.214330-1 1.007390-2 4.383160-4 1.296750-5 3.034340-8 9.87518-109552 4 2 - 0.000000+0 1.000000+5 0 0 6 09552 4 2 - 1.362860-1 1.266510-2 6.302340-4 2.116370-5 5.639640-8 2.097040-99552 4 2 - 0.000000+0 1.007240+5 0 0 6 09552 4 2 - 1.371950-1 1.283390-2 6.436770-4 2.177570-5 5.847150-8 2.191150-99552 4 2 - 0.000000+0 1.237900+5 0 0 6 09552 4 2 - 1.651020-1 1.864050-2 1.172840-3 4.908530-5 1.643800-7 7.697770-99552 4 2 - 0.000000+0 1.400000+5 0 0 6 09552 4 2 - 1.834840-1 2.315970-2 1.671290-3 7.949870-5 3.047500-7 1.630390-89552 4 2 - 0.000000+0 1.488960+5 0 0 6 09552 4 2 - 1.931470-1 2.577150-2 1.993030-3 1.011100-4 4.152380-7 2.374300-89552 4 2 - 0.000000+0 1.763830+5 0 0 6 09552 4 2 - 2.212110-1 3.433300-2 3.219300-3 1.951810-4 9.742100-7 6.679010-89552 4 2 - 0.000000+0 1.842690+5 0 0 6 09552 4 2 - 2.287690-1 3.690410-2 3.638980-3 2.310780-4 1.214910-6 8.724260-89552 4 2 - 0.000000+0 1.981100+5 0 0 6 09552 4 2 - 2.415840-1 4.152340-2 4.453080-3 3.053550-4 1.752880-6 1.358090-79552 4 2 - 0.000000+0 2.000000+5 0 0 6 09552 4 2 - 2.432840-1 4.216250-2 4.571910-3 3.166860-4 1.839300-6 1.439190-79552 4 2 - 0.000000+0 2.292430+5 0 0 6 09552 4 2 - 2.681140-1 5.225510-2 6.652690-3 5.331560-4 3.682130-6 3.312950-79552 4 2 - 0.000000+0 2.400000+5 0 0 6 09552 4 2 - 2.766200-1 5.604360-2 7.535560-3 6.344030-4 4.655400-6 4.384260-79552 4 2 - 0.000000+0 2.627780+5 0 0 8 09552 4 2 - 2.935590-1 6.413770-2 9.620570-3 9.050120-4 1.014520-5 1.157570-69552 4 2 - 9.452580-9 6.94866-11 9552 4 2 - 0.000000+0 2.733270+5 0 0 8 09552 4 2 - 3.009520-1 6.790520-2 1.068470-2 1.048890-3 1.238280-5 1.466770-69552 4 2 - 1.250810-8 9.51487-11 9552 4 2 - 0.000000+0 2.904070+5 0 0 8 09552 4 2 - 3.123690-1 7.401050-2 1.254270-2 1.315050-3 1.684770-5 2.111420-69552 4 2 - 1.925500-8 1.54326-10 9552 4 2 - 0.000000+0 2.978840+5 0 0 8 09552 4 2 - 3.171580-1 7.667950-2 1.340880-2 1.445300-3 1.917710-5 2.459650-69552 4 2 - 2.307370-8 1.88994-10 9552 4 2 - 0.000000+0 3.000000+5 0 0 8 09552 4 2 - 3.184920-1 7.743400-2 1.365970-2 1.483740-3 1.988210-5 2.566430-69552 4 2 - 2.426590-8 1.99962-10 9552 4 2 - 0.000000+0 3.240850+5 0 0 8 09552 4 2 - 3.330160-1 8.598480-2 1.669800-2 1.973330-3 2.951740-5 4.078590-69552 4 2 - 4.204470-8 3.69814-10 9552 4 2 - 0.000000+0 3.369620+5 0 0 8 09552 4 2 - 3.403660-1 9.052890-2 1.846220-2 2.276890-3 3.607010-5 5.151730-69552 4 2 - 5.549130-8 5.04192-10 9552 4 2 - 0.000000+0 3.440660+5 0 0 8 09552 4 2 - 3.442790-1 9.301820-2 1.947590-2 2.457500-3 4.016790-5 5.837410-69552 4 2 - 6.437850-8 5.95131-10 9552 4 2 - 0.000000+0 3.450780+5 0 0 8 09552 4 2 - 3.448290-1 9.337190-2 1.962270-2 2.484020-3 4.078170-5 5.940980-69552 4 2 - 6.573910-8 6.09185-10 9552 4 2 - 0.000000+0 3.498450+5 0 0 8 09552 4 2 - 3.473980-1 9.503480-2 2.032200-2 2.611580-3 4.377760-5 6.449480-69552 4 2 - 7.248480-8 6.79330-10 9552 4 2 - 0.000000+0 3.633330+5 0 0 8 09552 4 2 - 3.544590-1 9.970880-2 2.237150-2 2.997070-3 5.325400-5 8.087460-69552 4 2 - 9.489180-8 9.17304-10 9552 4 2 - 0.000000+0 3.786150+5 0 0 8 09552 4 2 - 3.620950-1 1.049410-1 2.481770-2 3.479220-3 6.597380-5 1.034490-59552 4 2 - 1.272350-7 1.271690-9 9552 4 2 - 0.000000+0 3.916400+5 0 0 8 09552 4 2 - 3.683050-1 1.093410-1 2.700580-2 3.930090-3 7.870380-5 1.265850-59552 4 2 - 1.618610-7 1.662280-9 9552 4 2 - 0.000000+0 4.000000+5 0 0 8 09552 4 2 - 3.721740-1 1.121390-1 2.846130-2 4.239810-3 8.790090-5 1.435780-59552 4 2 - 1.881190-7 1.964700-9 9552 4 2 - 0.000000+0 4.003910+5 0 0 8 09552 4 2 - 3.723540-1 1.122700-1 2.853050-2 4.254710-3 8.835230-5 1.444180-59552 4 2 - 1.894320-7 1.979950-9 9552 4 2 - 0.000000+0 4.164030+5 0 0 8 09552 4 2 - 3.796150-1 1.175950-1 3.144030-2 4.896760-3 1.085790-4 1.824670-59552 4 2 - 2.504870-7 2.700230-9 9552 4 2 - 0.000000+0 4.206880+5 0 0 8 09552 4 2 - 3.814930-1 1.190040-1 3.224260-2 5.079090-3 1.145980-4 1.939420-59552 4 2 - 2.694350-7 2.927850-9 9552 4 2 - 0.000000+0 4.218670+5 0 0 8 09552 4 2 - 3.820060-1 1.193900-1 3.246500-2 5.130040-3 1.163010-4 1.972010-59552 4 2 - 2.748580-7 2.993310-9 9552 4 2 - 0.000000+0 4.229450+5 0 0 8 09552 4 2 - 3.824720-1 1.197430-1 3.266900-2 5.176910-3 1.178750-4 2.002190-59552 4 2 - 2.798960-7 3.054240-9 9552 4 2 - 0.000000+0 4.367980+5 0 0 8 09552 4 2 - 3.883330-1 1.242380-1 3.534690-2 5.805560-3 1.397470-4 2.425390-59552 4 2 - 3.520780-7 3.939190-9 9552 4 2 - 0.000000+0 5.000000+5 0 0 8 09552 4 2 - 4.125240-1 1.439310-1 4.887110-2 9.335610-3 2.870550-4 5.404530-59552 4 2 - 9.209130-7 1.140940-8 9552 4 2 - 0.000000+0 6.000000+5 0 0 10 09552 4 2 - 4.448540-1 1.728040-1 7.442260-2 1.748270-2 7.890770-4 1.644650-49552 4 2 - 4.426860-6 3.810970-7 5.684710-9 2.48114-10 9552 4 2 - 0.000000+0 7.000000+5 0 0 10 09552 4 2 - 4.715910-1 1.995240-1 1.042000-1 2.923730-2 1.820500-3 4.024880-49552 4 2 - 1.329600-5 1.299720-6 2.288900-8 1.163450-9 9552 4 2 - 0.000000+0 8.000000+5 0 0 10 09552 4 2 - 4.939250-1 2.250390-1 1.368310-1 4.489990-2 3.727490-3 8.593520-49552 4 2 - 3.414050-5 3.707140-6 7.570380-8 4.388280-9 9552 4 2 - 0.000000+0 9.000000+5 0 0 10 09552 4 2 - 5.115190-1 2.496770-1 1.702370-1 6.425240-2 6.884600-3 1.641150-39552 4 2 - 7.711630-5 9.155780-6 2.140420-7 1.393190-8 9552 4 2 - 0.000000+0 1.000000+6 0 0 10 09552 4 2 - 5.259130-1 2.741870-1 2.027610-1 8.678420-2 1.164660-2 2.859100-39552 4 2 - 1.567720-4 2.011890-5 5.334130-7 3.851090-8 9552 4 2 - 0.000000+0 1.200000+6 0 0 10 09552 4 2 - 5.522080-1 3.248130-1 2.610270-1 1.382990-1 2.691340-2 6.982060-39552 4 2 - 5.049850-4 7.398330-5 2.473790-6 2.135850-7 9552 4 2 - 0.000000+0 1.400000+6 0 0 12 09552 4 2 - 5.790070-1 3.752440-1 3.058900-1 1.912270-1 4.952920-2 1.361220-29552 4 2 - 1.261560-3 2.013450-4 1.145580-5 8.237630-7 3.525510-8 6.76770-109552 4 2 - 0.000000+0 1.600000+6 0 0 12 09552 4 2 - 6.078870-1 4.215070-1 3.380010-1 2.383140-1 7.691390-2 2.244790-29552 4 2 - 2.584390-3 4.593270-4 3.093510-5 2.599990-6 1.275570-7 2.982850-99552 4 2 - 0.000000+0 1.800000+6 0 0 12 09552 4 2 - 6.374830-1 4.609880-1 3.612840-1 2.760240-1 1.056290-1 3.280600-29552 4 2 - 4.585560-3 9.014340-4 7.111620-5 6.862500-6 3.802730-7 1.070560-89552 4 2 - 0.000000+0 2.000000+6 0 0 12 09552 4 2 - 6.657140-1 4.933160-1 3.796770-1 3.042900-1 1.329950-1 4.396830-29552 4 2 - 7.314760-3 1.582650-3 1.448770-4 1.581410-5 9.780850-7 3.285490-89552 4 2 - 0.000000+0 2.400000+6 0 0 14 09552 4 2 - 7.133030-1 5.413360-1 4.111960-1 3.400150-1 1.791890-1 6.679120-29552 4 2 - 1.495780-2 3.882800-3 4.704170-4 6.878250-5 4.854110-6 4.899380-79552 4 2 - 1.761690-8 3.12303-10 9552 4 2 - 0.000000+0 3.000000+6 0 0 14 09552 4 2 - 7.615560-1 5.914560-1 4.563490-1 3.693860-1 2.288770-1 9.953130-29552 4 2 - 3.125620-2 1.032520-2 1.783700-3 3.326000-4 2.991190-5 3.967820-69552 4 2 - 1.937570-7 3.557690-9 9552 4 2 - 0.000000+0 3.500000+6 0 0 16 09552 4 2 - 7.869210-1 6.250220-1 4.922610-1 3.887110-1 2.599650-1 1.251690-19552 4 2 - 4.795960-2 1.885880-2 4.228960-3 9.413970-4 1.058600-4 1.679720-59552 4 2 - 1.574590-6 1.418970-7 6.488390-9 3.44653-10 9552 4 2 - 0.000000+0 4.000000+6 0 0 16 09552 4 2 - 8.042390-1 6.539040-1 5.242580-1 4.086290-1 2.864340-1 1.498790-19552 4 2 - 6.586410-2 3.013400-2 8.565730-3 2.206080-3 2.958660-4 5.676540-59552 4 2 - 6.030420-6 6.695910-7 3.305580-8 2.014740-9 9552 4 2 - 0.000000+0 5.000000+6 0 0 16 09552 4 2 - 8.238340-1 6.955530-1 5.734010-1 4.521240-1 3.316400-1 1.997240-19552 4 2 - 1.027290-1 5.968370-2 2.565120-2 8.514420-3 1.767370-3 4.310270-49552 4 2 - 5.659630-5 8.594260-6 4.970480-7 3.697900-8 9552 4 2 - 0.000000+0 5.385400+6 0 0 18 09552 4 2 - 8.275470-1 7.057370-1 5.879610-1 4.692770-1 3.476620-1 2.199210-19552 4 2 - 1.179890-1 7.317240-2 3.591250-2 1.317210-2 3.260870-3 8.392920-49552 4 2 - 1.187120-4 1.902690-5 2.800630-6 2.026800-7 2.201900-8 1.258570-99552 4 2 - 0.000000+0 6.000000+6 0 0 18 09552 4 2 - 8.305780-1 7.160120-1 6.063690-1 4.940650-1 3.720890-1 2.520820-19552 4 2 - 1.441090-1 9.576870-2 5.604600-2 2.418390-2 7.559360-3 2.052640-39552 4 2 - 3.352770-4 6.061220-5 9.950210-6 8.615720-7 1.040060-7 6.732940-99552 4 2 - 0.000000+0 7.000000+6 0 0 18 09552 4 2 - 8.314260-1 7.193540-1 6.202500-1 5.197970-1 4.054260-1 2.969410-19552 4 2 - 1.886240-1 1.316160-1 9.395230-2 5.176000-2 2.106940-2 6.346580-39552 4 2 - 1.331420-3 2.899330-4 5.674910-5 6.618360-6 9.148890-7 7.029620-89552 4 2 - 0.000000+0 8.000000+6 0 0 20 09552 4 2 - 8.309570-1 7.119780-1 6.170150-1 5.283750-1 4.285040-1 3.298700-19552 4 2 - 2.322600-1 1.671200-1 1.329450-1 8.844520-2 4.333870-2 1.518330-29552 4 2 - 4.093830-3 1.066980-3 2.371010-4 4.305140-5 7.526600-6 9.550751-79552 4 2 - 1.021820-7 5.763290-9 9552 4 2 - 0.000000+0 9.000000+6 0 0 20 09552 4 2 - 8.326120-1 7.036910-1 6.091020-1 5.301990-1 4.445510-1 3.568270-19552 4 2 - 2.735890-1 2.058690-1 1.710840-1 1.295980-1 7.414470-2 3.086970-29552 4 2 - 1.035850-2 3.160220-3 8.053870-4 1.687420-4 3.389990-5 4.673710-69552 4 2 - 5.994840-7 3.991510-8 9552 4 2 - 0.000000+0 1.000000+7 0 0 20 09552 4 2 - 8.393870-1 7.036900-1 6.077750-1 5.333010-1 4.576470-1 3.819210-19552 4 2 - 3.104890-1 2.465910-1 2.072700-1 1.697230-1 1.108890-1 5.458470-29552 4 2 - 2.188040-2 7.595810-3 2.182700-3 5.174060-4 1.199230-4 2.124730-59552 4 2 - 3.350790-6 5.122580-7 9552 4 2 - 0.000000+0 1.100000+7 0 0 20 09552 4 2 - 8.518980-1 7.155240-1 6.170050-1 5.411010-1 4.711910-1 4.051540-19552 4 2 - 3.415670-1 2.842090-1 2.402820-1 2.041620-1 1.479170-1 8.395990-29552 4 2 - 3.870660-2 1.503060-2 4.848750-3 1.307230-3 3.311680-4 6.582000-59552 4 2 - 1.179270-5 2.062840-6 9552 4 2 - 0.000000+0 1.177590+7 0 0 20 09552 4 2 - 8.640000-1 7.309220-1 6.302100-1 5.512900-1 4.835480-1 4.217920-19552 4 2 - 3.623190-1 3.091380-1 2.632510-1 2.260640-1 1.733740-1 1.075800-19552 4 2 - 5.429920-2 2.291950-2 8.088520-3 2.404660-3 6.546570-4 1.428270-49552 4 2 - 2.820160-5 5.361600-6 9552 4 2 - 0.000000+0 1.300000+7 0 0 20 09552 4 2 - 8.835470-1 7.600410-1 6.578880-1 5.750820-1 5.075810-1 4.475600-19552 4 2 - 3.918940-1 3.417470-1 2.949740-1 2.540370-1 2.055650-1 1.418290-19552 4 2 - 8.090800-2 3.880870-2 1.576600-2 5.456000-3 1.679250-3 4.289740-49552 4 2 - 1.032760-4 2.153880-5 9552 4 2 - 0.000000+0 1.400000+7 0 0 20 09552 4 2 - 8.979760-1 7.843260-1 6.838500-1 5.999890-1 5.308010-1 4.697980-19552 4 2 - 4.149180-1 3.647010-1 3.175120-1 2.733870-1 2.259810-1 1.657450-19552 4 2 - 1.028720-1 5.438220-2 2.462940-2 9.569050-3 3.255920-3 9.323720-49552 4 2 - 2.450590-4 5.569180-5 9552 4 2 - 0.000000+0 1.600000+7 0 0 20 09552 4 2 - 9.207040-1 8.269820-1 7.354470-1 6.537840-1 5.809340-1 5.169990-19552 4 2 - 4.593990-1 4.064770-1 3.565830-1 3.080590-1 2.588890-1 2.042930-19552 4 2 - 1.439280-1 8.936900-2 4.883580-2 2.327880-2 9.626430-3 3.402600-39552 4 2 - 1.062240-3 2.898790-4 9552 4 2 - 0.000000+0 1.734000+7 0 0 20 09552 4 2 - 9.314910-1 8.488270-1 7.645860-1 6.860870-1 6.128070-1 5.475680-19552 4 2 - 4.874220-1 4.323950-1 3.799860-1 3.294900-1 2.785960-1 2.255820-19552 4 2 - 1.681550-1 1.130920-1 6.829070-2 3.655880-2 1.706920-2 6.846830-39552 4 2 - 2.389830-3 7.259740-4 9552 4 2 - 0.000000+0 1.900000+7 0 0 20 09552 4 2 - 9.400390-1 8.684010-1 7.924580-1 7.186380-1 6.471560-1 5.813780-19552 4 2 - 5.193270-1 4.620500-1 4.071370-1 3.545580-1 3.021900-1 2.495800-19552 4 2 - 1.950680-1 1.411200-1 9.382230-2 5.664060-2 3.031710-2 1.407620-29552 4 2 - 5.658680-3 1.977400-3 9552 4 2 - 0.000000+0 2.000000+7 0 0 20 09552 4 2 - 9.430320-1 8.769070-1 8.052310-1 7.342970-1 6.646400-1 5.991300-19552 4 2 - 5.367510-1 4.784920-1 4.226140-1 3.690000-1 3.161120-1 2.634400-19552 4 2 - 2.101330-1 1.571720-1 1.093170-1 7.002330-2 4.030340-2 2.029500-29552 4 2 - 8.854090-3 3.351610-3 9552 4 2 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 2 0 09552 4 16 - 0.000000+0 2.419680+2 0 1 0 09552 4 16 - 0.000000+0 0.000000+0 0 0 1 29552 4 16 - 2 2 9552 4 16 - 0.000000+0 5.385400+6 0 0 1 29552 4 16 - 2 2 9552 4 16 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 16 - 0.000000+0 2.000000+7 0 0 1 29552 4 16 - 2 2 9552 4 16 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 16 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 2 0 09552 4 17 - 0.000000+0 2.419680+2 0 1 0 09552 4 17 - 0.000000+0 0.000000+0 0 0 1 29552 4 17 - 2 2 9552 4 17 - 0.000000+0 1.177590+7 0 0 1 29552 4 17 - 2 2 9552 4 17 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 17 - 0.000000+0 2.000000+7 0 0 1 29552 4 17 - 2 2 9552 4 17 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 17 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 2 0 09552 4 18 - 0.000000+0 2.419680+2 0 1 0 09552 4 18 - 0.000000+0 0.000000+0 0 0 1 29552 4 18 - 2 2 9552 4 18 - 0.000000+0 1.000000-5 0 0 1 29552 4 18 - 2 2 9552 4 18 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 18 - 0.000000+0 2.000000+7 0 0 1 29552 4 18 - 2 2 9552 4 18 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 18 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 2 0 09552 4 37 - 0.000000+0 2.419680+2 0 1 0 09552 4 37 - 0.000000+0 0.000000+0 0 0 1 29552 4 37 - 2 2 9552 4 37 - 0.000000+0 1.734000+7 0 0 1 29552 4 37 - 2 2 9552 4 37 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 37 - 0.000000+0 2.000000+7 0 0 1 29552 4 37 - 2 2 9552 4 37 --1.000000+0 5.000000-1 1.000000+0 5.000000-1 9552 4 37 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 51 - 0.000000+0 2.419680+2 0 2 0 09552 4 51 - 0.000000+0 0.000000+0 0 0 1 69552 4 51 - 6 2 9552 4 51 - 0.000000+0 8.836370+4 0 0 2 09552 4 51 - 0.000000+0 0.000000+0 9552 4 51 - 0.000000+0 1.000000+6 0 0 8 09552 4 51 - 0.000000+0 1.999890-2 0.000000+0-4.833350-3 0.000000+0-7.644380-59552 4 51 - 0.000000+0-2.897010-7 9552 4 51 - 0.000000+0 5.000000+6 0 0 14 09552 4 51 - 0.000000+0-3.668140-2 0.000000+0 3.364900-3 0.000000+0-1.463210-59552 4 51 - 0.000000+0-5.788560-5 0.000000+0-2.275750-5 0.000000+0-5.674230-89552 4 51 - 0.000000+0 4.94234-12 9552 4 51 - 0.000000+0 1.000000+7 0 0 20 09552 4 51 - 0.000000+0-3.097310-2 0.000000+0-4.479460-3 0.000000+0 1.933670-39552 4 51 - 0.000000+0 9.630840-5 0.000000+0-1.092620-4 0.000000+0-2.779840-59552 4 51 - 0.000000+0 2.830590-6 0.000000+0-1.836740-8 0.000000+0 1.729650-99552 4 51 - 0.000000+0 2.32277-11 9552 4 51 - 0.000000+0 1.400000+7 0 0 20 09552 4 51 - 0.000000+0-1.259830-2 0.000000+0-1.070000-2 0.000000+0 1.466870-39552 4 51 - 0.000000+0 7.696840-4 0.000000+0-9.378240-5 0.000000+0-6.664840-59552 4 51 - 0.000000+0-5.500670-6 0.000000+0 1.268220-6 0.000000+0 8.428170-89552 4 51 - 0.000000+0 9.897890-9 9552 4 51 - 0.000000+0 2.000000+7 0 0 20 09552 4 51 - 0.000000+0 1.639240-2 0.000000+0-1.415250-2 0.000000+0-1.986030-39552 4 51 - 0.000000+0 1.275770-3 0.000000+0 4.130380-4 0.000000+0-7.580950-59552 4 51 - 0.000000+0-5.675760-5 0.000000+0-5.969250-6 0.000000+0 1.902420-69552 4 51 - 0.000000+0 7.245670-7 9552 4 51 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 52 - 0.000000+0 2.419680+2 0 2 0 09552 4 52 - 0.000000+0 0.000000+0 0 0 1 69552 4 52 - 6 2 9552 4 52 - 0.000000+0 1.007240+5 0 0 2 09552 4 52 - 0.000000+0 0.000000+0 9552 4 52 - 0.000000+0 1.000000+6 0 0 8 09552 4 52 - 0.000000+0-3.458630-3 0.000000+0 2.245670-3 0.000000+0-3.688630-69552 4 52 - 0.000000+0-3.550890-8 9552 4 52 - 0.000000+0 5.000000+6 0 0 14 09552 4 52 - 0.000000+0-2.848380-2 0.000000+0-1.232570-5 0.000000+0 4.954520-49552 4 52 - 0.000000+0 1.527140-5 0.000000+0-9.636410-6 0.000000+0-5.862360-79552 4 52 - 0.000000+0-3.635360-9 9552 4 52 - 0.000000+0 1.000000+7 0 0 20 09552 4 52 - 0.000000+0-1.896110-2 0.000000+0-4.873080-3 0.000000+0 1.870240-49552 4 52 - 0.000000+0 3.096800-4 0.000000+0 8.283250-5 0.000000+0-2.156290-59552 4 52 - 0.000000+0-4.630220-6 0.000000+0-1.554650-7 0.000000+0-5.511960-99552 4 52 - 0.000000+0-2.09502-11 9552 4 52 - 0.000000+0 1.400000+7 0 0 20 09552 4 52 - 0.000000+0-4.809000-3 0.000000+0-7.871890-3 0.000000+0-4.538430-49552 4 52 - 0.000000+0 2.889690-4 0.000000+0 1.916090-4 0.000000+0 1.546130-59552 4 52 - 0.000000+0-1.608400-5 0.000000+0-3.666640-6 0.000000+0-3.181570-79552 4 52 - 0.000000+0-1.225840-8 9552 4 52 - 0.000000+0 2.000000+7 0 0 20 09552 4 52 - 0.000000+0 1.917190-2 0.000000+0-1.000620-2 0.000000+0-2.012870-39552 4 52 - 0.000000+0 7.214000-5 0.000000+0 1.868960-4 0.000000+0 1.268240-49552 4 52 - 0.000000+0 2.231210-5 0.000000+0-1.336120-5 0.000000+0-6.457200-69552 4 52 - 0.000000+0-1.078790-6 9552 4 52 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 53 - 0.000000+0 2.419680+2 0 2 0 09552 4 53 - 0.000000+0 0.000000+0 0 0 1 69552 4 53 - 6 2 9552 4 53 - 0.000000+0 1.237900+5 0 0 2 09552 4 53 - 0.000000+0 0.000000+0 9552 4 53 - 0.000000+0 1.000000+6 0 0 8 09552 4 53 - 0.000000+0-1.788320-2 0.000000+0 5.676250-4 0.000000+0 2.252320-59552 4 53 - 0.000000+0 6.421820-8 9552 4 53 - 0.000000+0 5.000000+6 0 0 14 09552 4 53 - 0.000000+0-1.473340-2 0.000000+0-2.979930-3 0.000000+0 9.786810-59552 4 53 - 0.000000+0 1.098390-4 0.000000+0 2.090450-5 0.000000+0 5.786000-79552 4 53 - 0.000000+0 3.290230-9 9552 4 53 - 0.000000+0 1.000000+7 0 0 20 09552 4 53 - 0.000000+0-4.376690-3 0.000000+0-3.815500-3 0.000000+0-1.072860-39552 4 53 - 0.000000+0-2.532790-5 0.000000+0 7.967500-5 0.000000+0 4.086660-59552 4 53 - 0.000000+0 3.608610-6 0.000000+0 1.564490-7 0.000000+0 4.521360-99552 4 53 - 0.000000+0 9.66555-12 9552 4 53 - 0.000000+0 1.400000+7 0 0 20 09552 4 53 - 0.000000+0 5.241800-3 0.000000+0-4.174070-3 0.000000+0-1.418870-39552 4 53 - 0.000000+0-3.500290-4 0.000000+0 5.662900-5 0.000000+0 6.767280-59552 4 53 - 0.000000+0 2.330400-5 0.000000+0 3.250710-6 0.000000+0 2.712220-79552 4 53 - 0.000000+0 7.933910-9 9552 4 53 - 0.000000+0 2.000000+7 0 0 20 09552 4 53 - 0.000000+0 2.298780-2 0.000000+0-4.812620-3 0.000000+0-1.536240-39552 4 53 - 0.000000+0-6.895500-4 0.000000+0-1.693430-4 0.000000+0 4.649030-59552 4 53 - 0.000000+0 5.157720-5 0.000000+0 2.306950-5 0.000000+0 5.896970-69552 4 53 - 0.000000+0 7.616490-7 9552 4 53 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 54 - 0.000000+0 2.419680+2 0 2 0 09552 4 54 - 0.000000+0 0.000000+0 0 0 1 69552 4 54 - 6 2 9552 4 54 - 0.000000+0 1.488960+5 0 0 2 09552 4 54 - 0.000000+0 0.000000+0 9552 4 54 - 0.000000+0 1.000000+6 0 0 8 09552 4 54 - 0.000000+0-1.455480-2 0.000000+0-1.080080-3 0.000000+0-1.053550-59552 4 54 - 0.000000+0-2.503650-8 9552 4 54 - 0.000000+0 5.000000+6 0 0 14 09552 4 54 - 0.000000+0 1.909180-3 0.000000+0-2.493930-3 0.000000+0-7.665980-49552 4 54 - 0.000000+0-9.576230-5 0.000000+0-1.300710-5 0.000000+0-1.786730-79552 4 54 - 0.000000+0-9.57250-10 9552 4 54 - 0.000000+0 1.000000+7 0 0 20 09552 4 54 - 0.000000+0 9.898060-3 0.000000+0-8.974100-4 0.000000+0-1.043140-39552 4 54 - 0.000000+0-4.042140-4 0.000000+0-1.134550-4 0.000000+0-2.339090-59552 4 54 - 0.000000+0-2.510780-7 0.000000+0-5.397580-8 0.000000+0-9.51168-109552 4 54 - 0.000000+0 5.99711-12 9552 4 54 - 0.000000+0 1.400000+7 0 0 20 09552 4 54 - 0.000000+0 1.541980-2 0.000000+0 1.857890-5 0.000000+0-9.190900-49552 4 54 - 0.000000+0-5.362090-4 0.000000+0-2.182710-4 0.000000+0-6.441670-59552 4 54 - 0.000000+0-1.042500-5 0.000000+0-6.593500-7 0.000000+0-6.139490-89552 4 54 - 0.000000+0 1.38898-10 9552 4 54 - 0.000000+0 2.000000+7 0 0 20 09552 4 54 - 0.000000+0 2.701890-2 0.000000+0 3.620840-4 0.000000+0-3.652560-49552 4 54 - 0.000000+0-6.002630-4 0.000000+0-3.135000-4 0.000000+0-1.451860-49552 4 54 - 0.000000+0-5.329540-5 0.000000+0-1.140720-5 0.000000+0-1.385070-69552 4 54 - 0.000000+0-4.358000-8 9552 4 54 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 55 - 0.000000+0 2.419680+2 0 2 0 09552 4 55 - 0.000000+0 0.000000+0 0 0 1 69552 4 55 - 6 2 9552 4 55 - 0.000000+0 1.763830+5 0 0 2 09552 4 55 - 0.000000+0 0.000000+0 9552 4 55 - 0.000000+0 1.000000+6 0 0 10 09552 4 55 - 0.000000+0 3.309750-2 0.000000+0 5.940690-4 0.000000+0 4.304620-49552 4 55 - 0.000000+0 2.379880-7 0.000000+0 1.139860-8 9552 4 55 - 0.000000+0 5.000000+6 0 0 16 09552 4 55 - 0.000000+0-3.504720-2 0.000000+0 3.541120-3 0.000000+0 5.545100-59552 4 55 - 0.000000+0-1.892310-5 0.000000+0 5.463010-6 0.000000+0 8.093660-69552 4 55 - 0.000000+0 1.373370-8 0.000000+0 4.56657-10 9552 4 55 - 0.000000+0 1.000000+7 0 0 20 09552 4 55 - 0.000000+0-3.257880-2 0.000000+0-4.048500-3 0.000000+0 2.030340-39552 4 55 - 0.000000+0 1.493160-5 0.000000+0-1.117260-4 0.000000+0 7.040370-69552 4 55 - 0.000000+0 1.281850-5 0.000000+0 3.308610-7 0.000000+0 5.374190-89552 4 55 - 0.000000+0 5.72597-10 9552 4 55 - 0.000000+0 1.400000+7 0 0 20 09552 4 55 - 0.000000+0-1.307310-2 0.000000+0-1.053580-2 0.000000+0 1.450100-39552 4 55 - 0.000000+0 7.770440-4 0.000000+0-1.050360-4 0.000000+0-6.655780-59552 4 55 - 0.000000+0 9.945310-6 0.000000+0 4.514780-6 0.000000+0 9.112920-79552 4 55 - 0.000000+0 9.386700-8 9552 4 55 - 0.000000+0 2.000000+7 0 0 20 09552 4 55 - 0.000000+0 1.616720-2 0.000000+0-1.416490-2 0.000000+0-1.952380-39552 4 55 - 0.000000+0 1.273440-3 0.000000+0 4.042250-4 0.000000+0-7.827280-59552 4 55 - 0.000000+0-5.950810-5 0.000000+0-5.481570-6 0.000000+0 3.466090-69552 4 55 - 0.000000+0 2.045180-6 9552 4 55 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 56 - 0.000000+0 2.419680+2 0 2 0 09552 4 56 - 0.000000+0 0.000000+0 0 0 1 69552 4 56 - 6 2 9552 4 56 - 0.000000+0 1.842690+5 0 0 2 09552 4 56 - 0.000000+0 0.000000+0 9552 4 56 - 0.000000+0 1.000000+6 0 0 10 09552 4 56 - 0.000000+0 2.392910-3 0.000000+0-2.072560-4 0.000000+0-1.061930-49552 4 56 - 0.000000+0-3.657480-8 0.000000+0-1.121550-9 9552 4 56 - 0.000000+0 5.000000+6 0 0 16 09552 4 56 - 0.000000+0 1.700570-2 0.000000+0 1.071800-3 0.000000+0-9.333730-59552 4 56 - 0.000000+0-8.697180-5 0.000000+0-1.551000-5 0.000000+0-4.350030-69552 4 56 - 0.000000+0-7.147400-9 0.000000+0-2.09810-10 9552 4 56 - 0.000000+0 1.000000+7 0 0 20 09552 4 56 - 0.000000+0 2.155750-2 0.000000+0 2.914440-3 0.000000+0 3.803050-49552 4 56 - 0.000000+0-2.335290-5 0.000000+0-6.010320-5 0.000000+0-3.153990-59552 4 56 - 0.000000+0-8.685810-6 0.000000+0-2.428320-7 0.000000+0-2.872680-89552 4 56 - 0.000000+0-2.91918-10 9552 4 56 - 0.000000+0 1.400000+7 0 0 20 09552 4 56 - 0.000000+0 2.360550-2 0.000000+0 3.871590-3 0.000000+0 6.351730-49552 4 56 - 0.000000+0 9.392640-5 0.000000+0-3.551480-5 0.000000+0-3.804090-59552 4 56 - 0.000000+0-2.118570-5 0.000000+0-4.192960-6 0.000000+0-5.782690-79552 4 56 - 0.000000+0-4.913090-8 9552 4 56 - 0.000000+0 2.000000+7 0 0 20 09552 4 56 - 0.000000+0 2.995800-2 0.000000+0 4.455810-3 0.000000+0 1.166580-39552 4 56 - 0.000000+0 2.260600-4 0.000000+0 4.101800-5 0.000000+0-2.460420-59552 4 56 - 0.000000+0-2.482340-5 0.000000+0-1.518280-5 0.000000+0-5.480110-69552 4 56 - 0.000000+0-1.384930-6 9552 4 56 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 57 - 0.000000+0 2.419680+2 0 2 0 09552 4 57 - 0.000000+0 0.000000+0 0 0 1 69552 4 57 - 6 2 9552 4 57 - 0.000000+0 1.981100+5 0 0 2 09552 4 57 - 0.000000+0 0.000000+0 9552 4 57 - 0.000000+0 1.000000+6 0 0 10 09552 4 57 - 0.000000+0-1.484130-2 0.000000+0 1.314380-3 0.000000+0-3.744510-49552 4 57 - 0.000000+0-1.442950-7 0.000000+0-4.618340-9 9552 4 57 - 0.000000+0 5.000000+6 0 0 16 09552 4 57 - 0.000000+0-2.879360-2 0.000000+0 1.472410-4 0.000000+0 4.833000-49552 4 57 - 0.000000+0-7.491830-6 0.000000+0-1.413060-5 0.000000+0-4.650840-69552 4 57 - 0.000000+0-7.301910-9 0.000000+0-1.87152-10 9552 4 57 - 0.000000+0 1.000000+7 0 0 20 09552 4 57 - 0.000000+0-2.037060-2 0.000000+0-4.812610-3 0.000000+0 2.634910-49552 4 57 - 0.000000+0 3.742010-4 0.000000+0 4.194180-5 0.000000+0-2.996710-59552 4 57 - 0.000000+0-7.904470-6 0.000000+0-2.371780-7 0.000000+0-2.192320-89552 4 57 - 0.000000+0-2.02130-10 9552 4 57 - 0.000000+0 1.400000+7 0 0 20 09552 4 57 - 0.000000+0-5.184580-3 0.000000+0-7.885790-3 0.000000+0-3.977810-49552 4 57 - 0.000000+0 2.861100-4 0.000000+0 2.029320-4 0.000000+0 8.438390-69552 4 57 - 0.000000+0-1.970690-5 0.000000+0-4.385290-6 0.000000+0-5.253830-79552 4 57 - 0.000000+0-3.679800-8 9552 4 57 - 0.000000+0 2.000000+7 0 0 20 09552 4 57 - 0.000000+0 1.894470-2 0.000000+0-9.998910-3 0.000000+0-1.991820-39552 4 57 - 0.000000+0 8.186840-5 0.000000+0 1.902310-4 0.000000+0 1.308530-49552 4 57 - 0.000000+0 2.508440-5 0.000000+0-1.253910-5 0.000000+0-6.651810-69552 4 57 - 0.000000+0-1.377950-6 9552 4 57 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 58 - 0.000000+0 2.419680+2 0 2 0 09552 4 58 - 0.000000+0 0.000000+0 0 0 1 69552 4 58 - 6 2 9552 4 58 - 0.000000+0 2.292430+5 0 0 2 09552 4 58 - 0.000000+0 0.000000+0 9552 4 58 - 0.000000+0 1.000000+6 0 0 10 09552 4 58 - 0.000000+0-1.371450-2 0.000000+0 3.620910-4 0.000000+0 1.890100-49552 4 58 - 0.000000+0 5.402480-8 0.000000+0 1.031910-9 9552 4 58 - 0.000000+0 5.000000+6 0 0 16 09552 4 58 - 0.000000+0-1.614300-2 0.000000+0-2.755620-3 0.000000+0 1.019300-49552 4 58 - 0.000000+0 1.060260-4 0.000000+0 1.669390-5 0.000000+0 1.492730-69552 4 58 - 0.000000+0 1.980810-9 0.000000+0 1.59270-11 9552 4 58 - 0.000000+0 1.000000+7 0 0 20 09552 4 58 - 0.000000+0-5.275000-3 0.000000+0-4.035850-3 0.000000+0-1.116310-39552 4 58 - 0.000000+0 1.707420-6 0.000000+0 1.126110-4 0.000000+0 3.554340-59552 4 58 - 0.000000+0 2.969810-6 0.000000+0 1.015240-7 0.000000+0 8.48862-109552 4 58 - 0.000000+0-1.83082-11 9552 4 58 - 0.000000+0 1.400000+7 0 0 20 09552 4 58 - 0.000000+0 4.979020-3 0.000000+0-4.290140-3 0.000000+0-1.427810-39552 4 58 - 0.000000+0-3.518480-4 0.000000+0 5.608160-5 0.000000+0 7.238370-59552 4 58 - 0.000000+0 2.031030-5 0.000000+0 2.633310-6 0.000000+0 1.545130-79552 4 58 - 0.000000+0 1.14622-10 9552 4 58 - 0.000000+0 2.000000+7 0 0 20 09552 4 58 - 0.000000+0 2.275290-2 0.000000+0-4.832490-3 0.000000+0-1.549170-39552 4 58 - 0.000000+0-6.960770-4 0.000000+0-1.719910-4 0.000000+0 4.069500-59552 4 58 - 0.000000+0 4.772570-5 0.000000+0 2.110560-5 0.000000+0 5.245400-69552 4 58 - 0.000000+0 5.232550-7 9552 4 58 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 59 - 0.000000+0 2.419680+2 0 2 0 09552 4 59 - 0.000000+0 0.000000+0 0 0 1 69552 4 59 - 6 2 9552 4 59 - 0.000000+0 2.627780+5 0 0 2 09552 4 59 - 0.000000+0 0.000000+0 9552 4 59 - 0.000000+0 1.000000+6 0 0 10 09552 4 59 - 0.000000+0-1.360340-2 0.000000+0 1.125220-3 0.000000+0-3.408770-49552 4 59 - 0.000000+0-1.206420-7 0.000000+0-3.510310-9 9552 4 59 - 0.000000+0 5.000000+6 0 0 16 09552 4 59 - 0.000000+0-2.880000-2 0.000000+0 1.939250-4 0.000000+0 4.798460-49552 4 59 - 0.000000+0-1.048430-5 0.000000+0-1.387800-5 0.000000+0-4.366080-69552 4 59 - 0.000000+0-6.774920-9 0.000000+0-1.73647-10 9552 4 59 - 0.000000+0 1.000000+7 0 0 20 09552 4 59 - 0.000000+0-2.050650-2 0.000000+0-4.784130-3 0.000000+0 2.693230-49552 4 59 - 0.000000+0 3.747360-4 0.000000+0 3.994660-5 0.000000+0-2.994320-59552 4 59 - 0.000000+0-7.724690-6 0.000000+0-2.295380-7 0.000000+0-2.112880-89552 4 59 - 0.000000+0-1.91191-10 9552 4 59 - 0.000000+0 1.400000+7 0 0 20 09552 4 59 - 0.000000+0-5.334930-3 0.000000+0-7.865280-3 0.000000+0-3.907230-49552 4 59 - 0.000000+0 2.873480-4 0.000000+0 2.024730-4 0.000000+0 7.634330-69552 4 59 - 0.000000+0-1.972550-5 0.000000+0-4.315030-6 0.000000+0-5.148050-79552 4 59 - 0.000000+0-3.566300-8 9552 4 59 - 0.000000+0 2.000000+7 0 0 20 09552 4 59 - 0.000000+0 1.880040-2 0.000000+0-9.998630-3 0.000000+0-1.980810-39552 4 59 - 0.000000+0 8.360390-5 0.000000+0 1.906100-4 0.000000+0 1.305270-49552 4 59 - 0.000000+0 2.460280-5 0.000000+0-1.259790-5 0.000000+0-6.600080-69552 4 59 - 0.000000+0-1.359880-6 9552 4 59 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 60 - 0.000000+0 2.419680+2 0 2 0 09552 4 60 - 0.000000+0 0.000000+0 0 0 1 69552 4 60 - 6 2 9552 4 60 - 0.000000+0 2.733270+5 0 0 2 09552 4 60 - 0.000000+0 0.000000+0 9552 4 60 - 0.000000+0 1.000000+6 0 0 10 09552 4 60 - 0.000000+0-1.361100-2 0.000000+0-7.673170-4 0.000000+0-1.389600-59552 4 60 - 0.000000+0 1.815840-9 0.000000+0 2.92171-10 9552 4 60 - 0.000000+0 5.000000+6 0 0 16 09552 4 60 - 0.000000+0 7.539970-4 0.000000+0-2.625640-3 0.000000+0-6.817170-49552 4 60 - 0.000000+0-7.700660-5 0.000000+0-4.141300-6 0.000000+0 1.598360-69552 4 60 - 0.000000+0 2.838020-9 0.000000+0 1.07161-10 9552 4 60 - 0.000000+0 1.000000+7 0 0 20 09552 4 60 - 0.000000+0 9.742280-3 0.000000+0-1.056370-3 0.000000+0-1.104370-39552 4 60 - 0.000000+0-4.376940-4 0.000000+0-1.158500-4 0.000000+0-9.602960-69552 4 60 - 0.000000+0 3.057200-6 0.000000+0 7.598390-8 0.000000+0 1.577190-89552 4 60 - 0.000000+0 1.70895-10 9552 4 60 - 0.000000+0 1.400000+7 0 0 20 09552 4 60 - 0.000000+0 1.539240-2 0.000000+0-2.773220-5 0.000000+0-9.402010-49552 4 60 - 0.000000+0-5.316400-4 0.000000+0-2.158350-4 0.000000+0-6.113180-59552 4 60 - 0.000000+0-3.406720-6 0.000000+0 7.209080-7 0.000000+0 2.439960-79552 4 60 - 0.000000+0 2.804980-8 9552 4 60 - 0.000000+0 2.000000+7 0 0 20 09552 4 60 - 0.000000+0 2.688560-2 0.000000+0 3.757780-4 0.000000+0-3.578770-49552 4 60 - 0.000000+0-5.902320-4 0.000000+0-3.038600-4 0.000000+0-1.365800-49552 4 60 - 0.000000+0-4.844620-5 0.000000+0-8.664010-6 0.000000+0-1.543320-79552 4 60 - 0.000000+0 5.109100-7 9552 4 60 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 61 - 0.000000+0 2.419680+2 0 2 0 09552 4 61 - 0.000000+0 0.000000+0 0 0 1 69552 4 61 - 6 2 9552 4 61 - 0.000000+0 2.904070+5 0 0 2 09552 4 61 - 0.000000+0 0.000000+0 9552 4 61 - 0.000000+0 1.000000+6 0 0 10 09552 4 61 - 0.000000+0 3.771210-2 0.000000+0 5.634680-4 0.000000+0 3.739750-49552 4 61 - 0.000000+0 1.807310-7 0.000000+0 7.213700-9 9552 4 61 - 0.000000+0 5.000000+6 0 0 16 09552 4 61 - 0.000000+0-3.470770-2 0.000000+0 3.581220-3 0.000000+0 2.824470-59552 4 61 - 0.000000+0-1.716320-5 0.000000+0 6.310520-6 0.000000+0 7.257290-69552 4 61 - 0.000000+0 1.206760-8 0.000000+0 4.00960-10 9552 4 61 - 0.000000+0 1.000000+7 0 0 20 09552 4 61 - 0.000000+0-3.287680-2 0.000000+0-3.928280-3 0.000000+0 2.027700-39552 4 61 - 0.000000+0 3.768400-6 0.000000+0-1.104310-4 0.000000+0 8.301070-69552 4 61 - 0.000000+0 1.234330-5 0.000000+0 3.141930-7 0.000000+0 5.042280-89552 4 61 - 0.000000+0 5.19163-10 9552 4 61 - 0.000000+0 1.400000+7 0 0 20 09552 4 61 - 0.000000+0-1.340180-2 0.000000+0-1.046310-2 0.000000+0 1.474210-39552 4 61 - 0.000000+0 7.668550-4 0.000000+0-1.076820-4 0.000000+0-6.566030-59552 4 61 - 0.000000+0 1.052410-5 0.000000+0 4.414080-6 0.000000+0 8.865620-79552 4 61 - 0.000000+0 8.895570-8 9552 4 61 - 0.000000+0 2.000000+7 0 0 20 09552 4 61 - 0.000000+0 1.587550-2 0.000000+0-1.416280-2 0.000000+0-1.912900-39552 4 61 - 0.000000+0 1.276320-3 0.000000+0 3.978190-4 0.000000+0-7.954590-59552 4 61 - 0.000000+0-5.887570-5 0.000000+0-5.137470-6 0.000000+0 3.483320-69552 4 61 - 0.000000+0 2.017690-6 9552 4 61 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 62 - 0.000000+0 2.419680+2 0 2 0 09552 4 62 - 0.000000+0 0.000000+0 0 0 1 69552 4 62 - 6 2 9552 4 62 - 0.000000+0 2.978840+5 0 0 2 09552 4 62 - 0.000000+0 0.000000+0 9552 4 62 - 0.000000+0 1.000000+6 0 0 10 09552 4 62 - 0.000000+0-1.218100-2 0.000000+0 3.892010-4 0.000000+0 1.630650-49552 4 62 - 0.000000+0 4.196450-8 0.000000+0 7.30592-10 9552 4 62 - 0.000000+0 5.000000+6 0 0 16 09552 4 62 - 0.000000+0-1.627920-2 0.000000+0-2.725040-3 0.000000+0 1.117590-49552 4 62 - 0.000000+0 1.054980-4 0.000000+0 1.588900-5 0.000000+0 1.392260-69552 4 62 - 0.000000+0 1.824030-9 0.000000+0 1.46771-11 9552 4 62 - 0.000000+0 1.000000+7 0 0 20 09552 4 62 - 0.000000+0-5.380270-3 0.000000+0-4.036560-3 0.000000+0-1.111500-39552 4 62 - 0.000000+0 4.940100-6 0.000000+0 1.129940-4 0.000000+0 3.497350-59552 4 62 - 0.000000+0 2.886300-6 0.000000+0 9.759630-8 0.000000+0 8.02897-109552 4 62 - 0.000000+0-1.72519-11 9552 4 62 - 0.000000+0 1.400000+7 0 0 20 09552 4 62 - 0.000000+0 4.865290-3 0.000000+0-4.288680-3 0.000000+0-1.426720-39552 4 62 - 0.000000+0-3.488040-4 0.000000+0 5.703120-5 0.000000+0 7.242930-59552 4 62 - 0.000000+0 2.008530-5 0.000000+0 2.579850-6 0.000000+0 1.495650-79552 4 62 - 0.000000+0 8.18825-11 9552 4 62 - 0.000000+0 2.000000+7 0 0 20 09552 4 62 - 0.000000+0 2.263030-2 0.000000+0-4.833830-3 0.000000+0-1.547950-39552 4 62 - 0.000000+0-6.950320-4 0.000000+0-1.702720-4 0.000000+0 4.115340-59552 4 62 - 0.000000+0 4.769220-5 0.000000+0 2.097800-5 0.000000+0 5.181560-69552 4 62 - 0.000000+0 5.116940-7 9552 4 62 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 63 - 0.000000+0 2.419680+2 0 2 0 09552 4 63 - 0.000000+0 0.000000+0 0 0 1 69552 4 63 - 6 2 9552 4 63 - 0.000000+0 3.240850+5 0 0 2 09552 4 63 - 0.000000+0 0.000000+0 9552 4 63 - 0.000000+0 1.000000+6 0 0 10 09552 4 63 - 0.000000+0 9.154750-4 0.000000+0-1.928000-4 0.000000+0-7.162980-59552 4 63 - 0.000000+0-2.022500-8 0.000000+0-5.07768-10 9552 4 63 - 0.000000+0 5.000000+6 0 0 16 09552 4 63 - 0.000000+0 1.682360-2 0.000000+0 1.025760-3 0.000000+0-1.021220-49552 4 63 - 0.000000+0-8.490360-5 0.000000+0-1.450100-5 0.000000+0-3.764220-69552 4 63 - 0.000000+0-6.032510-9 0.000000+0-1.76971-10 9552 4 63 - 0.000000+0 1.000000+7 0 0 20 09552 4 63 - 0.000000+0 2.149780-2 0.000000+0 2.889940-3 0.000000+0 3.745410-49552 4 63 - 0.000000+0-2.575380-5 0.000000+0-6.033480-5 0.000000+0-3.130180-59552 4 63 - 0.000000+0-8.256130-6 0.000000+0-2.264540-7 0.000000+0-2.651150-89552 4 63 - 0.000000+0-2.58540-10 9552 4 63 - 0.000000+0 1.400000+7 0 0 20 09552 4 63 - 0.000000+0 2.353100-2 0.000000+0 3.854250-3 0.000000+0 6.287610-49552 4 63 - 0.000000+0 9.149090-5 0.000000+0-3.628040-5 0.000000+0-3.814240-59552 4 63 - 0.000000+0-2.113390-5 0.000000+0-4.047570-6 0.000000+0-5.555120-79552 4 63 - 0.000000+0-4.594630-8 9552 4 63 - 0.000000+0 2.000000+7 0 0 20 09552 4 63 - 0.000000+0 2.983970-2 0.000000+0 4.449750-3 0.000000+0 1.157800-39552 4 63 - 0.000000+0 2.241560-4 0.000000+0 3.975250-5 0.000000+0-2.498290-59552 4 63 - 0.000000+0-2.484150-5 0.000000+0-1.510590-5 0.000000+0-5.389990-69552 4 63 - 0.000000+0-1.351490-6 9552 4 63 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 64 - 0.000000+0 2.419680+2 0 2 0 09552 4 64 - 0.000000+0 0.000000+0 0 0 1 69552 4 64 - 6 2 9552 4 64 - 0.000000+0 3.369620+5 0 0 2 09552 4 64 - 0.000000+0 0.000000+0 9552 4 64 - 0.000000+0 1.000000+6 0 0 10 09552 4 64 - 0.000000+0 5.898240-3 0.000000+0-1.564970-2 0.000000+0-7.417370-49552 4 64 - 0.000000+0-6.537230-7 0.000000+0-3.217890-8 9552 4 64 - 0.000000+0 5.000000+6 0 0 16 09552 4 64 - 0.000000+0-3.570630-2 0.000000+0 4.987250-3 0.000000+0-6.667080-49552 4 64 - 0.000000+0-2.471120-4 0.000000+0-1.115250-5 0.000000+0-1.803250-59552 4 64 - 0.000000+0-3.163680-8 0.000000+0-1.244360-9 9552 4 64 - 0.000000+0 1.000000+7 0 0 20 09552 4 64 - 0.000000+0-3.975930-2 0.000000+0-2.992770-3 0.000000+0 3.225320-39552 4 64 - 0.000000+0-6.457840-4 0.000000+0-8.223360-5 0.000000+0 2.054630-59552 4 64 - 0.000000+0-3.168930-5 0.000000+0-6.536720-7 0.000000+0-1.619710-79552 4 64 - 0.000000+0-1.752400-9 9552 4 64 - 0.000000+0 1.400000+7 0 0 20 09552 4 64 - 0.000000+0-1.783310-2 0.000000+0-1.185440-2 0.000000+0 2.912600-39552 4 64 - 0.000000+0 9.631410-4 0.000000+0-5.404380-4 0.000000+0 2.079960-59552 4 64 - 0.000000+0-5.670430-6 0.000000+0-5.929530-6 0.000000+0-2.328940-69552 4 64 - 0.000000+0-2.931290-7 9552 4 64 - 0.000000+0 2.000000+7 0 0 20 09552 4 64 - 0.000000+0 1.424190-2 0.000000+0-1.643210-2 0.000000+0-1.750450-39552 4 64 - 0.000000+0 2.185200-3 0.000000+0 4.270420-4 0.000000+0-3.466430-49552 4 64 - 0.000000+0-6.539700-5 0.000000+0 3.174490-5 0.000000+0 6.762400-69552 4 64 - 0.000000+0-4.529130-6 9552 4 64 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 65 - 0.000000+0 2.419680+2 0 2 0 09552 4 65 - 0.000000+0 0.000000+0 0 0 1 69552 4 65 - 6 2 9552 4 65 - 0.000000+0 3.440660+5 0 0 2 09552 4 65 - 0.000000+0 0.000000+0 9552 4 65 - 0.000000+0 1.000000+6 0 0 10 09552 4 65 - 0.000000+0-1.108730-2 0.000000+0 4.037310-4 0.000000+0 1.450570-49552 4 65 - 0.000000+0 3.470110-8 0.000000+0 5.64207-10 9552 4 65 - 0.000000+0 5.000000+6 0 0 16 09552 4 65 - 0.000000+0-1.636960-2 0.000000+0-2.703760-3 0.000000+0 1.181570-49552 4 65 - 0.000000+0 1.050630-4 0.000000+0 1.536530-5 0.000000+0 1.327390-69552 4 65 - 0.000000+0 1.724210-9 0.000000+0 1.38782-11 9552 4 65 - 0.000000+0 1.000000+7 0 0 20 09552 4 65 - 0.000000+0-5.450560-3 0.000000+0-4.036900-3 0.000000+0-1.108210-39552 4 65 - 0.000000+0 7.084520-6 0.000000+0 1.132420-4 0.000000+0 3.459040-59552 4 65 - 0.000000+0 2.830670-6 0.000000+0 9.501350-8 0.000000+0 7.73189-109552 4 65 - 0.000000+0-1.65713-11 9552 4 65 - 0.000000+0 1.400000+7 0 0 20 09552 4 65 - 0.000000+0 4.788930-3 0.000000+0-4.287650-3 0.000000+0-1.425940-39552 4 65 - 0.000000+0-3.467440-4 0.000000+0 5.766170-5 0.000000+0 7.245340-59552 4 65 - 0.000000+0 1.993380-5 0.000000+0 2.544190-6 0.000000+0 1.463010-79552 4 65 - 0.000000+0 6.13005-11 9552 4 65 - 0.000000+0 2.000000+7 0 0 20 09552 4 65 - 0.000000+0 2.254780-2 0.000000+0-4.834670-3 0.000000+0-1.547130-39552 4 65 - 0.000000+0-6.943100-4 0.000000+0-1.691120-4 0.000000+0 4.145920-59552 4 65 - 0.000000+0 4.766760-5 0.000000+0 2.089140-5 0.000000+0 5.138680-69552 4 65 - 0.000000+0 5.040070-7 9552 4 65 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 66 - 0.000000+0 2.419680+2 0 2 0 09552 4 66 - 0.000000+0 0.000000+0 0 0 1 69552 4 66 - 6 2 9552 4 66 - 0.000000+0 3.450780+5 0 0 2 09552 4 66 - 0.000000+0 0.000000+0 9552 4 66 - 0.000000+0 1.000000+6 0 0 10 09552 4 66 - 0.000000+0-1.437040-2 0.000000+0-6.511080-4 0.000000+0-1.125740-59552 4 66 - 0.000000+0 1.533460-9 0.000000+0 1.91332-10 9552 4 66 - 0.000000+0 5.000000+6 0 0 16 09552 4 66 - 0.000000+0 5.962410-4 0.000000+0-2.639550-3 0.000000+0-6.739240-49552 4 66 - 0.000000+0-7.452520-5 0.000000+0-3.689910-6 0.000000+0 1.484110-69552 4 66 - 0.000000+0 2.602210-9 0.000000+0 9.81448-11 9552 4 66 - 0.000000+0 1.000000+7 0 0 20 09552 4 66 - 0.000000+0 9.673550-3 0.000000+0-1.071380-3 0.000000+0-1.105490-39552 4 66 - 0.000000+0-4.366840-4 0.000000+0-1.147870-4 0.000000+0-9.113810-69552 4 66 - 0.000000+0 2.986820-6 0.000000+0 7.366360-8 0.000000+0 1.513750-89552 4 66 - 0.000000+0 1.60526-10 9552 4 66 - 0.000000+0 1.400000+7 0 0 20 09552 4 66 - 0.000000+0 1.531780-2 0.000000+0-3.670550-5 0.000000+0-9.435940-49552 4 66 - 0.000000+0-5.310500-4 0.000000+0-2.152270-4 0.000000+0-6.066250-59552 4 66 - 0.000000+0-3.197120-6 0.000000+0 7.151480-7 0.000000+0 2.402420-79552 4 66 - 0.000000+0 2.711120-8 9552 4 66 - 0.000000+0 2.000000+7 0 0 20 09552 4 66 - 0.000000+0 2.679270-2 0.000000+0 3.726290-4 0.000000+0-3.621410-49552 4 66 - 0.000000+0-5.906700-4 0.000000+0-3.033290-4 0.000000+0-1.361830-49552 4 66 - 0.000000+0-4.812100-5 0.000000+0-8.529210-6 0.000000+0-1.348350-79552 4 66 - 0.000000+0 5.079120-7 9552 4 66 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 67 - 0.000000+0 2.419680+2 0 2 0 09552 4 67 - 0.000000+0 0.000000+0 0 0 1 69552 4 67 - 6 2 9552 4 67 - 0.000000+0 3.498450+5 0 0 2 09552 4 67 - 0.000000+0 0.000000+0 9552 4 67 - 0.000000+0 1.000000+6 0 0 8 09552 4 67 - 0.000000+0-1.545410-2 0.000000+0 5.141850-4 0.000000+0 1.225950-59552 4 67 - 0.000000+0 2.408710-8 9552 4 67 - 0.000000+0 5.000000+6 0 0 14 09552 4 67 - 0.000000+0-1.521080-2 0.000000+0-2.909660-3 0.000000+0 1.286910-49552 4 67 - 0.000000+0 1.095310-4 0.000000+0 1.849420-5 0.000000+0 4.593220-79552 4 67 - 0.000000+0 2.542590-9 9552 4 67 - 0.000000+0 1.000000+7 0 0 20 09552 4 67 - 0.000000+0-4.741190-3 0.000000+0-3.817490-3 0.000000+0-1.048780-39552 4 67 - 0.000000+0-1.498980-5 0.000000+0 7.974320-5 0.000000+0 3.917170-59552 4 67 - 0.000000+0 3.281380-6 0.000000+0 1.383290-7 0.000000+0 3.823420-99552 4 67 - 0.000000+0 7.95879-12 9552 4 67 - 0.000000+0 1.400000+7 0 0 20 09552 4 67 - 0.000000+0 4.871660-3 0.000000+0-4.164860-3 0.000000+0-1.416590-39552 4 67 - 0.000000+0-3.399350-4 0.000000+0 5.929350-5 0.000000+0 6.746340-59552 4 67 - 0.000000+0 2.249550-5 0.000000+0 3.045060-6 0.000000+0 2.471870-79552 4 67 - 0.000000+0 6.944710-9 9552 4 67 - 0.000000+0 2.000000+7 0 0 20 09552 4 67 - 0.000000+0 2.258480-2 0.000000+0-4.817480-3 0.000000+0-1.532090-39552 4 67 - 0.000000+0-6.863210-4 0.000000+0-1.638060-4 0.000000+0 4.796080-59552 4 67 - 0.000000+0 5.136950-5 0.000000+0 2.259810-5 0.000000+0 5.662690-69552 4 67 - 0.000000+0 7.147620-7 9552 4 67 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 68 - 0.000000+0 2.419680+2 0 2 0 09552 4 68 - 0.000000+0 0.000000+0 0 0 1 69552 4 68 - 6 2 9552 4 68 - 0.000000+0 3.633330+5 0 0 2 09552 4 68 - 0.000000+0 0.000000+0 9552 4 68 - 0.000000+0 1.000000+6 0 0 10 09552 4 68 - 0.000000+0-1.151970-2 0.000000+0 8.042740-4 0.000000+0-2.809570-49552 4 68 - 0.000000+0-8.638020-8 0.000000+0-2.128970-9 9552 4 68 - 0.000000+0 5.000000+6 0 0 16 09552 4 68 - 0.000000+0-2.879710-2 0.000000+0 2.653600-4 0.000000+0 4.733860-49552 4 68 - 0.000000+0-1.471410-5 0.000000+0-1.348380-5 0.000000+0-3.947280-69552 4 68 - 0.000000+0-6.016190-9 0.000000+0-1.54089-10 9552 4 68 - 0.000000+0 1.000000+7 0 0 20 09552 4 68 - 0.000000+0-2.071400-2 0.000000+0-4.739650-3 0.000000+0 2.781770-49552 4 68 - 0.000000+0 3.754730-4 0.000000+0 3.688300-5 0.000000+0-2.989880-59552 4 68 - 0.000000+0-7.445440-6 0.000000+0-2.180100-7 0.000000+0-1.992880-89552 4 68 - 0.000000+0-1.75199-10 9552 4 68 - 0.000000+0 1.400000+7 0 0 20 09552 4 68 - 0.000000+0-5.567740-3 0.000000+0-7.832830-3 0.000000+0-3.797730-49552 4 68 - 0.000000+0 2.892280-4 0.000000+0 2.017060-4 0.000000+0 6.401090-69552 4 68 - 0.000000+0-1.974650-5 0.000000+0-4.206160-6 0.000000+0-4.986120-79552 4 68 - 0.000000+0-3.394600-8 9552 4 68 - 0.000000+0 2.000000+7 0 0 20 09552 4 68 - 0.000000+0 1.857580-2 0.000000+0-9.997670-3 0.000000+0-1.963640-39552 4 68 - 0.000000+0 8.629400-5 0.000000+0 1.911930-4 0.000000+0 1.299970-49552 4 68 - 0.000000+0 2.385390-5 0.000000+0-1.268410-5 0.000000+0-6.518850-69552 4 68 - 0.000000+0-1.331960-6 9552 4 68 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 69 - 0.000000+0 2.419680+2 0 2 0 09552 4 69 - 0.000000+0 0.000000+0 0 0 1 69552 4 69 - 6 2 9552 4 69 - 0.000000+0 3.786150+5 0 0 2 09552 4 69 - 0.000000+0 0.000000+0 9552 4 69 - 0.000000+0 1.000000+6 0 0 8 09552 4 69 - 0.000000+0 8.521370-2 0.000000+0 3.851630-3 0.000000+0 1.315680-49552 4 69 - 0.000000+0 5.829100-7 9552 4 69 - 0.000000+0 5.000000+6 0 0 14 09552 4 69 - 0.000000+0-3.756560-2 0.000000+0 4.388500-3 0.000000+0 2.120730-49552 4 69 - 0.000000+0-1.830830-4 0.000000+0 1.130130-4 0.000000+0 1.880210-69552 4 69 - 0.000000+0 1.163690-8 9552 4 69 - 0.000000+0 1.000000+7 0 0 20 09552 4 69 - 0.000000+0-3.863570-2 0.000000+0-3.345650-3 0.000000+0 3.101150-39552 4 69 - 0.000000+0-3.644050-4 0.000000+0-2.739450-4 0.000000+0 1.624840-49552 4 69 - 0.000000+0 2.326910-6 0.000000+0 6.076440-7 0.000000+0 1.127290-89552 4 69 - 0.000000+0-1.98134-11 9552 4 69 - 0.000000+0 1.400000+7 0 0 20 09552 4 69 - 0.000000+0-1.759970-2 0.000000+0-1.213420-2 0.000000+0 3.147310-39552 4 69 - 0.000000+0 8.345450-4 0.000000+0-5.016950-4 0.000000+0-1.966570-69552 4 69 - 0.000000+0 5.524350-5 0.000000+0 6.589950-6 0.000000+0 7.735450-79552 4 69 - 0.000000+0 6.29283-10 9552 4 69 - 0.000000+0 2.000000+7 0 0 20 09552 4 69 - 0.000000+0 1.409650-2 0.000000+0-1.643230-2 0.000000+0-1.743130-39552 4 69 - 0.000000+0 2.185840-3 0.000000+0 3.975350-4 0.000000+0-3.409870-49552 4 69 - 0.000000+0-6.850720-5 0.000000+0 3.569500-5 0.000000+0 1.301380-59552 4 69 - 0.000000+0 6.776650-7 9552 4 69 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 70 - 0.000000+0 2.419680+2 0 2 0 09552 4 70 - 0.000000+0 0.000000+0 0 0 1 69552 4 70 - 6 2 9552 4 70 - 0.000000+0 3.916400+5 0 0 2 09552 4 70 - 0.000000+0 0.000000+0 9552 4 70 - 0.000000+0 1.000000+6 0 0 8 09552 4 70 - 0.000000+0-1.574790-2 0.000000+0-7.225290-4 0.000000+0-4.424350-69552 4 70 - 0.000000+0-6.982500-9 9552 4 70 - 0.000000+0 5.000000+6 0 0 14 09552 4 70 - 0.000000+0 1.361730-3 0.000000+0-2.539910-3 0.000000+0-7.488730-49552 4 70 - 0.000000+0-8.773530-5 0.000000+0-1.106090-5 0.000000+0-1.330250-79552 4 70 - 0.000000+0-7.43257-10 9552 4 70 - 0.000000+0 1.000000+7 0 0 20 09552 4 70 - 0.000000+0 9.641590-3 0.000000+0-9.582560-4 0.000000+0-1.044750-39552 4 70 - 0.000000+0-3.981010-4 0.000000+0-1.091650-4 0.000000+0-2.195190-59552 4 70 - 0.000000+0-1.957550-7 0.000000+0-4.754340-8 0.000000+0-7.59930-109552 4 70 - 0.000000+0 4.86233-12 9552 4 70 - 0.000000+0 1.400000+7 0 0 20 09552 4 70 - 0.000000+0 1.516190-2 0.000000+0-7.597420-6 0.000000+0-9.296210-49552 4 70 - 0.000000+0-5.336760-4 0.000000+0-2.155500-4 0.000000+0-6.262320-59552 4 70 - 0.000000+0-9.744900-6 0.000000+0-6.134120-7 0.000000+0-5.480280-89552 4 70 - 0.000000+0 1.75083-10 9552 4 70 - 0.000000+0 2.000000+7 0 0 20 09552 4 70 - 0.000000+0 2.670560-2 0.000000+0 3.515610-4 0.000000+0-3.794530-49552 4 70 - 0.000000+0-6.015840-4 0.000000+0-3.116640-4 0.000000+0-1.437890-49552 4 70 - 0.000000+0-5.211050-5 0.000000+0-1.091680-5 0.000000+0-1.296740-69552 4 70 - 0.000000+0-3.683310-8 9552 4 70 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 71 - 0.000000+0 2.419680+2 0 2 0 09552 4 71 - 0.000000+0 0.000000+0 0 0 1 69552 4 71 - 6 2 9552 4 71 - 0.000000+0 4.003910+5 0 0 2 09552 4 71 - 0.000000+0 0.000000+0 9552 4 71 - 0.000000+0 1.000000+6 0 0 8 09552 4 71 - 0.000000+0 1.589020-4 0.000000+0-1.810160-4 0.000000+0-5.471730-59552 4 71 - 0.000000+0-1.332990-8 9552 4 71 - 0.000000+0 5.000000+6 0 0 16 09552 4 71 - 0.000000+0 1.672220-2 0.000000+0 1.000490-3 0.000000+0-1.067930-49552 4 71 - 0.000000+0-8.362820-5 0.000000+0-1.397180-5 0.000000+0-3.469180-69552 4 71 - 0.000000+0-5.486380-9 0.000000+0-1.60770-10 9552 4 71 - 0.000000+0 1.000000+7 0 0 20 09552 4 71 - 0.000000+0 2.146440-2 0.000000+0 2.876440-3 0.000000+0 3.713770-49552 4 71 - 0.000000+0-2.703790-5 0.000000+0-6.043580-5 0.000000+0-3.117170-59552 4 71 - 0.000000+0-8.021970-6 0.000000+0-2.178690-7 0.000000+0-2.534750-89552 4 71 - 0.000000+0-2.41761-10 9552 4 71 - 0.000000+0 1.400000+7 0 0 20 09552 4 71 - 0.000000+0 2.349030-2 0.000000+0 3.844580-3 0.000000+0 6.252430-49552 4 71 - 0.000000+0 9.015490-5 0.000000+0-3.668880-5 0.000000+0-3.818840-59552 4 71 - 0.000000+0-2.110030-5 0.000000+0-3.968580-6 0.000000+0-5.432920-79552 4 71 - 0.000000+0-4.426750-8 9552 4 71 - 0.000000+0 2.000000+7 0 0 20 09552 4 71 - 0.000000+0 2.977500-2 0.000000+0 4.446310-3 0.000000+0 1.152980-39552 4 71 - 0.000000+0 2.231090-4 0.000000+0 3.905830-5 0.000000+0-2.518630-59552 4 71 - 0.000000+0-2.484900-5 0.000000+0-1.506180-5 0.000000+0-5.340330-69552 4 71 - 0.000000+0-1.333280-6 9552 4 71 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 72 - 0.000000+0 2.419680+2 0 2 0 09552 4 72 - 0.000000+0 0.000000+0 0 0 1 69552 4 72 - 6 2 9552 4 72 - 0.000000+0 4.164030+5 0 0 2 09552 4 72 - 0.000000+0 0.000000+0 9552 4 72 - 0.000000+0 1.000000+6 0 0 8 09552 4 72 - 0.000000+0 7.060350-3 0.000000+0 1.725660-3 0.000000+0-2.749310-69552 4 72 - 0.000000+0-7.947640-9 9552 4 72 - 0.000000+0 5.000000+6 0 0 14 09552 4 72 - 0.000000+0-2.858110-2 0.000000+0 1.960260-4 0.000000+0 4.930640-49552 4 72 - 0.000000+0 1.542730-7 0.000000+0-8.528030-6 0.000000+0-4.353090-79552 4 72 - 0.000000+0-2.507550-9 9552 4 72 - 0.000000+0 1.000000+7 0 0 20 09552 4 72 - 0.000000+0-1.964350-2 0.000000+0-4.703340-3 0.000000+0 2.195350-49552 4 72 - 0.000000+0 3.065260-4 0.000000+0 7.466570-5 0.000000+0-2.105600-59552 4 72 - 0.000000+0-4.103950-6 0.000000+0-1.303040-7 0.000000+0-4.395790-99552 4 72 - 0.000000+0-1.59653-11 9552 4 72 - 0.000000+0 1.400000+7 0 0 20 09552 4 72 - 0.000000+0-5.514870-3 0.000000+0-7.773880-3 0.000000+0-4.208950-49552 4 72 - 0.000000+0 2.952310-4 0.000000+0 1.893760-4 0.000000+0 1.207700-59552 4 72 - 0.000000+0-1.586580-5 0.000000+0-3.351710-6 0.000000+0-2.800480-79552 4 72 - 0.000000+0-1.024460-8 9552 4 72 - 0.000000+0 2.000000+7 0 0 20 09552 4 72 - 0.000000+0 1.846680-2 0.000000+0-1.000350-2 0.000000+0-1.958970-39552 4 72 - 0.000000+0 8.053700-5 0.000000+0 1.889050-4 0.000000+0 1.252700-49552 4 72 - 0.000000+0 2.010830-5 0.000000+0-1.351890-5 0.000000+0-6.158390-69552 4 72 - 0.000000+0-9.927639-7 9552 4 72 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 73 - 0.000000+0 2.419680+2 0 2 0 09552 4 73 - 0.000000+0 0.000000+0 0 0 1 69552 4 73 - 6 2 9552 4 73 - 0.000000+0 4.206880+5 0 0 2 09552 4 73 - 0.000000+0 0.000000+0 9552 4 73 - 0.000000+0 1.000000+6 0 0 8 09552 4 73 - 0.000000+0 7.223710-3 0.000000+0 1.716080-3 0.000000+0-2.720450-69552 4 73 - 0.000000+0-7.796090-9 9552 4 73 - 0.000000+0 5.000000+6 0 0 14 09552 4 73 - 0.000000+0-2.858110-2 0.000000+0 1.987450-4 0.000000+0 4.929360-49552 4 73 - 0.000000+0-2.093540-8 0.000000+0-8.513400-6 0.000000+0-4.334640-79552 4 73 - 0.000000+0-2.494390-9 9552 4 73 - 0.000000+0 1.000000+7 0 0 20 09552 4 73 - 0.000000+0-1.965260-2 0.000000+0-4.701020-3 0.000000+0 2.199630-49552 4 73 - 0.000000+0 3.064790-4 0.000000+0 7.455570-5 0.000000+0-2.104880-59552 4 73 - 0.000000+0-4.096880-6 0.000000+0-1.299850-7 0.000000+0-4.382010-99552 4 73 - 0.000000+0-1.59054-11 9552 4 73 - 0.000000+0 1.400000+7 0 0 20 09552 4 73 - 0.000000+0-5.524360-3 0.000000+0-7.772510-3 0.000000+0-4.204490-49552 4 73 - 0.000000+0 2.953110-4 0.000000+0 1.893420-4 0.000000+0 1.203180-59552 4 73 - 0.000000+0-1.586250-5 0.000000+0-3.347500-6 0.000000+0-2.795560-79552 4 73 - 0.000000+0-1.021920-8 9552 4 73 - 0.000000+0 2.000000+7 0 0 20 09552 4 73 - 0.000000+0 1.845720-2 0.000000+0-1.000340-2 0.000000+0-1.958230-39552 4 73 - 0.000000+0 8.065020-5 0.000000+0 1.889310-4 0.000000+0 1.252470-49552 4 73 - 0.000000+0 2.007840-5 0.000000+0-1.352060-5 0.000000+0-6.154310-69552 4 73 - 0.000000+0-9.916261-7 9552 4 73 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 74 - 0.000000+0 2.419680+2 0 2 0 09552 4 74 - 0.000000+0 0.000000+0 0 0 1 69552 4 74 - 6 2 9552 4 74 - 0.000000+0 4.218670+5 0 0 2 09552 4 74 - 0.000000+0 0.000000+0 9552 4 74 - 0.000000+0 1.000000+6 0 0 8 09552 4 74 - 0.000000+0 7.268690-3 0.000000+0 1.713440-3 0.000000+0-2.712490-69552 4 74 - 0.000000+0-7.754660-9 9552 4 74 - 0.000000+0 5.000000+6 0 0 14 09552 4 74 - 0.000000+0-2.858110-2 0.000000+0 1.994930-4 0.000000+0 4.929010-49552 4 74 - 0.000000+0-6.898880-8 0.000000+0-8.509380-6 0.000000+0-4.329570-79552 4 74 - 0.000000+0-2.490780-9 9552 4 74 - 0.000000+0 1.000000+7 0 0 20 09552 4 74 - 0.000000+0-1.965510-2 0.000000+0-4.700380-3 0.000000+0 2.200800-49552 4 74 - 0.000000+0 3.064660-4 0.000000+0 7.452540-5 0.000000+0-2.104680-59552 4 74 - 0.000000+0-4.094930-6 0.000000+0-1.298970-7 0.000000+0-4.378230-99552 4 74 - 0.000000+0-1.58890-11 9552 4 74 - 0.000000+0 1.400000+7 0 0 20 09552 4 74 - 0.000000+0-5.526980-3 0.000000+0-7.772140-3 0.000000+0-4.203260-49552 4 74 - 0.000000+0 2.953340-4 0.000000+0 1.893330-4 0.000000+0 1.201940-59552 4 74 - 0.000000+0-1.586160-5 0.000000+0-3.346350-6 0.000000+0-2.794210-79552 4 74 - 0.000000+0-1.021230-8 9552 4 74 - 0.000000+0 2.000000+7 0 0 20 09552 4 74 - 0.000000+0 1.845450-2 0.000000+0-1.000340-2 0.000000+0-1.958030-39552 4 74 - 0.000000+0 8.068130-5 0.000000+0 1.889390-4 0.000000+0 1.252400-49552 4 74 - 0.000000+0 2.007010-5 0.000000+0-1.352110-5 0.000000+0-6.153190-69552 4 74 - 0.000000+0-9.913130-7 9552 4 74 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 75 - 0.000000+0 2.419680+2 0 2 0 09552 4 75 - 0.000000+0 0.000000+0 0 0 1 69552 4 75 - 6 2 9552 4 75 - 0.000000+0 4.229450+5 0 0 2 09552 4 75 - 0.000000+0 0.000000+0 9552 4 75 - 0.000000+0 1.000000+6 0 0 8 09552 4 75 - 0.000000+0-9.153610-3 0.000000+0 4.203400-4 0.000000+0 1.148520-49552 4 75 - 0.000000+0 2.216180-8 9552 4 75 - 0.000000+0 5.000000+6 0 0 16 09552 4 75 - 0.000000+0-1.652210-2 0.000000+0-2.666070-3 0.000000+0 1.286980-49552 4 75 - 0.000000+0 1.041710-4 0.000000+0 1.450310-5 0.000000+0 1.221550-69552 4 75 - 0.000000+0 1.563790-9 0.000000+0 1.25892-11 9552 4 75 - 0.000000+0 1.000000+7 0 0 20 09552 4 75 - 0.000000+0-5.569580-3 0.000000+0-4.037180-3 0.000000+0-1.102490-39552 4 75 - 0.000000+0 1.068860-5 0.000000+0 1.136440-4 0.000000+0 3.393720-59552 4 75 - 0.000000+0 2.736710-6 0.000000+0 9.071170-8 0.000000+0 7.24628-109552 4 75 - 0.000000+0-1.54626-11 9552 4 75 - 0.000000+0 1.400000+7 0 0 20 09552 4 75 - 0.000000+0 4.658830-3 0.000000+0-4.285800-3 0.000000+0-1.424510-39552 4 75 - 0.000000+0-3.432020-4 0.000000+0 5.872290-5 0.000000+0 7.248220-59552 4 75 - 0.000000+0 1.967470-5 0.000000+0 2.483880-6 0.000000+0 1.408470-79552 4 75 - 0.000000+0 2.87085-11 9552 4 75 - 0.000000+0 2.000000+7 0 0 20 09552 4 75 - 0.000000+0 2.240690-2 0.000000+0-4.835990-3 0.000000+0-1.545710-39552 4 75 - 0.000000+0-6.930410-4 0.000000+0-1.671230-4 0.000000+0 4.197700-59552 4 75 - 0.000000+0 4.762220-5 0.000000+0 2.074190-5 0.000000+0 5.065570-69552 4 75 - 0.000000+0 4.910500-7 9552 4 75 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 9.524400+4 2.419680+2 0 1 0 09552 4 91 - 0.000000+0 2.419680+2 0 1 0 09552 4 91 - 0.000000+0 0.000000+0 0 0 1 69552 4 91 - 6 2 9552 4 91 - 0.000000+0 4.367980+5 0 0 2 09552 4 91 - 0.000000+0 0.000000+0 9552 4 91 - 0.000000+0 1.000000+6 0 0 8 09552 4 91 - 0.000000+0 1.624800-2 0.000000+0 3.278570-4 0.000000+0 2.195160-59552 4 91 - 0.000000+0 4.104740-9 9552 4 91 - 0.000000+0 5.000000+6 0 0 16 09552 4 91 - 0.000000+0 1.880670-2 0.000000+0 1.902180-3 0.000000+0 2.893520-49552 4 91 - 0.000000+0 9.479450-6 0.000000+0 6.493640-7 0.000000+0 1.425920-89552 4 91 - 0.000000+0 1.46631-11 0.000000+0 2.33585-13 9552 4 91 - 0.000000+0 1.000000+7 0 0 20 09552 4 91 - 0.000000+0 1.867670-2 0.000000+0 2.194630-3 0.000000+0 3.915430-49552 4 91 - 0.000000+0 3.132760-5 0.000000+0 4.903650-6 0.000000+0 2.719210-79552 4 91 - 0.000000+0 5.224170-9 0.000000+0 1.06735-10 0.000000+0 1.75070-129552 4 91 - 0.000000+0 2.03715-15 9552 4 91 - 0.000000+0 1.400000+7 0 0 20 09552 4 91 - 0.000000+0 1.820670-2 0.000000+0 2.210330-3 0.000000+0 4.112170-49552 4 91 - 0.000000+0 4.388940-5 0.000000+0 7.956940-6 0.000000+0 7.686300-79552 4 91 - 0.000000+0 2.590770-8 0.000000+0 1.627290-9 0.000000+0 3.80460-119552 4 91 - 0.000000+0 2.63433-13 9552 4 91 - 0.000000+0 2.000000+7 0 0 20 09552 4 91 - 0.000000+0 1.735320-2 0.000000+0 2.221120-3 0.000000+0 4.190500-49552 4 91 - 0.000000+0 5.876550-5 0.000000+0 1.159820-5 0.000000+0 1.659040-69552 4 91 - 0.000000+0 8.689260-8 0.000000+0 9.646560-9 0.000000+0 6.29724-109552 4 91 - 0.000000+0 1.35238-11 9552 4 91 - 0.000000+0 0.000000+0 0 0 0 09552 4 0 - 0.000000+0 0.000000+0 0 0 0 09552 0 0 - 9.524400+4 2.419680+2 0 0 2 09552 5 16 - 5.385400+6 0.000000+0 0 9 1 29552 5 16 - 2 2 9552 5 16 - 5.385400+6 5.000000-1 2.000000+7 5.000000-1 9552 5 16 - 0.000000+0 0.000000+0 0 0 1 99552 5 16 - 9 2 9552 5 16 - 5.385400+6 4.408370+5 6.000000+6 4.643510+5 8.000000+6 5.335170+59552 5 16 - 1.000000+7 5.944610+5 1.200000+7 6.495640+5 1.400000+7 7.002390+59552 5 16 - 1.600000+7 7.474080+5 1.800000+7 7.917120+5 2.000000+7 8.336170+59552 5 16 - 5.385400+6 0.000000+0 0 9 1 29552 5 16 - 2 2 9552 5 16 - 5.385400+6 5.000000-1 2.000000+7 5.000000-1 9552 5 16 - 0.000000+0 0.000000+0 0 0 1 99552 5 16 - 9 2 9552 5 16 - 5.385400+6 4.069980+5 6.000000+6 4.069980+5 8.000000+6 4.069980+59552 5 16 - 1.000000+7 4.069980+5 1.200000+7 4.421220+5 1.400000+7 5.184460+59552 5 16 - 1.600000+7 5.848560+5 1.800000+7 6.444350+5 2.000000+7 6.989480+59552 5 16 - 0.000000+0 0.000000+0 0 0 0 09552 5 0 - 9.524400+4 2.419680+2 0 0 3 09552 5 17 - 1.177590+7 0.000000+0 0 9 1 29552 5 17 - 2 2 9552 5 17 - 1.177590+7 3.333330-1 2.000000+7 3.333330-1 9552 5 17 - 0.000000+0 0.000000+0 0 0 1 69552 5 17 - 6 2 9552 5 17 - 1.177590+7 6.436300+5 1.200000+7 6.495640+5 1.400000+7 7.002390+59552 5 17 - 1.600000+7 7.474080+5 1.800000+7 7.917120+5 2.000000+7 8.336170+59552 5 17 - 1.177590+7 0.000000+0 0 9 1 29552 5 17 - 2 2 9552 5 17 - 1.177590+7 3.333330-1 2.000000+7 3.333330-1 9552 5 17 - 0.000000+0 0.000000+0 0 0 1 69552 5 17 - 6 2 9552 5 17 - 1.177590+7 4.868130+5 1.200000+7 4.899400+5 1.400000+7 5.315330+59552 5 17 - 1.600000+7 5.876620+5 1.800000+7 6.449950+5 2.000000+7 6.990630+59552 5 17 - 1.177590+7 0.000000+0 0 9 1 29552 5 17 - 2 2 9552 5 17 - 1.177590+7 3.333330-1 2.000000+7 3.333330-1 9552 5 17 - 0.000000+0 0.000000+0 0 0 1 69552 5 17 - 6 2 9552 5 17 - 1.177590+7 4.106340+5 1.200000+7 4.106340+5 1.400000+7 4.106340+59552 5 17 - 1.600000+7 4.106340+5 1.800000+7 3.770310+5 2.000000+7 4.606130+59552 5 17 - 0.000000+0 0.000000+0 0 0 0 09552 5 0 - 9.524400+4 2.419680+2 0 0 1 09552 5 18 --2.000000+7 0.000000+0 0 7 1 29552 5 18 - 2 2 9552 5 18 - 1.000000-5 1.000000+0 2.000000+7 1.000000+0 9552 5 18 - 0.000000+0 0.000000+0 0 0 1 29552 5 18 - 2 2 9552 5 18 - 1.000000-5 1.380000+6 2.000000+7 1.380000+6 9552 5 18 - 0.000000+0 0.000000+0 0 0 0 09552 5 0 - 9.524400+4 2.419680+2 0 0 4 09552 5 37 - 1.734000+7 0.000000+0 0 9 1 29552 5 37 - 2 2 9552 5 37 - 1.734000+7 2.500000-1 2.000000+7 2.500000-1 9552 5 37 - 0.000000+0 0.000000+0 0 0 1 39552 5 37 - 3 2 9552 5 37 - 1.734000+7 7.773770+5 1.800000+7 7.917120+5 2.000000+7 8.336170+59552 5 37 - 1.734000+7 0.000000+0 0 9 1 29552 5 37 - 2 2 9552 5 37 - 1.734000+7 2.500000-1 2.000000+7 2.500000-1 9552 5 37 - 0.000000+0 0.000000+0 0 0 1 39552 5 37 - 3 2 9552 5 37 - 1.734000+7 6.712730+5 1.800000+7 6.784120+5 2.000000+7 7.103730+59552 5 37 - 1.734000+7 0.000000+0 0 9 1 29552 5 37 - 2 2 9552 5 37 - 1.734000+7 2.500000-1 2.000000+7 2.500000-1 9552 5 37 - 0.000000+0 0.000000+0 0 0 1 39552 5 37 - 3 2 9552 5 37 - 1.734000+7 4.771950+5 1.800000+7 4.808550+5 2.000000+7 5.029450+59552 5 37 - 1.734000+7 0.000000+0 0 9 1 29552 5 37 - 2 2 9552 5 37 - 1.734000+7 2.500000-1 2.000000+7 2.500000-1 9552 5 37 - 0.000000+0 0.000000+0 0 0 1 39552 5 37 - 3 2 9552 5 37 - 1.734000+7 4.150670+5 1.800000+7 4.150670+5 2.000000+7 4.150670+59552 5 37 - 0.000000+0 0.000000+0 0 0 0 09552 5 0 - 9.524400+4 2.419680+2 0 0 1 09552 5 91 - 4.367980+5 0.000000+0 0 9 1 29552 5 91 - 2 2 9552 5 91 - 4.367980+5 1.000000+0 2.000000+7 1.000000+0 9552 5 91 - 0.000000+0 0.000000+0 0 0 1 119552 5 91 - 11 2 9552 5 91 - 4.367980+5 3.815660+5 2.000000+6 3.815660+5 4.000000+6 3.823280+59552 5 91 - 6.000000+6 4.643510+5 8.000000+6 5.335170+5 1.000000+7 5.944610+59552 5 91 - 1.200000+7 6.495640+5 1.400000+7 7.002390+5 1.600000+7 7.474080+59552 5 91 - 1.800000+7 7.917120+5 2.000000+7 8.336170+5 9552 5 91 - 0.000000+0 0.000000+0 0 0 0 09552 5 0 - 0.000000+0 0.000000+0 0 0 0 09552 0 0 - 0.000000+0 0.000000+0 0 0 0 0 0 0 0 - 0.000000+0 0.000000+0 0 0 0 0 -1 0 0 diff --git a/tests/n-095_Am_244.endf.xz b/tests/n-095_Am_244.endf.xz new file mode 100644 index 0000000..ce1bb0c Binary files /dev/null and b/tests/n-095_Am_244.endf.xz differ diff --git a/tests/photoat-001_H_000.endf b/tests/photoat-001_H_000.endf deleted file mode 100644 index 5ff4656..0000000 --- a/tests/photoat-001_H_000.endf +++ /dev/null @@ -1,2831 +0,0 @@ - $Rev:: 1494 $ $Date:: 2018-02-01#$ 1 0 0 - 1000.00000 .999242000 -1 0 0 3 100 1451 - 0.0 0.0 0 0 0 6 100 1451 - 0.0 1.0000E+11 0 0 3 8 100 1451 - 0.0 0.0 0 0 147 13 100 1451 - 1-H - 0 NDS,IAEA Eval-Dec17 D.E.Cullen, et al. 100 1451 - NDS-IAEA-225 DIST-FEB18 100 1451 -----ENDF/B-VIII.0 MATERIAL 100 100 1451 ------ PHOTO-ATOMIC INTERACTION DATA 100 1451 ------- ENDF/B-6 100 1451 - ================================================================= 100 1451 - The Livermore Evaluated Photon Data Library (EPDL97) in the 100 1451 - ENDF-6 Format. 100 1451 - ================================================================= 100 1451 - Contents 100 1451 - ================================================================= 100 1451 - MF/MT Description 100 1451 - ================================================================= 100 1451 - 23/501 Total cross sections 100 1451 - 23/502 Coherent scattering cross sections 100 1451 - 23/504 Incoherent scattering cross sections 100 1451 - 23/515 Pair production cross sections, Electron field 100 1451 - 23/516 Pair production cross sections, Total 100 1451 - 23/517 Pair production cross sections, Nuclear field 100 1451 - 23/522 Total photoionization cross section 100 1451 - 23/534 K (1S1/2) Photoionization subshell cross section 100 1451 - ================================================================= 100 1451 - 27/502 Coherent scattering form factors 100 1451 - 27/504 Incoherent scattering functions 100 1451 - 27/505 Imaginary anomalous scattering factor 100 1451 - 27/506 Real anomalous scattering factor 100 1451 - ================================================================= 100 1451 - Warning 100 1451 - ================================================================= 100 1451 - MF/MT combinations used to define photoionization subshell cross 100 1451 - sections (MF=23, MT=534-572) and coherent anomalous scattering 100 1451 - factors (MF=27, MT=505 AND 506) are newly defined MF/MT numbers 100 1451 - for ENDF/B-VI that did not exist in earlier versions of ENDF/B. 100 1451 - If you are not prepared to use this data you need merely delete 100 1451 - it and all of the remaining data will still be consistent and 100 1451 - equivalent to the types of data in earlier versions of ENDF/B. 100 1451 - However, this will limit the range of problems to which this 100 1451 - data can be applied (see: ref. 1 for details). 100 1451 - ================================================================= 100 1451 - Definition of new types of data 100 1451 - ================================================================= 100 1451 - 1) The total photoionization cross section is equal to the sum 100 1451 - of the photoionization subshell cross sections. 100 1451 - 100 1451 - For each subshell on the second line of a section the C1 and 100 1451 - C2 fields are defined as, 100 1451 - 100 1451 - EPE = The photoionization edge energy (similar to Q-value) 100 1451 - EFL = The fluorescence yield (eV/photoionization) 100 1451 - 100 1451 - 2) The angular distribution of coherently scattered photons is, 100 1451 - 100 1451 - S(E,MU) = 3*T/8*(1 + MU**2)*((FF(M)+F1(E))**2+(F2(E))**2) 100 1451 - 100 1451 - S(E,MU) = Angular distributions (barns per unit cosine) 100 1451 - T = The Thomson cross section 100 1451 - MU = The cosine of the scattering angle 100 1451 - FF(M) = The atomic form factor 100 1451 - M = Momentum transfer = SIN(THETA/2)/LAMBDA/4*PI 100 1451 - F1(E) = The real anomalous scattering factor 100 1451 - F2(E) = The imaginary anomalous scattering factor 100 1451 - 100 1451 - F1(E) and F2(E) are isotropic. 100 1451 - 100 1451 - When F1(E) = F2(E) = 0 this reduces to the result obtained 100 1451 - using only form factors (the older ENDF/B convention). 100 1451 - ================================================================= 100 1451 - Differences between EPDL97 and the data base presented here 100 1451 - ================================================================= 100 1451 - 1) Energy range - EPDL97 - 1 eV to 100 GeV 100 1451 - Here - 1 eV TO 100 GeV (previously 100 MeV) 100 1451 - 2) Type of Data - EPDL97 - Photon interaction including 100 1451 - photoexcitation 100 1451 - Here - Photon interaction - ENDF/B-VI has 100 1451 - no provision for photoexcitation 100 1451 - 3) Secondary E - EPDL97 - Average energy of each secondary 100 1451 - (photons, electrons, positrons) 100 1451 - HERE - No secondary energy data 100 1451 - 4) Interpolation- EPDL97 - Cross sections are Log X vs. Log Y 100 1451 - interpolable - the total cross 100 1451 - section is not included 100 1451 - - Form factors and scattering functions 100 1451 - are Log X vs. Log y, except first 100 1451 - interval. 100 1451 - - Anomalous scattering factors linearly 100 1451 - interpolable (they can be negative) 100 1451 - Here - Up through ENDF/B-V photon interaction 100 1451 - cross sections were Log X vs. Log Y. 100 1451 - - For the first two Mods. of ENDF/B-VI 100 1451 - in order to consistently define the 100 1451 - total cross sections at ALL energies 100 1451 - all cross sections were linearized. 100 1451 - This was NOT a good idea. 100 1451 - - Starting with Mod. 3, cross sections 100 1451 - are left in Log X vs. Log. Y form so 100 1451 - that they are IDENTICAL to what's in 100 1451 - EPDL97. 100 1451 - The total is defined ONLY at the 100 1451 - energies tabulated in any other cross 100 1451 - section. 100 1451 - WARNING - As a result the total cross section 100 1451 - MUST NOT be interpolated to define the 100 1451 - total between tabulated energies. The 100 1451 - ONLY consist way to define the total 100 1451 - between tabulated energies is to 100 1451 - interpolate all of the partials and 100 1451 - add them up. 100 1451 - ================================================================= 100 1451 - References 100 1451 - ================================================================= 100 1451 - 1) D.E. Cullen, M.H. Chen, J.H. Hubbell, S.T. Perkins, 100 1451 - E.F. Plechaty, J.A. Rathkopf and J.H. Scofield, Tables and 100 1451 - graphs of photon interaction cross sections from 10 eV to 100 100 1451 - GeV derived from the LLNL Evaluated Photon data library (EPDL), 100 1451 - UCRL-50400, Vol. 6, Rev. 4, Part A: Z = 1 to 50 and Part B: 100 1451 - Z = 51 to 100, Lawrence Livermore National Laboratory (1989) 100 1451 - 100 1451 - 2) D.E. Cullen, J.H. Hubbell and L.D. Kissel, EPDL97: the 100 1451 - Evaluated Photon Data Library, '97 Version, UCRL-50400, Vol. 6, 100 1451 - Rev. 5, Lawrence Livermore National Laboratory (1997) 100 1451 - 100 1451 - 3) D.E. Cullen "A Survey of Atomic Binding Energies for use 100 1451 - in EPICS2017" ,IAEA-NDS-224, (2017), Nuclear Data Section, 100 1451 - IAEA, Vienna, Austria 100 1451 - 100 1451 - 4) D.E. Cullen "A Survey of Photon Cross Section Data for use 100 1451 - in EPICS2017" ,IAEA-NDS-225, (2017), Nuclear Data Section, 100 1451 - IAEA, Vienna, Austria 100 1451 - 100 1451 - These are the primary references to the contents of this library 100 1451 - and they contain a complete list of references to the sources 100 1451 - of data used in this library, methods of evaluation, accuracy 100 1451 - of the data, etc. 100 1451 - ================================================================= 100 1451 - History 100 1451 - ================================================================= 100 1451 - 1) Oct. 1989 - Initial Release 100 1451 - 2) Aug. 1990 - Updated Photoelectic (total+shellS) 100 1451 - 3) July 1997 - Complete re-evaluation 100 1451 - 4) Sept.2014 - Updated based on recently published data. 100 1451 - - Insured Standard C, C++, FORTRAN format 100 1451 - 5) Nov. 2017 - New Binding Energies (see, ref. 3) 100 1451 - - New Photoelectric and Coherent Cross Sections 100 1451 - - New Anomalous Scattering Factors (see, ref. 4) 100 1451 - - ALL Cross Sections Lin-Lin Interpolable 100 1451 - ================================================================= 100 1451 - **************** Program DICTIN (VERSION 2017-1) **************** 100 1451 - 1 451 164 3 100 1451 - 23 501 677 3 100 1451 - 23 502 124 3 100 1451 - 23 504 135 3 100 1451 - 23 515 76 3 100 1451 - 23 516 159 3 100 1451 - 23 517 106 3 100 1451 - 23 522 305 3 100 1451 - 23 534 305 3 100 1451 - 27 502 421 3 100 1451 - 27 504 136 3 100 1451 - 27 505 102 3 100 1451 - 27 506 102 3 100 1451 - 100 1 0 - 100 0 0 - 1000.00000 .999242000 0 0 0 0 10023501 - 0.0 0.0 0 0 1 2021 10023501 - 2021 2 10023501 - 1.00000000 4.62084E-6 1.05924839 8.74720E-6 1.10597719 1.20021E-5 10023501 - 1.14237171 1.45375E-5 1.19922131 1.84983E-5 1.25890000 2.26569E-5 10023501 - 1.33350268 2.78564E-5 1.39234189 3.19580E-5 1.43816887 3.51530E-5 10023501 - 1.50975292 4.01446E-5 1.58490000 4.53857E-5 1.67881736 5.19373E-5 10023501 - 1.75288991 5.71059E-5 1.81058131 6.11321E-5 1.90069801 6.74225E-5 10023501 - 1.99530000 7.40277E-5 2.00000000 7.43559E-5 2.11352184 9.50295E-5 10023501 - 2.20676274 1.12012E-4 2.25000000 1.19887E-4 2.27938308 1.27603E-4 10023501 - 2.39281892 1.57392E-4 2.51190000 1.88666E-4 2.53125000 1.93749E-4 10023501 - 2.66074055 2.42966E-4 2.77813064 2.87586E-4 2.84765625 3.14015E-4 10023501 - 2.86955971 3.26120E-4 3.01237592 4.05057E-4 3.16230000 4.87927E-4 10023501 - 3.20361328 5.10764E-4 3.34967810 6.28877E-4 3.49746259 7.48385E-4 10023501 - 3.60406494 8.34593E-4 3.61256426 8.44727E-4 3.79235805 .001059107 10023501 - 3.98110000 .001284163 4.05457306 .001371775 4.21699334 .001660273 10023501 - 4.40304158 .001990748 4.54794485 .002248142 4.56139469 .002272034 10023501 - 4.77428998 .002843021 5.01190000 .003480305 5.13156903 .003801270 10023501 - 5.30887201 .004532360 5.54309280 .005498156 5.72551517 .006250371 10023501 - 5.77301516 .006446239 6.01046675 .007989041 6.30960000 .009932626 10023501 - 6.49464205 .011134929 6.68346399 .013135705 6.97832917 .016260146 10023501 - 7.20798427 .018693621 7.30647231 .019737227 7.56671537 .024164277 10023501 - 7.94330000 .030570464 8.02516327 .031963070 8.41396545 .042011891 10023501 - 8.65401786 .048216205 8.78517756 .053147215 9.07429530 .064016749 10023501 - 9.20426563 .068903062 9.52590957 .085900998 9.68573242 .094347179 10023501 - 10.0000000 .117049880 10.1070159 .124780724 10.4756389 .160336545 10023501 - 10.5924839 .177359822 11.0597719 .245439572 11.1207292 .254320519 10023501 - 11.4237171 .327119714 11.6045469 .370567880 11.9674102 .505279608 10023501 - 11.9922131 .518717679 12.2395576 .652727563 12.4436682 .805998764 10023501 - 12.5890000 .973045448 12.7498341 1.15791074 12.9029171 1.43260833 10023501 - 13.0560000 1.83561186 13.0565313 1.83734550 13.0607688 1.85127613 10023501 - 13.0670633 1.87232377 13.0732843 1.89355194 13.0794326 1.91496265 10023501 - 13.0855092 1.93655813 13.0915149 1.95834080 13.0974505 1.98031315 10023501 - 13.1033167 2.00247782 13.1091145 2.02483755 13.1148447 2.04739523 10023501 - 13.1205079 2.07015388 13.1261050 2.09311668 13.1316368 2.11628692 10023501 - 13.1371040 2.13966824 13.1443085 2.17123930 13.1514009 2.20320232 10023501 - 13.1583829 2.23556669 13.1652562 2.26834239 13.1720225 2.30153993 10023501 - 13.1786836 2.33517028 13.1852409 2.36924488 13.1916962 2.40377561 10023501 - 13.1980510 2.43877473 13.2043070 2.47425495 13.2104655 2.51022951 10023501 - 13.2165282 2.54671581 13.2254458 2.60240553 13.2341560 2.65931202 10023501 - 13.2426637 2.71747397 13.2509735 2.77693228 13.2590900 2.83772545 10023501 - 13.2670179 2.89987872 13.2722004 2.94216233 13.2823641 3.02878151 10023501 - 13.2922127 3.11801790 13.3017559 3.20986201 13.3110032 3.30431222 10023501 - 13.3199638 3.40135040 13.3286465 3.50104680 13.3350268 3.57924551 10023501 - 13.3411685 3.65451988 13.3531127 3.81313063 13.3645056 3.97621145 10023501 - 13.3754294 4.14424060 13.3892458 4.37226270 13.4022121 4.60399407 10023501 - 13.4143807 4.83785521 13.4312444 5.18258039 13.4467356 5.52477546 10023501 - 13.4652950 5.95848118 13.4890065 6.53629150 13.5150206 7.18402602 10023501 - 13.5442323 7.88747207 13.5990191 8.93266638 13.6000000 8.94312543 10023501 - 13.6000000 6318367.19 13.6100000 6305843.05 13.6538059 6253640.15 10023501 - 13.7097724 6186945.02 13.7568469 6130846.05 13.8307204 6042810.35 10023501 - 13.9012361 5958776.12 13.9234189 5932340.77 13.9717518 5874742.21 10023501 - 14.0535435 5785751.06 14.2069030 5618892.94 14.2961635 5521775.90 10023501 - 14.3410925 5476634.47 14.3816887 5435846.35 14.4585084 5358663.48 10023501 - 14.5861968 5230371.51 14.6639861 5157475.26 14.8180944 5013060.65 10023501 - 14.8447987 4988036.10 14.9336756 4909675.96 15.0748336 4785221.14 10023501 - 15.0975292 4766714.27 15.1070475 4758952.67 15.1937334 4688265.62 10023501 - 15.2804193 4617578.58 15.4860050 4449936.12 15.5855954 4375507.17 10023501 - 15.6102141 4357108.37 15.7338872 4264681.20 15.8017267 4213981.31 10023501 - 15.8490000 4180887.50 15.9503150 4109961.64 16.0427351 4045262.68 10023501 - 16.1126359 3999633.14 16.3561173 3840694.41 16.4111572 3804765.70 10023501 - 16.4778579 3764733.01 16.7880400 3578566.74 16.7881736 3578491.63 10023501 - 17.1594652 3369754.99 17.3244961 3283844.34 17.4911970 3197064.35 10023501 - 17.5288991 3178714.94 17.6869448 3101794.97 17.7867189 3053235.48 10023501 - 18.0493935 2932703.18 18.1058131 2908694.85 18.5184426 2733107.92 10023501 - 18.8105584 2618841.45 18.8782114 2592377.74 19.0069801 2545089.39 10023501 - 19.1526175 2491606.26 19.5717233 2347746.00 19.9530000 2227067.99 10023501 - 20.0000000 2212192.01 20.4303711 2084480.67 20.8145359 1978796.09 10023501 - 21.1352184 1896232.21 21.1566011 1890726.96 21.3085588 1853807.40 10023501 - 21.4605165 1816887.86 22.0029110 1694540.34 22.0676274 1681103.91 10023501 - 22.4186843 1608217.39 22.7356621 1546373.46 22.7938308 1535754.59 10023501 - 23.2195517 1458037.99 23.7137400 1374748.65 23.9281892 1340929.57 10023501 - 24.2312071 1293143.01 24.6932454 1225721.78 25.1047501 1169618.10 10023501 - 25.1190000 1167787.41 25.2875942 1146128.06 25.4704383 1122638.01 10023501 - 26.1232567 1044917.86 26.6074055 991975.347 26.6238276 990179.562 10023501 - 27.0055404 951015.978 27.2969679 923085.861 27.5883954 895155.746 10023501 - 27.7813064 878120.974 28.1838300 842576.615 28.6955971 800490.628 10023501 - 28.8403162 788589.421 29.4272734 744195.945 29.6889627 725801.271 10023501 - 29.9506519 707406.605 30.1237592 695993.806 30.4162383 676710.938 10023501 - 30.8295597 650946.839 31.5664328 608197.454 31.6230000 605168.585 10023501 - 32.1306229 577988.112 32.9958713 535464.124 33.4967810 513255.402 10023501 - 33.8844200 496068.737 34.7236242 461909.746 34.9746259 452571.059 10023501 - 35.0992922 447932.766 35.4749601 433955.791 36.1256426 411577.305 10023501 - 36.1457029 410887.384 36.7429980 391710.726 37.2737222 375666.777 10023501 - 37.7473621 362410.828 37.9235805 357478.934 38.2210020 349154.880 10023501 - 38.9472275 330506.205 39.5009378 317176.312 39.8110000 310209.814 10023501 - 40.3462982 298182.698 40.7780241 289254.596 41.2097500 280326.494 10023501 - 42.1699334 261930.199 42.2303791 260772.111 43.1441438 244784.279 10023501 - 43.9598923 231601.094 44.0304158 230537.882 44.3231035 226125.325 10023501 - 44.6863147 220649.556 45.3317745 211492.615 45.4794485 209554.543 10023501 - 46.4838438 196372.866 47.3670696 185746.734 47.7428998 181510.496 10023501 - 48.0404849 178156.212 49.0686011 167348.051 50.1187200 157195.589 10023501 - 50.1190000 157193.087 51.3599953 146102.866 51.9156495 141571.823 10023501 - 52.4713037 137040.781 53.0887201 132393.815 53.4634061 129573.752 10023501 - 54.3468712 123374.627 55.1318707 118194.175 55.4309280 116369.717 10023501 - 55.8324364 113920.235 56.5330020 109646.298 57.2551517 105610.744 10023501 - 57.6071695 103643.581 58.4261681 99358.2060 59.6765494 93260.0733 10023501 - 60.1046675 91341.3447 60.3151197 90398.1455 60.9536900 87536.2184 10023501 - 61.7488440 84168.7035 63.0960000 78875.0433 63.2678223 78199.8663 10023501 - 64.6275487 73325.4060 65.2344043 71317.7825 65.8412598 69310.1598 10023501 - 66.8346399 66246.8161 66.9219402 65977.6031 67.8820762 63193.3273 10023501 - 69.5955793 58600.5845 69.7832917 58139.8048 70.2523057 56988.5107 10023501 - 70.9090320 55376.4376 71.9103635 53075.2840 72.0798427 52712.3172 10023501 - 73.4389356 49801.6023 75.0000000 46729.8438 75.6671537 45490.6102 10023501 - 75.9770513 44914.9774 77.8434595 41699.9304 79.4330000 39203.5540 10023501 - 79.5141392 39076.1248 81.0053710 36916.0861 82.3331226 35124.2300 10023501 - 83.5127457 33627.8499 84.1396545 32893.2133 85.6178996 31160.9469 10023501 - 87.2315168 29430.2763 87.8517756 28807.7556 88.4616560 28195.6512 10023501 - 90.3394675 26440.1469 90.7429530 26093.7800 92.2571400 24793.9456 10023501 - 93.5944287 23714.1856 94.8657365 22744.6572 95.2590957 22460.3050 10023501 - 95.4695014 22308.2065 96.0732662 21871.7560 98.3789666 20324.3513 10023501 - 100.000000 19331.1428 100.441802 19060.4504 102.282234 18019.1838 10023501 - 103.101244 17587.0158 103.920254 17154.8480 105.375027 16432.6347 10023501 - 105.924839 16180.1940 107.970053 15241.1544 109.958175 14404.5909 10023501 - 110.597719 14152.5236 111.473255 13807.4433 113.785105 12957.8180 10023501 - 114.237171 12805.0713 116.144900 12160.4763 117.913256 11599.0250 10023501 - 119.595534 11096.2313 119.922131 11003.9966 120.394998 10870.4536 10023501 - 121.194462 10644.6760 122.712865 10238.0472 125.611333 9517.02115 10023501 - 125.890000 9453.69153 128.203597 8927.90543 129.359636 8685.16465 10023501 - 130.515674 8442.42427 132.572921 8039.33567 133.350268 7895.97454 10023501 - 134.399596 7702.45371 137.657046 7146.52481 138.904444 6951.29939 10023501 - 139.234189 6899.69233 140.151841 6756.07432 142.052565 6477.30205 10023501 - 143.816887 6235.89270 144.952091 6080.56456 147.910800 5708.12997 10023501 - 150.162813 5441.92735 150.975292 5351.56323 152.305205 5203.64996 10023501 - 154.341450 4989.75016 156.275147 4797.21240 158.490000 4592.47705 10023501 - 159.966365 4456.00564 161.616998 4316.71311 163.267631 4177.42073 10023501 - 166.212078 3947.98632 167.881736 3826.65031 168.831997 3757.59372 10023501 - 171.158279 3598.54868 173.232473 3467.39890 175.288991 3337.36692 10023501 - 175.306666 3336.24935 178.483807 3152.15221 180.904392 3020.77847 10023501 - 181.058131 3012.99845 184.596961 2833.91459 186.480931 2746.26355 10023501 - 188.364900 2658.61268 190.069801 2584.31787 191.370496 2527.63723 10023501 - 194.231783 2410.71545 196.953081 2306.01935 199.530000 2212.32531 10023501 - 199.538915 2212.00117 200.766437 2169.67280 201.993959 2127.34450 10023501 - 206.678872 1977.25099 210.867220 1854.63485 211.352184 1841.51419 10023501 - 214.601591 1753.60175 216.262484 1711.66322 217.923377 1669.72478 10023501 - 220.676274 1604.28616 220.872091 1599.63143 226.128670 1483.97661 10023501 - 227.938308 1447.45558 230.153042 1402.75914 233.218252 1344.77791 10023501 - 237.892780 1262.27083 239.281892 1239.70973 242.661000 1184.82836 10023501 - 246.710418 1123.34513 250.568097 1068.60700 251.190000 1060.32522 10023501 - 252.403767 1044.16168 254.239437 1019.71641 257.730158 975.916235 10023501 - 261.046225 936.564886 266.074055 881.345336 267.379279 867.010352 10023501 - 270.212944 838.707105 273.046608 810.403936 277.813064 766.589899 10023501 - 278.103974 763.915807 282.605951 725.433380 286.604924 693.356250 10023501 - 286.955971 690.692749 290.150417 666.455517 296.460892 621.868667 10023501 - 301.237592 590.699762 301.283655 590.399192 308.665301 546.158722 10023501 - 312.446551 525.697880 316.227800 505.237100 316.230000 505.226099 10023501 - 321.736287 477.692504 326.987609 453.236640 331.988540 431.449182 10023501 - 334.967810 419.255994 336.746353 411.976999 341.268711 394.522015 10023501 - 345.563564 378.831310 349.746259 364.672370 353.762631 351.076467 10023501 - 361.096238 328.467184 367.637747 309.884049 373.145392 295.318637 10023501 - 373.458705 294.490057 378.627599 281.650310 387.845901 260.516047 10023501 - 394.906616 245.715257 398.110000 239.436417 400.286379 235.170581 10023501 - 408.493749 220.198212 416.869400 206.181767 421.699334 198.669153 10023501 - 424.436299 194.412011 431.654964 183.990782 438.533925 174.730533 10023501 - 440.304158 172.498677 445.082480 166.474335 448.196508 162.782248 10023501 - 451.310535 159.090169 457.228463 152.466454 462.846977 146.508453 10023501 - 469.761686 139.705489 473.568446 135.960267 483.153264 127.358369 10023501 - 491.698981 120.281537 499.300383 114.414337 501.190000 113.042892 10023501 - 506.047947 109.517113 518.076340 101.448832 527.284893 95.7922138 10023501 - 530.887201 93.7207340 534.298562 91.7590716 544.994375 86.0276632 10023501 - 554.309280 81.4420089 555.904300 80.6568009 566.402331 75.8606843 10023501 - 576.424216 71.6257518 585.980723 67.8723070 591.394102 65.8870388 10023501 - 595.083792 64.5339281 603.746310 61.5552504 611.981909 58.8890144 10023501 - 619.804782 56.4955328 627.229521 54.3410678 630.960000 53.3353219 10023501 - 634.310495 52.4320317 641.391469 50.5231455 654.045228 47.4060240 10023501 - 665.321884 44.8388342 668.346399 44.1962046 675.348334 42.7085127 10023501 - 679.796841 41.8187302 684.245348 40.9289851 697.832917 38.4135613 10023501 - 700.098084 37.9942307 712.228201 35.9345016 721.463515 34.4646589 10023501 - 728.502511 33.4193206 735.541506 32.3739874 744.519725 31.1471091 10023501 - 749.894200 30.4127221 765.156005 28.4832256 779.745923 26.7882054 10023501 - 793.676533 25.2930448 794.330000 25.2279311 806.962428 23.9692196 10023501 - 819.619870 22.7928807 831.666474 21.7440896 837.393698 21.2750831 10023501 - 841.396545 20.9470120 843.120921 20.8056924 854.002703 19.9635952 10023501 - 864.331894 19.2061033 878.517756 18.2405940 884.037043 17.8649772 10023501 - 901.647218 16.7713027 917.343647 15.8717242 931.302014 15.1258827 10023501 - 937.292781 14.8248086 943.689702 14.5033712 965.765962 13.4778113 10023501 - 982.661416 12.7590203 995.526699 12.2465212 1000.00000 12.0804222 10023501 - 1015.14113 11.5181940 1035.14200 10.8356722 1057.73027 10.1252079 10023501 - 1059.24839 10.0816113 1079.35424 9.50432933 1100.02803 8.95927628 10023501 - 1105.97719 8.81448412 1109.89862 8.71906694 1119.76920 8.47902169 10023501 - 1138.59818 8.05421198 1156.53780 7.67695740 1173.61281 7.34079780 10023501 - 1179.96385 7.22325874 1189.84952 7.04037814 1205.27538 6.77093409 10023501 - 1219.91871 6.52868292 1247.85616 6.10007029 1258.90000 5.94559895 10023501 - 1272.82577 5.75071591 1295.08369 5.46335803 1314.87843 5.22524844 10023501 - 1332.44686 5.02659757 1333.50268 5.01556829 1363.75832 4.69971651 10023501 - 1387.72384 4.47065214 1405.97396 4.30741577 1433.80012 4.07557273 10023501 - 1453.77729 3.92272582 1462.17700 3.85852961 1496.23550 3.61966745 10023501 - 1528.88549 3.41197749 1560.14163 3.23053924 1575.08299 3.15093626 10023501 - 1584.90000 3.09866078 1590.02435 3.07130861 1618.55903 2.93074623 10023501 - 1645.77519 2.80639479 1671.70582 2.69598372 1684.04628 2.64679954 10023501 - 1696.38673 2.59763558 1719.85591 2.50975429 1742.15307 2.43097414 10023501 - 1763.31913 2.36015404 1778.30003 2.31367754 1803.70104 2.23506273 10023501 - 1839.79310 2.13345466 1871.96560 2.04996233 1900.57771 1.98081507 10023501 - 1925.97182 1.92315337 1971.23066 1.82836723 1995.30000 1.78226358 10023501 - 2005.87139 1.76177376 2032.25085 1.71391634 2052.36138 1.67992105 10023501 - 2072.47191 1.64604700 2113.48900 1.58259776 2140.27089 1.54373906 10023501 - 2166.53945 1.50763109 2192.29452 1.47403465 2238.74833 1.41817972 10023501 - 2243.06945 1.41299628 2291.73847 1.36003557 2338.32431 1.31376728 10023501 - 2360.59127 1.29346699 2382.85822 1.27335116 2425.37876 1.23792840 10023501 - 2465.93061 1.20661873 2504.56353 1.17884388 2511.90000 1.17391073 10023501 - 2522.94747 1.16612833 2541.33141 1.15334588 2576.29136 1.13046821 10023501 - 2609.50297 1.10993403 2641.02758 1.09145166 2701.16633 1.05869621 10023501 - 2754.91002 1.03245290 2802.81219 1.01086405 2845.40936 .992965282 10023501 - 2883.21261 .978024579 2950.58081 .954097916 3002.13798 .937363294 10023501 - 3041.39620 .925453296 3071.32220 .917007790 3101.24819 .908869350 10023501 - 3162.27800 .893707049 3162.30000 .893701997 3215.04863 .879823524 10023501 - 3267.00980 .867032099 3292.57884 .861128461 3318.14788 .855506577 10023501 - 3368.45110 .845141751 3417.90945 .835570767 3466.51463 .826718143 10023501 - 3514.25993 .818516788 3537.70007 .814711876 3548.15904 .813124017 10023501 - 3561.14021 .811113162 3607.15177 .804382927 3652.29231 .798136810 10023501 - 3696.56083 .792332135 3739.95757 .786930624 3782.72572 .781992518 10023501 - 3825.49386 .777476117 3907.46001 .769688133 3981.10000 .763356770 10023501 - 3985.89757 .762812718 4060.86219 .754893326 4132.42150 .748484852 10023501 - 4200.65317 .742771075 4265.64319 .737658247 4327.48422 .733067792 10023501 - 4356.87920 .731000646 4386.27418 .729188574 4442.11493 .725938917 10023501 - 4466.86413 .724574342 4495.11110 .722927749 4596.18898 .717438008 10023501 - 4686.49485 .712938780 4766.96680 .709832981 4838.51244 .707280835 10023501 - 4901.99519 .705168286 5011.90000 .701824966 5015.10075 .701663969 10023501 - 5101.63928 .698129971 5167.52174 .695573769 5267.94410 .691881768 10023501 - 5370.31800 .688349585 5454.04547 .686084358 5536.40107 .683983754 10023501 - 5617.36876 .682032191 5623.44061 .681893583 5696.93522 .680046055 10023501 - 5736.01252 .679109067 5775.08981 .678365258 5851.82437 .676985881 10023501 - 5927.13312 .675704957 6001.01257 .674513743 6073.46133 .673404405 10023501 - 6144.48005 .672369919 6284.45063 .671099690 6309.60000 .670901290 10023501 - 6418.56750 .668636795 6546.90037 .666099799 6608.22110 .664940870 10023501 - 6669.54182 .664022191 6786.60389 .662356291 6898.21493 .660840672 10023501 - 7004.51675 .659457536 7105.66197 .658191828 7201.81168 .657343229 10023501 - 7293.13331 .656572551 7379.79875 .655870876 7545.08186 .654606416 10023501 - 7618.91013 .654078759 7692.73840 .653745171 7824.30633 .653203821 10023501 - 7941.27283 .652760872 7943.30000 .652753739 8045.05198 .651547456 10023501 - 8137.49576 .650481130 8229.93954 .649621525 8371.38831 .648352793 10023501 - 8479.06802 .647411551 8643.19013 .646014370 8726.83957 .645323469 10023501 - 8810.48900 .644793543 8989.79966 .643698350 9166.98617 .642655513 10023501 - 9341.96523 .641660211 9514.66063 .640988466 9685.00307 .640352618 10023501 - 9852.92999 .639749389 10000.0000 .639239636 10018.3853 .639158396 10023501 - 10181.3193 .638680294 10341.6881 .638226128 10499.4538 .637793922 10023501 - 10654.5841 .637381929 10730.8180 .637185263 10807.0519 .637077335 10023501 - 10956.8355 .636875634 11103.9177 .636686835 11248.2861 .636509822 10023501 - 11389.9327 .636343597 11528.8537 .636187268 11665.0489 .636170079 10023501 - 11933.5225 .636152254 12190.8256 .636153243 12313.9546 .636161089 10023501 - 12437.0835 .636266444 12589.0000 .636404233 12672.4663 .636087717 10023501 - 12897.1819 .635245518 13111.4705 .634450625 13213.5345 .634075438 10023501 - 13315.5985 .633765401 13509.8539 .633181003 13694.5412 .632630143 10023501 - 13869.9780 .632110857 14036.4906 .631621335 14354.1085 .630861498 10023501 - 14637.9142 .630190913 14890.8435 .629599258 15003.2914 .629338372 10023501 - 15115.7392 .629129360 15315.3074 .628761541 15492.0898 .628438002 10023501 - 15806.3831 .627867687 15849.0000 .627791042 16046.2805 .627177338 10023501 - 16412.9705 .626183734 16788.0400 .625173966 17154.3788 .624193240 10023501 - 17516.8910 .623346377 17875.3785 .622513197 18229.6580 .621693543 10023501 - 18404.6094 .621290421 18579.5608 .620936160 18924.9324 .620239698 10023501 - 19265.6321 .619555198 19601.5330 .618882579 19767.0269 .618552178 10023501 - 19932.5207 .618259689 19953.0000 .618223605 20258.4939 .617493692 10023501 - 20579.3632 .616728598 20895.0509 .615977241 21205.4907 .615239607 10023501 - 21510.6269 .614571376 21810.4140 .613915840 22104.8164 .613272954 10023501 - 22393.8078 .612642671 22677.3707 .612024930 22955.4958 .611460850 10023501 - 23228.1819 .610908369 23495.4352 .610367410 24022.0199 .609302893 10023501 - 24274.2134 .608793843 24526.4068 .608315204 25008.8836 .607400770 10023501 - 25119.0000 .607192314 25469.8219 .606430328 25909.6644 .605475843 10023501 - 26328.9127 .604609283 26728.1171 .603784741 27107.8666 .603000872 10023501 - 27468.7806 .602256292 27811.5003 .601549592 28136.6825 .600907188 10023501 - 28756.6819 .599683089 29310.3781 .598590619 29803.6009 .597617985 10023501 - 30241.9744 .596784914 30630.8373 .596046203 31323.4175 .594731109 10023501 - 31623.0000 .594162509 31853.1101 .593707972 32054.6799 .593309932 10023501 - 32256.2496 .592923693 32870.5454 .591746974 33496.5400 .590548261 10023501 - 34129.1091 .589337347 34441.2045 .588740081 34753.2999 .588157174 10023501 - 35368.8691 .587007765 35975.5973 .585875129 36573.2886 .584759599 10023501 - 36867.5292 .584210533 37161.7698 .583672148 37740.8892 .582612694 10023501 - 38310.5159 .581570770 38870.5391 .580546560 39420.8671 .579540211 10023501 - 39811.0000 .578838629 39961.4263 .578574262 40492.1606 .577641628 10023501 - 41013.0304 .576726423 41524.0115 .575828677 42025.0947 .574948397 10023501 - 42270.6896 .574516981 42516.2845 .574091699 43484.3617 .572415523 10023501 - 44411.9438 .570809666 45299.5144 .569273246 46147.7149 .567822118 10023501 - 46957.3213 .566437131 47729.2223 .565116740 48464.3996 .563859245 10023501 - 49163.9095 .562673831 49828.8668 .561547024 50119.0000 .561055399 10023501 - 50460.4301 .560475420 51059.7889 .559457341 51631.3150 .558486587 10023501 - 52202.8410 .557523295 53223.9831 .555802282 54133.8546 .554268871 10023501 - 54942.7425 .552905697 55301.5854 .552300977 55660.4282 .551700250 10023501 - 56234.4061 .550739407 56939.0095 .549702476 57917.1833 .548263005 10023501 - 58661.8257 .547167227 59229.3022 .546332182 59796.7787 .545502244 10023501 - 60953.6900 .543810308 61770.5193 .542615760 62572.2597 .541443301 10023501 - 63096.0000 .540677401 63358.8677 .540278912 64130.3229 .539115101 10023501 - 64886.6264 .537974163 66377.4395 .535725209 67806.1702 .533569956 10023501 - 69173.5222 .531515351 70480.4466 .529551577 70794.8061 .529079230 10023501 - 71728.1050 .527852479 72322.9707 .527070585 72917.8363 .526291600 10023501 - 74051.1254 .524807560 75129.5754 .523395347 76154.8824 .522052737 10023501 - 77128.8121 .520777414 77590.9962 .520172207 78053.1802 .519568947 10023501 - 79433.0000 .517767972 79816.3343 .517260611 81391.7350 .515175515 10023501 - 82795.6973 .513317340 83419.8568 .512491257 84044.0162 .511667342 10023501 - 85151.7246 .510205133 87125.4605 .507599757 88635.7278 .505606185 10023501 - 89125.1929 .504960088 89785.5840 .504200946 91538.3976 .502190801 10023501 - 93325.4300 .500141427 94746.3515 .498511919 96098.1075 .496961737 10023501 - 97382.8889 .495491106 98602.9672 .494094543 99760.6699 .492769381 10023501 - 100000.000 .492495434 101968.124 .490260121 102953.902 .489140520 10023501 - 103939.679 .488022603 105696.034 .486030820 107257.174 .484260424 10023501 - 108642.074 .482689895 109875.445 .481291210 111108.816 .479894247 10023501 - 112200.714 .478657526 112995.558 .477876892 114431.610 .476466517 10023501 - 116619.981 .474317278 117735.091 .473222111 118850.200 .472128240 10023501 - 120399.566 .470608385 121870.436 .469165534 124676.920 .466412514 10023501 - 125890.000 .465222547 125931.240 .465183158 127185.559 .463986319 10023501 - 129421.990 .461852377 131411.103 .459954423 133176.639 .458269801 10023501 - 134740.930 .456777202 137522.781 .454125020 139646.795 .452100014 10023501 - 141252.633 .450569031 142894.483 .449216984 144556.092 .447848666 10023501 - 146217.700 .446481438 149623.555 .443678986 152668.693 .441173346 10023501 - 155383.984 .438939118 157799.450 .436952864 158490.000 .436385021 10023501 - 159943.765 .435245067 161843.930 .433755073 165223.697 .431104867 10023501 - 166514.229 .430092912 167804.761 .429081507 171752.152 .425987892 10023501 - 175792.400 .422821506 177830.003 .421224616 179112.166 .420359779 10023501 - 182068.349 .418366838 184695.005 .416596053 187024.396 .415025672 10023501 - 191171.743 .412229700 192757.121 .411160903 194342.498 .410092541 10023501 - 196755.028 .408466773 199530.000 .406596762 200430.092 .406028185 10023501 - 204173.800 .403663329 206101.673 .402445515 208029.545 .401228131 10023501 - 211463.005 .399060023 214513.737 .397133594 217219.209 .395425185 10023501 - 222036.149 .392383460 223874.833 .391222743 225718.824 .390224240 10023501 - 228520.860 .388706965 232789.267 .386395665 237137.400 .384041194 10023501 - 239029.310 .383016744 240921.219 .381992585 244281.555 .380173514 10023501 - 250275.315 .376928876 251190.000 .376433725 254866.950 .374597782 10023501 - 258365.874 .372850729 263704.531 .370185710 269153.500 .367465624 10023501 - 273054.938 .365518055 276515.058 .363790789 281840.050 .361133092 10023501 - 282676.107 .360776253 287386.813 .358765664 294600.473 .355686783 10023501 - 298297.837 .354108702 301995.200 .352530919 306372.686 .350662906 10023501 - 314186.520 .347328494 316230.000 .346456475 320177.402 .344922353 10023501 - 322461.406 .344034696 324745.410 .343147183 331719.911 .340437048 10023501 - 338844.200 .337668708 343261.463 .335952259 347196.076 .334423356 10023501 - 351130.688 .332894654 354815.904 .331462849 357150.769 .330689248 10023501 - 366374.968 .327633034 375837.400 .324497887 384591.775 .321597702 10023501 - 391291.118 .319378317 398110.000 .317119330 401559.575 .316087871 10023501 - 406828.538 .314512396 412097.500 .312937094 421696.479 .310067214 10023501 - 429042.161 .307871019 440301.297 .304504789 446686.413 .302595947 10023501 - 451855.900 .301281567 462380.990 .298605487 470435.385 .296557598 10023501 - 476608.095 .294988142 482780.805 .293418852 495450.200 .290197907 10023501 - 501190.000 .288738676 505533.578 .287706588 513230.558 .285877691 10023501 - 524996.315 .283082003 530887.201 .281682256 537031.800 .280365102 10023501 - 547961.441 .278022229 548239.098 .277962710 556304.402 .276234026 10023501 - 569057.619 .273500553 578764.710 .271419975 582103.200 .270787501 10023501 - 593950.132 .268543108 602993.291 .266829889 616816.844 .264211027 10023501 - 629462.706 .261815278 630957.300 .261532149 630960.000 .261531637 10023501 - 643798.538 .259219998 663552.073 .255663281 668346.399 .254800040 10023501 - 683911.700 .252275935 690192.132 .251257486 697830.616 .250018871 10023501 - 719241.930 .246546931 728620.337 .245026180 741310.200 .243211040 10023501 - 756397.316 .241053000 756780.624 .240998172 779605.661 .237733446 10023501 - 794330.000 .235627385 803526.100 .234379705 817523.033 .232480673 10023501 - 829793.454 .230815885 838976.915 .229569961 841396.545 .229241689 10023501 - 860993.800 .226851325 891250.950 .223160726 909850.429 .220892065 10023501 - 917276.701 .219986276 922571.400 .219417807 954992.575 .215936884 10023501 - 988553.100 .212333635 1000000.00 .211104630 1011579.49 .209927957 10023501 - 1022000.00 .208869056 1025120.00 .208552011 1025233.25 .208540503 10023501 - 1025342.98 .208529353 1025449.29 .208518550 1025552.28 .208508084 10023501 - 1025652.07 .208497944 1025748.75 .208488120 1025842.42 .208478601 10023501 - 1025933.16 .208469380 1026021.08 .208460446 1026106.26 .208451790 10023501 - 1026188.78 .208443405 1026268.74 .208435280 1026346.19 .208427409 10023501 - 1026421.24 .208419783 1026493.94 .208412396 1026634.81 .208398081 10023501 - 1026766.89 .208384659 1026890.73 .208372075 1027006.85 .208360275 10023501 - 1027115.72 .208349212 1027217.79 .208338840 1027313.50 .208329114 10023501 - 1027403.23 .208319996 1027487.36 .208311447 1027566.24 .208303432 10023501 - 1027640.19 .208295917 1027778.86 .208281826 1027900.21 .208269495 10023501 - 1028006.41 .208258703 1028099.34 .208249260 1028180.66 .208240996 10023501 - 1028251.81 .208233766 1028376.35 .208221111 1028469.75 .208211620 10023501 - 1028609.87 .208197381 1028750.00 .208183142 1028995.66 .208158179 10023501 - 1029233.70 .208133990 1029464.35 .208110552 1029687.85 .208087840 10023501 - 1029904.41 .208065834 1030114.24 .208044512 1030317.56 .208023851 10023501 - 1030514.56 .208003833 1030705.44 .207984436 1030890.39 .207965642 10023501 - 1031069.59 .207947432 1031243.22 .207929789 1031411.45 .207912694 10023501 - 1031574.45 .207896130 1031732.39 .207880081 1032038.44 .207848981 10023501 - 1032325.45 .207819816 1032594.59 .207792467 1032846.97 .207766821 10023501 - 1033083.64 .207742771 1033305.56 .207720221 1033513.66 .207699074 10023501 - 1033708.79 .207679246 1033891.76 .207660653 1034063.32 .207643220 10023501 - 1034224.18 .207626874 1034525.86 .207596218 1034789.90 .207569387 10023501 - 1035020.99 .207545905 1035223.24 .207525353 1035400.24 .207507367 10023501 - 1035555.13 .207491627 1035826.25 .207464077 1036029.64 .207443409 10023501 - 1036334.78 .207412402 1036640.00 .207381387 1037180.62 .207326451 10023501 - 1037704.61 .207273205 1038212.48 .207221597 1038704.71 .207171579 10023501 - 1039181.79 .207123099 1039644.16 .207076115 1040092.29 .207030578 10023501 - 1040526.59 .206986446 1040947.49 .206943676 1041355.41 .206902224 10023501 - 1041750.73 .206862053 1042133.83 .206823124 1042505.10 .206785397 10023501 - 1042864.90 .206748836 1043213.57 .206713406 1043889.43 .206644728 10023501 - 1044523.46 .206580300 1045118.20 .206519865 1045676.09 .206463175 10023501 - 1046199.37 .206410002 1046690.19 .206360127 1047128.61 .206315577 10023501 - 1047150.54 .206313348 1047582.30 .206269475 1047987.24 .206228327 10023501 - 1048367.02 .206189736 1048723.18 .206153545 1049391.30 .206085654 10023501 - 1049976.25 .206026215 1050488.35 .205974178 1050936.65 .205928625 10023501 - 1051329.06 .205888750 1051672.55 .205853847 1052273.90 .205792742 10023501 - 1052725.14 .205746890 1053402.36 .205678076 1054080.00 .205609219 10023501 - 1055296.44 .205485611 1056476.20 .205365730 1057620.35 .205249468 10023501 - 1058729.92 .205136720 1059248.39 .205084036 1059805.94 .205033193 10023501 - 1060849.37 .204938043 1061861.17 .204845777 1062842.28 .204756311 10023501 - 1063793.59 .204669562 1064715.98 .204585450 1065610.31 .204503897 10023501 - 1066477.41 .204424828 1067318.08 .204348168 1068133.12 .204273846 10023501 - 1068923.28 .204201793 1070455.87 .204062040 1071894.67 .203930841 10023501 - 1073245.29 .203807682 1074513.05 .203692080 1075702.94 .203583579 10023501 - 1076819.65 .203481752 1077867.63 .203386192 1078851.03 .203296522 10023501 - 1079773.78 .203212382 1080639.58 .203133436 1081451.89 .203059367 10023501 - 1082976.62 .202920340 1083927.00 .202833683 1084312.52 .202798531 10023501 - 1085482.78 .202691826 1086507.80 .202598366 1087405.48 .202516516 10023501 - 1088191.56 .202444843 1089568.56 .202319292 1090602.46 .202225026 10023501 - 1092155.13 .202083462 1093710.00 .201941699 1096143.36 .201719823 10023501 - 1096478.20 .201689292 1098429.54 .201511373 1100577.18 .201315557 10023501 - 1102594.39 .201131634 1104488.89 .200958902 1106267.94 .200796698 10023501 - 1107938.40 .200644395 1109174.84 .200531665 1109506.75 .200501404 10023501 - 1112453.38 .200232755 1115038.10 .199997105 1117304.66 .199790466 10023501 - 1119291.67 .199609316 1121033.21 .199450547 1122559.27 .199311424 10023501 - 1125234.88 .199067508 1127245.77 .198884193 1128756.30 .198746494 10023501 - 1131025.87 .198539606 1133300.00 .198332307 1136833.45 .198010191 10023501 - 1139490.76 .197767951 1143488.37 .197403539 1147500.00 .197037862 10023501 - 1148153.53 .196978289 1150165.70 .196794868 1154175.87 .196429329 10023501 - 1154767.43 .196375408 1158200.00 .196100613 1162154.71 .195784014 10023501 - 1165129.60 .195545863 1169606.20 .195187507 1174100.00 .194827791 10023501 - 1178082.20 .194509020 1181077.71 .194269241 1185585.26 .193908441 10023501 - 1188502.00 .193674986 1190110.00 .193546282 1193839.94 .193247733 10023501 - 1199456.76 .192798174 1202264.44 .192573467 1205100.00 .192346532 10023501 - 1210661.39 .191901436 1214849.27 .191566281 1216185.89 .191459318 10023501 - 1221158.26 .191061403 1227500.00 .190553938 1233086.75 .190106872 10023501 - 1237293.49 .189770254 1243630.52 .189263200 1250000.00 .188753586 10023501 - 1257752.59 .188133284 1258900.00 .188041484 1258925.46 .188039563 10023501 - 1263598.56 .187686921 1272418.50 .187021405 1281300.00 .186351315 10023501 - 1288071.14 .185840421 1298295.00 .185069086 1303167.00 .184701563 10023501 - 1308600.00 .184291722 1314534.52 .183844033 1318256.74 .183563259 10023501 - 1323486.78 .183168753 1332500.00 .182488950 1333502.68 .182413322 10023501 - 1341220.07 .181892022 1342853.71 .181781672 1350671.75 .181253631 10023501 - 1362484.23 .180455898 1370487.32 .179915509 1374400.00 .179651316 10023501 - 1382183.64 .179125702 1393941.81 .178331790 1405800.00 .177531244 10023501 - 1415590.00 .176870272 1417429.89 .176746052 1426215.41 .176152968 10023501 - 1439495.88 .175256562 1445439.77 .174855429 1452900.00 .174351969 10023501 - 1453777.29 .174292758 1462177.00 .173796115 1464534.51 .173656724 10023501 - 1482161.19 .172614722 1500000.00 .171560434 1515386.64 .170650936 10023501 - 1522298.92 .170242419 1527030.10 .169962806 1544663.25 .168920874 10023501 - 1562500.00 .167867154 1569007.18 .167482647 1581789.84 .166727324 10023501 - 1584893.19 .166543982 1584900.00 .166543579 1596413.35 .165903451 10023501 - 1604976.49 .165427455 1618602.47 .164670035 1641100.00 .163419827 10023501 - 1660482.45 .162342536 1673676.67 .161609192 1678817.36 .161323572 10023501 - 1706900.00 .159929480 1717908.00 .159382885 1732493.60 .158658646 10023501 - 1737800.83 .158395209 1768071.95 .156892644 1771605.32 .156717258 10023501 - 1811600.00 .154732918 1830230.67 .153808185 1845936.41 .153127157 10023501 - 1846077.71 .153121032 1872115.14 .151992349 1905460.72 .150547370 10023501 - 1912080.98 .150260494 1927525.00 .149591550 1952900.00 .148492454 10023501 - 1983809.84 .147153328 1995300.00 .146655532 2000000.00 .146465002 10023501 - 2044000.00 .144681554 2071333.69 .143573560 2085810.00 .142986751 10023501 - 2087368.08 .142923593 2088878.59 .142862364 2089296.13 .142845439 10023501 - 2090342.93 .142803007 2091762.49 .142745464 2093138.61 .142689683 10023501 - 2094472.59 .142635610 2095765.69 .142583194 2097019.15 .142532385 10023501 - 2098234.15 .142483135 2099411.85 .142435397 2100553.38 .142389125 10023501 - 2101659.83 .142344275 2102732.25 .142300805 2102901.33 .142293952 10023501 - 2103771.69 .142258689 2104779.13 .142217873 2106732.42 .142138736 10023501 - 2108565.27 .142064480 2110285.01 .141994805 2111898.55 .141929434 10023501 - 2113412.36 .141868103 2113521.84 .141863668 2114832.54 .141816332 10023501 - 2116164.83 .141768217 2117414.61 .141723082 2118586.95 .141680743 10023501 - 2119686.61 .141641030 2120718.06 .141603780 2122653.37 .141533888 10023501 - 2124348.21 .141472680 2125832.31 .141419084 2127131.75 .141372157 10023501 - 2128269.40 .141331072 2129265.35 .141295105 2131009.38 .141232123 10023501 - 2132318.34 .141184853 2134283.27 .141113894 2136250.00 .141042872 10023501 - 2139825.37 .140913749 2143294.72 .140788456 2146661.02 .140666886 10023501 - 2149927.16 .140548933 2153095.98 .140434495 2156170.22 .140323473 10023501 - 2159152.58 .140215770 2162045.67 .140111291 2162719.00 .140086975 10023501 - 2163500.00 .140058771 2164852.05 .140009915 2167574.21 .139911551 10023501 - 2170214.56 .139816144 2172775.47 .139723608 2175259.23 .139633860 10023501 - 2177668.08 .139546820 2180004.20 .139462408 2184537.55 .139298604 10023501 - 2188796.13 .139144730 2192796.09 .139000202 2196552.68 .138864470 10023501 - 2200080.34 .138737011 2203392.66 .138617334 2206502.50 .138504974 10023501 - 2209421.95 .138399495 2212162.44 .138300482 2213980.58 .138234794 10023501 - 2214734.75 .138207560 2217148.99 .138120377 2221682.80 .137956656 10023501 - 2225657.48 .137813130 2229141.16 .137687336 2232193.85 .137577107 10023501 - 2232287.24 .137573735 2234868.39 .137480535 2239556.52 .137311260 10023501 - 2243079.08 .137184075 2245724.63 .137088557 2249698.81 .136945073 10023501 - 2253680.00 .136801342 2260603.04 .136551361 2265809.28 .136363377 10023501 - 2269721.82 .136222108 2275603.29 .136009753 2281500.00 .135796853 10023501 - 2287848.46 .135567638 2290867.65 .135458632 2291918.49 .135420692 10023501 - 2292621.40 .135395329 2299799.47 .135136330 2304117.08 .134980548 10023501 - 2307000.00 .134889947 2314760.76 .134646046 2320598.46 .134462589 10023501 - 2329382.61 .134186548 2338200.00 .133909478 2340857.88 .133825956 10023501 - 2347938.99 .133603439 2355269.85 .133373085 2366309.06 .133026224 10023501 - 2372600.00 .132828571 2377400.00 .132677609 2385557.92 .132421031 10023501 - 2397847.31 .132034536 2398832.92 .132003542 2410200.00 .131646082 10023501 - 2419298.36 .131359961 2433010.33 .130928782 2438433.87 .130758251 10023501 - 2446800.00 .130495333 2454709.00 .130246774 2456516.97 .130189954 10023501 - 2471164.82 .129729645 2485900.00 .129266636 2497567.61 .128900003 10023501 - 2511886.43 .128450101 2511900.00 .128449675 2515171.77 .128353944 10023501 - 2532900.00 .127835288 2540625.58 .127609267 2540972.79 .127599116 10023501 - 2544637.81 .127491966 2556430.00 .127147239 2570186.08 .126745086 10023501 - 2590959.10 .126137864 2607654.30 .125649913 2611900.00 .125525824 10023501 - 2623941.48 .125173868 2630267.99 .124988970 2642107.86 .124642942 10023501 - 2647100.00 .124497061 2660400.00 .124107941 2660740.55 .124097977 10023501 - 2681375.63 .123561091 2697215.81 .123149011 2710971.89 .122791200 10023501 - 2721151.70 .122526412 2731228.75 .122264345 2745300.00 .121898600 10023501 - 2754228.70 .121666494 2761088.29 .121488176 2784941.12 .120868195 10023501 - 2809000.00 .120242964 2818383.00 .119999098 2832576.52 .119630206 10023501 - 2862461.58 .118853635 2868312.84 .118701691 2884031.50 .118293615 10023501 - 2900699.89 .117860883 2904500.00 .117775232 2928086.15 .117243554 10023501 - 2934269.52 .117104198 2963824.97 .116438102 3000000.00 .115623039 10023501 - 3019951.72 .115172819 3024300.88 .115074678 3030773.26 .114928627 10023501 - 3077526.03 .113873910 3125000.00 .112803287 3162277.66 .111962580 10023501 - 3162300.00 .111962077 3164553.81 .111914994 3179229.47 .111608418 10023501 - 3211308.15 .110938558 3234400.00 .110456775 3281223.39 .109479733 10023501 - 3311311.00 .108852079 3311311.22 .108852074 3316785.23 .108737881 10023501 - 3349678.10 .108051918 3370851.95 .107660432 3425800.00 .106644939 10023501 - 3437500.00 .106428675 3447465.81 .106244156 3467368.51 .105875653 10023501 - 3496813.97 .105330465 3553243.45 .104286204 3569300.00 .103989068 10023501 - 3621972.55 .103014129 3630780.55 .102851168 3651767.18 .102462884 10023501 - 3702442.38 .101651618 3708099.25 .101561114 3718026.30 .101402423 10023501 - 3784700.00 .100336598 3801893.96 .100061628 3837413.45 .099493593 10023501 - 3890451.00 .098645781 3917863.43 .098207590 3981071.71 .097197764 10023501 - 3981100.00 .097197312 4000000.00 .096919659 4061086.38 .096019687 10023501 - 4073802.34 .095832436 4154469.54 .094644560 4168693.84 .094435226 10023501 - 4216964.61 .093724841 4216993.34 .093724418 4250000.00 .093278745 10023501 - 4340798.56 .092051771 4358898.95 .091807336 4365158.32 .091722861 10023501 - 4403041.58 .091211596 4441196.20 .090742238 4480646.54 .090256941 10023501 - 4570881.90 .089147915 4625000.00 .088482785 4677351.00 .087838937 10023501 - 4697616.86 .087589694 4750000.00 .087013456 4786300.92 .086613435 10023501 - 4808846.02 .086364997 4911905.08 .085230528 5000000.00 .084260784 10023501 - 5011872.34 .084129768 5011900.00 .084129463 5095507.78 .083270101 10023501 - 5120568.45 .083012514 5248074.60 .081702893 5306894.25 .081098755 10023501 - 5308872.01 .081078460 5383859.57 .080374038 5495408.74 .079326163 10023501 - 5500000.00 .079283034 5543092.80 .078877804 5688529.00 .077634175 10023501 - 5744562.65 .077155030 5754399.37 .077071008 5854637.08 .076214815 10023501 - 5913941.02 .075708263 6000000.00 .075052836 6025595.86 .074856903 10023501 - 6157082.65 .073850389 6309573.45 .072683093 6309600.00 .072682890 10023501 - 6363961.04 .072297652 6394126.68 .072084184 6606934.48 .070578240 10023501 - 6683463.99 .070036676 6750000.00 .069606704 6766913.35 .069497289 10023501 - 6918309.71 .068517877 6978329.17 .068129600 7000000.00 .068002471 10023501 - 7161434.00 .067050833 7244359.60 .066561995 7413102.35 .065567274 10023501 - 7445197.25 .065378077 7483314.78 .065178293 7585775.75 .064642057 10023501 - 7640556.63 .064355357 7943282.35 .062771021 7943300.00 .062770929 10023501 - 8000000.00 .062498025 8055523.19 .062229066 8317637.71 .060959363 10023501 - 8381472.36 .060650143 8413965.45 .060492744 8485281.38 .060178003 10023501 - 8634560.58 .059519896 8709635.90 .059188922 8785177.56 .058855892 10023501 - 9000000.00 .057999547 9028594.05 .057884762 9120108.39 .057517396 10023501 - 9372927.81 .056502502 9440609.00 .056261765 9549925.86 .055872931 10023501 - 9814654.82 .054931307 10000000.0 .054272046 10154082.2 .053767425 10023501 - 10460696.7 .052763257 10592483.9 .052331652 11000000.0 .051119160 10023501 - 11019718.5 .051060077 11059771.9 .050940064 11458503.9 .049862366 10023501 - 11799638.5 .048940343 12000000.0 .048462435 12149657.5 .048102925 10023501 - 12589000.0 .047047526 12882500.0 .046406717 13000000.0 .046150175 10023501 - 13335026.8 .045413674 13489632.9 .045105780 13923418.9 .044241905 10023501 - 14000000.0 .044104897 14044300.5 .044025021 14548311.7 .043116259 10023501 - 14855041.8 .042563206 15000000.0 .042333557 15004137.0 .042326957 10023501 - 15836465.5 .040999190 15849000.0 .040979195 16000000.0 .040761678 10023501 - 16490874.6 .040045979 16788173.6 .039612514 16999367.4 .039334536 10023501 - 17528899.1 .038637553 17791655.7 .038328132 18000000.0 .038082786 10023501 - 18620870.0 .037339855 18701714.5 .037243117 19639253.2 .036261647 10023501 - 19953000.0 .035933199 20000000.0 .035889065 20575923.9 .035339626 10023501 - 21135218.4 .034806051 21432085.0 .034551523 22000000.0 .034064604 10023501 - 22067627.4 .034005708 22210399.3 .033894851 22914575.6 .033348082 10023501 - 23000000.0 .033281752 23543932.0 .032859408 24000000.0 .032551762 10023501 - 24201030.2 .032413843 25119000.0 .031784060 25213049.8 .031726605 10023501 - 25999741.3 .031246013 26000000.0 .031245855 26607405.5 .030868715 10023501 - 27226041.0 .030525102 27781306.4 .030216688 28000000.0 .030109197 10023501 - 28510180.0 .029853845 29512089.8 .029352375 29639977.3 .029288365 10023501 - 30000000.0 .029132992 30483334.2 .028916687 31623000.0 .028406656 10023501 - 32391395.7 .028102472 33496781.0 .027664884 34158670.2 .027432074 10023501 - 34641016.2 .027262416 34974625.9 .027142496 35000000.0 .027134468 10023501 - 35783954.9 .026886429 37269391.2 .026416445 37314539.2 .026402161 10023501 - 38619643.7 .026049823 39811000.0 .025728193 39841183.6 .025721104 10023501 - 40000000.0 .025683801 42072583.1 .025161631 42169933.4 .025137105 10023501 - 43827771.1 .024768568 44030415.8 .024723520 44721359.6 .024589898 10023501 - 46598796.2 .024217043 46976168.6 .024142097 49545020.0 .023711938 10023501 - 50000000.0 .023635751 50119000.0 .023614397 51730896.9 .023363862 10023501 - 53088720.1 .023152819 53867662.9 .023047176 54772255.8 .022924492 10023501 - 55430928.0 .022833972 55950970.8 .022772543 57977188.4 .022533201 10023501 - 59139410.2 .022395917 59943359.5 .022317667 60000000.0 .022312154 10023501 - 63096000.0 .021975835 63811425.3 .021909599 66834639.9 .021629702 10023501 - 67400193.1 .021584810 69282032.4 .021435434 69783291.7 .021393176 10023501 - 70000000.0 .021377695 70705549.0 .021327294 73730437.7 .021111208 10023501 - 74451972.5 .021059664 76483184.4 .020942694 78976015.2 .020799141 10023501 - 79433000.0 .020772825 80000000.0 .020746317 83535564.9 .020549994 10023501 - 84139654.5 .020516450 87127160.7 .020376760 87851775.6 .020342879 10023501 - 89442719.2 .020282079 89921837.3 .020262282 90000000.0 .020259053 10023501 - 93729278.1 .020104965 94282825.1 .020087181 98855310.0 .019940277 10023501 - 100000000. .019903500 103216709. .019797665 105924839. .019708562 10023501 - 107480120. .019666425 110597719. .019581961 110668193. .019580450 10023501 - 111636867. .019558256 115679704. .019465627 117996385. .019412547 10023501 - 119602733. .019385515 120000000. .019378829 122474488. .019337188 10023501 - 125890000. .019272806 127320541. .019252748 128841876. .019231416 10023501 - 133350268. .019160961 134481076. .019147629 139234189. .019091593 10023501 - 140000000. .019085425 141076130. .019076758 147111579. .019028150 10023501 - 148550418. .019016562 150000000. .019010709 152604032. .018983404 10023501 - 157577885. .018931250 158490000. .018921685 160000000. .018910673 10023501 - 166675385. .018861992 167881736. .018853194 173205081. .018827843 10023501 - 173841562. .018823456 175288991. .018813479 179417677. .018795186 10023501 - 180000000. .018792606 187017145. .018761516 188118993. .018759550 10023501 - 197242300. .018743274 199530000. .018739193 200000000. .018739349 10023501 - 205974964. .018712174 211352184. .018687718 214512652. .018678605 10023501 - 220676274. .018660832 222837863. .018658099 230000000. .018649045 10023501 - 230935955. .018647862 235439320. .018642169 238794991. .018643766 10023501 - 244948975. .018646694 251190000. .018636849 254258698. .018636289 10023501 - 260000000. .018635241 266074055. .018634133 268608715. .018636442 10023501 - 277813064. .018644828 281827809. .018652755 293927095. .018676646 10023501 - 296399773. .018681528 300000000. .018692749 304939320. .018691735 10023501 - 314912940. .018689687 316230000. .018689417 333158114. .018701528 10023501 - 334967810. .018702823 346410162. .018719211 347532409. .018719740 10023501 - 349746259. .018720784 350000000. .018721080 358718684. .018731268 10023501 - 373145392. .018748125 376176816. .018753937 394484600. .018789033 10023501 - 398110000. .018795982 400000000. .018800749 411949926. .018806940 10023501 - 421699334. .018811990 429025303. .018819222 440304158. .018830357 10023501 - 445675724. .018838109 461871906. .018861485 469761686. .018872871 10023501 - 477589977. .018888003 500000000. .018931319 501190000. .018931881 10023501 - 508517391. .018938252 530887201. .018957699 537217425. .018965144 10023501 - 554309280. .018985245 563655613. .018999022 587854184. .019034694 10023501 - 591394102. .019039913 600000000. .019055353 609878634. .019061824 10023501 - 629825874. .019074892 630960000. .019075635 666316222. .019107966 10023501 - 668346399. .019109822 692820324. .019137104 695064812. .019139078 10023501 - 697832917. .019141513 700000000. .019143841 717437362. .019162574 10023501 - 744519725. .019191668 752353629. .019201719 788969200. .019248702 10023501 - 794330000. .019255580 800000000. .019263819 823534011. .019277635 10023501 - 841396545. .019288121 857312551. .019299544 878517756. .019314763 10023501 - 890237156. .019324661 900000000. .019332906 922252556. .019351700 10023501 - 937292781. .019364402 953311850. .019380112 1.00000E+9 .019425900 10023501 - 1.01440E+9 .019431889 1.05926E+9 .019450545 1.07105E+9 .019456448 10023501 - 1.10599E+9 .019473945 1.12322E+9 .019483998 1.17094E+9 .019511843 10023501 - 1.17998E+9 .019517117 1.20000E+9 .019530571 1.21435E+9 .019540214 10023501 - 1.22475E+9 .019547203 1.25366E+9 .019560020 1.25890E+9 .019562343 10023501 - 1.32552E+9 .019596698 1.33351E+9 .019600818 1.38211E+9 .019628573 10023501 - 1.39236E+9 .019634427 1.40000E+9 .019639200 1.47154E+9 .019683897 10023501 - 1.48552E+9 .019692632 1.50000E+9 .019702513 1.56675E+9 .019719682 10023501 - 1.58490E+9 .019724350 1.60000E+9 .019728945 1.63613E+9 .019739940 10023501 - 1.67882E+9 .019752932 1.70395E+9 .019761484 1.75290E+9 .019778143 10023501 - 1.77009E+9 .019784593 1.80000E+9 .019795817 1.83442E+9 .019808732 10023501 - 1.87018E+9 .019822151 1.89686E+9 .019833162 1.99530E+9 .019873790 10023501 - 2.00000E+9 .019875874 2.01970E+9 .019878922 2.11353E+9 .019893440 10023501 - 2.13369E+9 .019897030 2.20678E+9 .019910047 2.23869E+9 .019916454 10023501 - 2.30000E+9 .019928764 2.33481E+9 .019935753 2.35441E+9 .019939688 10023501 - 2.42228E+9 .019954965 2.44949E+9 .019961090 2.50151E+9 .019970212 10023501 - 2.51190E+9 .019972034 2.60000E+9 .019989239 2.64643E+9 .019998307 10023501 - 2.66075E+9 .020001104 2.76060E+9 .020022117 2.77814E+9 .020025809 10023501 - 2.84945E+9 .020041867 2.96401E+9 .020067664 2.98811E+9 .020073471 10023501 - 3.00000E+9 .020076336 3.13350E+9 .020090396 3.16230E+9 .020093430 10023501 - 3.27224E+9 .020106432 3.34969E+9 .020115591 3.40789E+9 .020123046 10023501 - 3.49748E+9 .020134521 3.50000E+9 .020134868 3.54015E+9 .020140394 10023501 - 3.66881E+9 .020158103 3.73147E+9 .020166727 3.79367E+9 .020175924 10023501 - 3.98110E+9 .020203639 4.00000E+9 .020206592 4.03934E+9 .020209514 10023501 - 4.21700E+9 .020222710 4.26732E+9 .020226768 4.40305E+9 .020237714 10023501 - 4.47733E+9 .020244164 4.66955E+9 .020260855 4.69763E+9 .020263293 10023501 - 4.84450E+9 .020277019 5.00000E+9 .020291551 5.00295E+9 .020291700 10023501 - 5.01190E+9 .020292152 5.29280E+9 .020307855 5.30888E+9 .020308754 10023501 - 5.52115E+9 .020321496 5.54311E+9 .020322814 5.69886E+9 .020332787 10023501 - 5.91395E+9 .020346559 5.97619E+9 .020350811 6.00000E+9 .020352438 10023501 - 6.26700E+9 .020361201 6.30960E+9 .020362599 6.54448E+9 .020371136 10023501 - 6.68347E+9 .020376188 6.81575E+9 .020381350 6.97834E+9 .020387694 10023501 - 7.00000E+9 .020388595 7.08028E+9 .020391936 7.33759E+9 .020402642 10023501 - 7.44521E+9 .020407119 7.58731E+9 .020413426 7.94330E+9 .020429226 10023501 - 8.00000E+9 .020431872 8.07864E+9 .020433772 8.41397E+9 .020441876 10023501 - 8.53470E+9 .020445002 8.78519E+9 .020451487 8.95481E+9 .020456163 10023501 - 9.00000E+9 .020457409 9.33934E+9 .020466763 9.37294E+9 .020467689 10023501 - 9.68956E+9 .020476985 1.0000E+10 .020486100 1.0007E+10 .020486174 10023501 - 1.0587E+10 .020492343 1.0593E+10 .020492406 1.1044E+10 .020497709 10023501 - 1.1061E+10 .020497909 1.1400E+10 .020502262 1.1801E+10 .020507412 10023501 - 1.1954E+10 .020509553 1.2000E+10 .020510197 1.2534E+10 .020517670 10023501 - 1.2589E+10 .020518439 1.3090E+10 .020525932 1.3336E+10 .020529612 10023501 - 1.3633E+10 .020534267 1.3925E+10 .020538844 1.4000E+10 .020540072 10023501 - 1.4163E+10 .020542740 1.4679E+10 .020551187 1.4856E+10 .020554085 10023501 - 1.5000E+10 .020556551 1.5179E+10 .020557682 1.5849E+10 .020561919 10023501 - 1.6000E+10 .020562967 1.6162E+10 .020564091 1.6789E+10 .020568442 10023501 - 1.7074E+10 .020570551 1.7530E+10 .020573927 1.7915E+10 .020576952 10023501 - 1.8000E+10 .020577619 1.8684E+10 .020582993 1.8703E+10 .020583142 10023501 - 1.9384E+10 .020588821 1.9953E+10 .020593565 2.0000E+10 .020593976 10023501 - 2.0018E+10 .020594039 2.1136E+10 .020597993 2.1177E+10 .020598151 10023501 - 2.2069E+10 .020601573 2.2090E+10 .020601660 2.2800E+10 .020604591 10023501 - 2.3000E+10 .020605416 2.3545E+10 .020607666 2.3908E+10 .020609277 10023501 - 2.5068E+10 .020614428 2.5119E+10 .020614654 2.6000E+10 .020618792 10023501 - 2.6179E+10 .020619633 2.6608E+10 .020621648 2.7265E+10 .020624862 10023501 - 2.7783E+10 .020627396 2.8324E+10 .020630143 2.9354E+10 .020635374 10023501 - 2.9641E+10 .020636831 3.0000E+10 .020638726 3.0353E+10 .020639743 10023501 - 3.1623E+10 .020643400 3.2319E+10 .020645520 3.3498E+10 .020649111 10023501 - 3.4143E+10 .020651156 3.4976E+10 .020653796 3.5000E+10 .020653875 10023501 - 3.5824E+10 .020656587 3.7316E+10 .020661498 3.7362E+10 .020661655 10023501 - 3.8762E+10 .020666444 3.9811E+10 .020670032 4.0000E+10 .020670699 10023501 - 4.0030E+10 .020670724 4.2171E+10 .020672497 4.2348E+10 .020672657 10023501 - 4.4032E+10 .020674187 4.4174E+10 .020674327 4.5595E+10 .020675728 10023501 - 4.6977E+10 .020677091 4.7812E+10 .020677984 5.0000E+10 .020680325 10023501 - 5.0119E+10 .020680536 5.0136E+10 .020680567 5.2348E+10 .020684634 10023501 - 5.3089E+10 .020685996 5.4510E+10 .020688683 5.5432E+10 .020690426 10023501 - 5.6618E+10 .020692728 5.8668E+10 .020696706 5.9141E+10 .020697624 10023501 - 6.0000E+10 .020699338 6.0657E+10 .020699564 6.3096E+10 .020700404 10023501 - 6.4569E+10 .020700977 6.6835E+10 .020701858 6.8199E+10 .020702434 10023501 - 6.9785E+10 .020703103 7.0000E+10 .020703201 7.1542E+10 .020703902 10023501 - 7.4453E+10 .020705225 7.4601E+10 .020705297 7.7385E+10 .020706659 10023501 - 7.9433E+10 .020707661 7.9906E+10 .020707906 8.0000E+10 .020707954 10023501 - 8.4140E+10 .020709891 8.4516E+10 .020710075 8.7853E+10 .020711707 10023501 - 8.8147E+10 .020711857 9.0000E+10 .020712802 9.3730E+10 .020714705 10023501 - 9.3887E+10 .020714788 1.0000E+11 .020718042 10023501 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023502 - 0.0 0.0 0 0 1 361 10023502 - 361 2 10023502 - 1.00000000 4.52522E-6 2.00000000 7.39734E-5 2.25000000 1.19403E-4 10023502 - 2.53125000 1.93136E-4 2.84765625 3.13239E-4 3.20361328 5.09782E-4 10023502 - 3.60406494 8.33351E-4 4.05457306 .001370202 4.56139469 .002270044 10023502 - 5.13156903 .003798750 5.77301516 .006443051 6.49464205 .011130892 10023502 - 7.30647231 .019732120 8.02516327 .031956909 8.65401786 .048209041 10023502 - 9.20426563 .068894957 9.68573242 .094338204 10.1070159 .124770951 10023502 - 10.4756389 .160326047 11.1207292 .254308692 11.6045469 .370554997 10023502 - 11.9674102 .505265912 12.2395576 .652713230 12.4436682 .805983952 10023502 - 12.7498341 1.15789519 12.9029171 1.43259240 13.0560000 1.83559555 10023502 - 13.0565313 1.83732919 13.0607688 1.85125981 13.0670633 1.87230743 10023502 - 13.0732843 1.89353559 13.0794326 1.91494628 13.0855092 1.93654175 10023502 - 13.0915149 1.95832440 13.0974505 1.98029674 13.1033167 2.00246139 10023502 - 13.1091145 2.02482111 13.1148447 2.04737877 13.1205079 2.07013741 10023502 - 13.1261050 2.09310019 13.1316368 2.11627042 13.1371040 2.13965173 10023502 - 13.1443085 2.17122277 13.1514009 2.20318577 13.1583829 2.23555012 10023502 - 13.1652562 2.26832581 13.1720225 2.30152333 13.1786836 2.33515366 10023502 - 13.1852409 2.36922825 13.1916962 2.40375896 13.1980510 2.43875807 10023502 - 13.2043070 2.47423827 13.2104655 2.51021282 13.2165282 2.54669910 10023502 - 13.2254458 2.60238880 13.2341560 2.65929527 13.2426637 2.71745720 10023502 - 13.2509735 2.77691549 13.2590900 2.83770864 13.2670179 2.89986189 10023502 - 13.2722004 2.94214548 13.2823641 3.02876464 13.2922127 3.11800100 10023502 - 13.3017559 3.20984509 13.3110032 3.30429528 13.3199638 3.40133343 10023502 - 13.3286465 3.50102981 13.3411685 3.65450286 13.3531127 3.81311358 10023502 - 13.3645056 3.97619437 13.3754294 4.14422349 13.3892458 4.37224556 10023502 - 13.4022121 4.60397689 13.4143807 4.83783800 13.4312444 5.18256314 10023502 - 13.4467356 5.52475817 13.4652950 5.95846384 13.4890065 6.53627410 10023502 - 13.5150206 7.18400855 13.5442323 7.88745452 13.5990191 8.93264869 10023502 - 13.6538059 9.51682411 13.7097724 9.51099939 13.7568469 9.10153327 10023502 - 13.8307204 8.24884530 13.9012361 7.38413260 13.9717518 6.83619018 10023502 - 14.0535435 6.27538803 14.2069030 5.56860818 14.3410925 5.13134792 10023502 - 14.4585084 4.82820203 14.6639861 4.40819844 14.8180944 4.15339605 10023502 - 14.9336756 3.98526862 15.1070475 3.75978910 15.1937334 3.65629374 10023502 - 15.2804193 3.55801466 15.5855954 3.35044887 15.6102141 3.33533815 10023502 - 15.7338872 3.25900212 15.9503150 3.13256440 16.1126359 3.04202030 10023502 - 16.3561173 2.90977556 16.4778579 2.84372530 17.3244961 2.56663962 10023502 - 17.6869448 2.46059048 18.8105584 2.21373068 19.5717233 2.06231111 10023502 - 21.3085588 1.84869463 23.2195517 1.68420181 25.2875942 1.55171142 10023502 - 27.2969679 1.44961972 29.6889627 1.35701751 32.1306229 1.27915932 10023502 - 35.0992922 1.20733668 37.7473621 1.15132274 40.7780241 1.10003414 10023502 - 44.3231035 1.05139639 48.0404849 1.00885641 51.9156495 .972281831 10023502 - 55.8324364 .940940008 60.3151197 .911494836 65.2344043 .884628591 10023502 - 70.2523057 .861329706 75.9770513 .839544692 82.3331226 .819602977 10023502 - 88.4616560 .803186072 95.4695014 .787745797 103.101244 .773693643 10023502 - 111.473255 .760927349 120.394998 .749664044 129.359636 .740116491 10023502 - 138.904444 .731550209 150.162813 .723215602 161.616998 .716074183 10023502 - 173.232473 .709914414 186.480931 .704016681 200.766437 .698623516 10023502 - 216.262484 .693636583 233.218252 .688981758 252.403767 .684491764 10023502 - 270.212944 .680814639 290.150417 .677171612 312.446551 .673530640 10023502 - 336.746353 .669932269 361.096238 .666582388 387.845901 .663124186 10023502 - 416.869400 .659539483 448.196508 .655780087 483.153264 .651645177 10023502 - 518.076340 .647512159 555.904300 .641647528 595.083792 .635127804 10023502 - 634.310495 .630012673 679.796841 .624965908 728.502511 .619972727 10023502 - 779.745923 .614754991 837.393698 .608641139 901.647218 .597412689 10023502 - 965.765962 .587222126 1035.14200 .577038835 1109.89862 .564372288 10023502 - 1189.84952 .551863052 1272.82577 .538090063 1363.75832 .522743647 10023502 - 1462.17700 .505820616 1575.08299 .486076613 1684.04628 .467316736 10023502 - 1803.70104 .446911904 1925.97182 .426699213 2052.36138 .406079835 10023502 - 2192.29452 .384094649 2360.59127 .358877524 2522.94747 .335895401 10023502 - 2701.16633 .312297689 2883.21261 .289913556 3071.32220 .268718161 10023502 - 3292.57884 .246058155 3537.70007 .223655137 3782.72572 .203835264 10023502 - 4060.86219 .184079577 4356.87920 .165832726 4686.49485 .148375044 10023502 - 5015.10075 .133476141 5370.31800 .119688937 5736.01252 .107568462 10023502 - 6144.48005 .096049592 6608.22110 .085050732 7105.66197 .075201531 10023502 - 7618.91013 .066707486 8137.49576 .059488288 8726.83957 .052601951 10023502 - 9341.96523 .046598107 10018.3853 .041093521 10730.8180 .036272553 10023502 - 11528.8537 .031801257 12313.9546 .028152098 13213.5345 .024683239 10023502 - 14036.4906 .022035162 15003.2914 .019428307 16046.2805 .017097172 10023502 - 17154.3788 .015047431 18404.6094 .013144186 19767.0269 .011450659 10023502 - 21205.4907 .009992123 22677.3707 .008768410 24274.2134 .007677240 10023502 - 25909.6644 .006756899 27811.5003 .005879577 29803.6009 .005131198 10023502 - 32054.6799 .004444848 34441.2045 .003856929 36867.5292 .003370842 10023502 - 39420.8671 .002951998 42270.6896 .002570303 45299.5144 .002240288 10023502 - 48464.3996 .001958893 51631.3150 .001727154 55301.5854 .001506500 10023502 - 59229.3022 .001314079 63358.8677 .001148934 67806.1702 .001003600 10023502 - 72322.9707 8.82479E-4 77590.9962 7.66981E-4 83419.8568 6.63748E-4 10023502 - 89785.5840 5.73122E-4 96098.1075 5.00409E-4 102953.902 4.36067E-4 10023502 - 109875.445 3.82919E-4 117735.091 3.33550E-4 125931.240 2.91582E-4 10023502 - 134740.930 2.54728E-4 144556.092 2.21333E-4 155383.984 1.91578E-4 10023502 - 166514.229 1.66835E-4 179112.166 1.44201E-4 192757.121 1.24516E-4 10023502 - 206101.673 1.08919E-4 222036.149 9.38509E-5 239029.310 8.09842E-5 10023502 - 258365.874 6.93182E-5 276515.058 6.05190E-5 298297.837 5.20044E-5 10023502 - 322461.406 4.45035E-5 347196.076 3.83892E-5 375837.400 3.27616E-5 10023502 - 406828.538 2.79608E-5 440301.297 2.38714E-5 476608.095 2.03732E-5 10023502 - 548239.098 1.53974E-5 629462.706 1.16803E-5 690192.132 9.71529E-6 10023502 - 756780.624 8.08086E-6 829793.454 6.72140E-6 909850.429 5.59063E-6 10023502 - 1000000.00 4.62809E-6 1096478.20 3.84949E-6 1202264.44 3.20187E-6 10023502 - 1318256.74 2.66321E-6 1445439.77 2.21516E-6 1584893.19 1.84249E-6 10023502 - 1737800.83 1.53252E-6 1905460.72 1.27470E-6 2089296.13 1.06025E-6 10023502 - 2290867.65 8.81875E-7 2398832.92 8.04280E-7 2511886.43 7.33512E-7 10023502 - 2630267.99 6.68971E-7 2754228.70 6.10109E-7 2884031.50 5.56426E-7 10023502 - 3019951.72 5.07467E-7 3162277.66 4.62815E-7 3311311.22 4.22093E-7 10023502 - 3467368.51 3.84953E-7 3630780.55 3.51081E-7 3801893.96 3.20190E-7 10023502 - 3981071.71 2.92017E-7 4168693.84 2.66323E-7 4365158.32 2.42889E-7 10023502 - 4570881.90 2.21517E-7 4786300.92 2.02026E-7 5011872.34 1.84250E-7 10023502 - 5248074.60 1.68038E-7 5495408.74 1.53253E-7 5754399.37 1.39768E-7 10023502 - 6025595.86 1.27470E-7 6309573.45 1.16254E-7 6606934.48 1.06025E-7 10023502 - 6918309.71 9.66959E-8 7244359.60 8.81877E-8 7585775.75 8.04282E-8 10023502 - 7943282.35 7.33514E-8 8317637.71 6.68972E-8 8709635.90 6.10110E-8 10023502 - 9120108.39 5.56427E-8 9549925.86 5.07467E-8 10000000.0 4.62816E-8 10023502 - 12000000.0 3.21400E-8 14000000.0 2.36131E-8 16000000.0 1.80787E-8 10023502 - 18000000.0 1.42844E-8 20000000.0 1.15704E-8 23000000.0 8.74888E-9 10023502 - 26000000.0 6.84639E-9 30000000.0 5.14240E-9 35000000.0 3.77809E-9 10023502 - 40000000.0 2.89260E-9 50000000.0 1.85126E-9 60000000.0 1.28560E-9 10023502 - 70000000.0 9.4452E-10 80000000.0 7.2315E-10 90000000.0 5.7138E-10 10023502 - 100000000. 4.6282E-10 120000000. 3.2140E-10 140000000. 2.3613E-10 10023502 - 160000000. 1.8079E-10 180000000. 1.4284E-10 200000000. 1.1570E-10 10023502 - 230000000. 8.7489E-11 260000000. 6.8464E-11 300000000. 5.1424E-11 10023502 - 350000000. 3.7781E-11 400000000. 2.8926E-11 500000000. 1.8513E-11 10023502 - 600000000. 1.2856E-11 700000000. 9.4452E-12 800000000. 7.2315E-12 10023502 - 900000000. 5.7138E-12 1.00000E+9 4.6282E-12 1.20000E+9 3.2140E-12 10023502 - 1.40000E+9 2.3613E-12 1.60000E+9 1.8079E-12 1.80000E+9 1.4284E-12 10023502 - 2.00000E+9 1.1570E-12 2.30000E+9 8.7489E-13 2.60000E+9 6.8464E-13 10023502 - 3.00000E+9 5.1424E-13 3.50000E+9 3.7781E-13 4.00000E+9 2.8926E-13 10023502 - 5.00000E+9 1.8513E-13 6.00000E+9 1.2856E-13 7.00000E+9 9.4452E-14 10023502 - 8.00000E+9 7.2315E-14 9.00000E+9 5.7138E-14 1.0000E+10 4.6282E-14 10023502 - 1.2000E+10 3.2140E-14 1.4000E+10 2.3613E-14 1.6000E+10 1.8079E-14 10023502 - 1.8000E+10 1.4284E-14 2.0000E+10 1.1570E-14 2.3000E+10 8.7489E-15 10023502 - 2.6000E+10 6.8464E-15 3.0000E+10 5.1424E-15 3.5000E+10 3.7781E-15 10023502 - 4.0000E+10 2.8926E-15 5.0000E+10 1.8513E-15 6.0000E+10 1.2856E-15 10023502 - 7.0000E+10 9.4452E-16 8.0000E+10 7.2315E-16 9.0000E+10 5.7138E-16 10023502 - 1.0000E+11 4.6282E-16 10023502 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023504 - 0.0 0.0 0 0 1 396 10023504 - 396 2 10023504 - 1.00000000 9.56230E-8 1.05924839 1.07290E-7 1.10597719 1.16966E-7 10023504 - 1.14237171 1.24791E-7 1.19922131 1.37521E-7 1.25890000 1.51550E-7 10023504 - 1.33350268 1.70042E-7 1.39234189 1.85377E-7 1.43816887 1.97779E-7 10023504 - 1.50975292 2.17955E-7 1.58490000 2.40190E-7 1.67881736 2.69498E-7 10023504 - 1.75288991 2.93804E-7 1.81058131 3.13461E-7 1.90069801 3.45439E-7 10023504 - 1.99530000 3.80680E-7 2.11352184 4.27129E-7 2.20676274 4.65648E-7 10023504 - 2.27938308 4.96801E-7 2.39281892 5.47480E-7 2.51190000 6.03330E-7 10023504 - 2.66074055 6.76949E-7 2.77813064 7.38000E-7 2.86955971 7.87375E-7 10023504 - 3.01237592 8.67700E-7 3.16230000 9.56220E-7 3.34967810 1.07290E-6 10023504 - 3.49746259 1.16965E-6 3.61256426 1.24791E-6 3.79235805 1.37521E-6 10023504 - 3.98110000 1.51550E-6 4.21699334 1.70042E-6 4.40304158 1.85377E-6 10023504 - 4.54794485 1.97779E-6 4.77428998 2.17955E-6 5.01190000 2.40190E-6 10023504 - 5.30887201 2.69497E-6 5.54309280 2.93800E-6 5.72551517 3.13456E-6 10023504 - 6.01046675 3.45432E-6 6.30960000 3.80670E-6 6.68346399 4.27119E-6 10023504 - 6.97832917 4.65638E-6 7.20798427 4.96790E-6 7.56671537 5.47470E-6 10023504 - 7.94330000 6.03320E-6 8.41396545 6.76933E-6 8.78517756 7.37979E-6 10023504 - 9.07429530 7.87350E-6 9.52590957 8.67669E-6 10.0000000 9.56180E-6 10023504 - 10.5924839 1.07284E-5 11.0597719 1.16959E-5 11.4237171 1.24784E-5 10023504 - 11.9922131 1.37513E-5 12.5890000 1.51540E-5 13.3350268 1.70030E-5 10023504 - 13.9234189 1.85363E-5 14.3816887 1.97764E-5 15.0975292 2.17938E-5 10023504 - 15.8490000 2.40170E-5 16.7881736 2.69475E-5 17.5288991 2.93776E-5 10023504 - 18.1058131 3.13431E-5 19.0069801 3.45404E-5 19.9530000 3.80640E-5 10023504 - 21.1352184 4.27083E-5 22.0676274 4.65597E-5 22.7938308 4.96745E-5 10023504 - 23.9281892 5.47418E-5 25.1190000 6.03260E-5 26.6074055 6.76863E-5 10023504 - 27.7813064 7.37901E-5 28.6955971 7.87265E-5 30.1237592 8.67572E-5 10023504 - 31.6230000 9.56070E-5 33.4967810 1.07272E-4 34.9746259 1.16945E-4 10023504 - 36.1256426 1.24768E-4 37.9235805 1.37495E-4 39.8110000 1.51520E-4 10023504 - 42.1699334 1.70006E-4 44.0304158 1.85336E-4 45.4794485 1.97734E-4 10023504 - 47.7428998 2.17903E-4 50.1190000 2.40130E-4 53.0887201 2.69425E-4 10023504 - 55.4309280 2.93718E-4 57.2551517 3.13366E-4 60.1046675 3.45328E-4 10023504 - 63.0960000 3.80550E-4 66.8346399 4.26922E-4 69.7832917 4.65373E-4 10023504 - 72.0798427 4.96467E-4 75.6671537 5.47047E-4 79.4330000 6.02780E-4 10023504 - 84.1396545 6.76206E-4 87.8517756 7.37088E-4 90.7429530 7.86320E-4 10023504 - 95.2590957 8.66402E-4 100.000000 9.54640E-4 105.924839 .001070946 10023504 - 110.597719 .001167384 114.237171 .001245370 119.922131 .001372224 10023504 - 125.890000 .001512000 133.350268 .001695844 139.234189 .001848253 10023504 - 143.816887 .001971484 150.975292 .002171904 158.490000 .002392700 10023504 - 167.881736 .002683365 175.288991 .002924310 181.058131 .003119114 10023504 - 190.069801 .003435918 199.530000 .003784900 211.352184 .004243314 10023504 - 220.676274 .004623207 227.938308 .004930283 239.281892 .005429561 10023504 - 251.190000 .005979400 266.074055 .006700644 277.813064 .007298115 10023504 - 286.955971 .007780927 301.237592 .008565689 316.230000 .009429600 10023504 - 334.967810 .010559433 349.746259 .011494791 373.145392 .013055450 10023504 - 398.110000 .014828000 421.699334 .016587368 440.304158 .018042581 10023504 - 469.761686 .020468237 501.190000 .023220000 530.887201 .025932574 10023504 - 554.309280 .028173005 591.394102 .031901750 630.960000 .036124000 10023504 - 668.346399 .040236795 697.832917 .043625865 744.519725 .049252133 10023504 - 794.330000 .055604000 841.396545 .061708045 878.517756 .066721930 10023504 - 937.292781 .075016850 1000.00000 .084343000 1059.24839 .093077013 10023504 - 1105.97719 .100216096 1179.96385 .111964421 1258.90000 .125090000 10023504 - 1333.50268 .136949361 1453.77729 .156879476 1584.90000 .179710000 10023504 - 1778.30003 .210928436 1995.30000 .247570000 2238.74833 .283131006 10023504 - 2511.90000 .323800000 3162.30000 .399800000 3548.15904 .431970664 10023504 - 3981.10000 .466730000 4466.86413 .492408606 5011.90000 .519500000 10023504 - 5623.44061 .537739798 6309.60000 .556620000 7943.30000 .580510000 10023504 - 10000.0000 .593440000 12589.0000 .607250000 15849.0000 .609320000 10023504 - 19953.0000 .606540000 25119.0000 .599800000 31623.0000 .589500000 10023504 - 39811.0000 .575900000 50119.0000 .559200000 56234.4061 .549266777 10023504 - 63096.0000 .539510000 70794.8061 .528150410 79433.0000 .517030000 10023504 - 89125.1929 .504375129 100000.000 .492030000 112200.714 .478288101 10023504 - 125890.000 .464930000 141252.633 .450335947 158490.000 .436200000 10023504 - 177830.003 .421077874 199530.000 .406480000 223874.833 .391130173 10023504 - 251190.000 .376360000 281840.050 .361074601 316230.000 .346410000 10023504 - 354815.904 .331425930 398110.000 .317090000 446686.413 .302572677 10023504 - 501190.000 .288720000 530887.201 .281665645 578764.710 .271405968 10023504 - 630960.000 .261520000 668346.399 .254789613 728620.337 .245017404 10023504 - 794330.000 .235620000 841396.545 .229235129 917276.701 .219980762 10023504 - 1000000.00 .211100000 1059248.39 .205079835 1154767.43 .196369960 10023504 - 1258900.00 .188030000 1333502.68 .182394137 1453777.29 .174255490 10023504 - 1584900.00 .166480000 1678817.36 .161237528 1830230.67 .153681727 10023504 - 1995300.00 .146480000 2113521.84 .141651452 2304117.08 .134705423 10023504 - 2511900.00 .128100000 2660740.55 .123689947 2900699.89 .117357895 10023504 - 3162300.00 .111350000 3349678.10 .107358178 3651767.18 .101637155 10023504 - 3981100.00 .096221000 4216993.34 .092644768 4403041.58 .090050095 10023504 - 4697616.86 .086293699 5011900.00 .082694000 5308872.01 .079517348 10023504 - 5543092.80 .077215201 5913941.02 .073886345 6309600.00 .070701000 10023504 - 6683463.99 .067903555 6978329.17 .065878353 7445197.25 .062953236 10023504 - 7943300.00 .060158000 8413965.45 .057714630 8785177.56 .055947452 10023504 - 9372927.81 .053397621 10000000.0 .050964000 10592483.9 .048844680 10023504 - 11059771.9 .047313229 11799638.5 .045105611 12589000.0 .043001000 10023504 - 13335026.8 .041175226 13923418.9 .039856950 14855041.8 .037958250 10023504 - 15849000.0 .036150000 16788173.6 .034586740 17528899.1 .033458820 10023504 - 18701714.5 .031835532 19953000.0 .030291000 21135218.4 .028959215 10023504 - 22067627.4 .027998946 23543932.0 .026617914 25119000.0 .025305000 10023504 - 26607405.5 .024176190 27781306.4 .023362752 29639977.3 .022193623 10023504 - 31623000.0 .021083000 33496781.0 .020130354 34974625.9 .019444227 10023504 - 37314539.2 .018458634 39811000.0 .017523000 42169933.4 .016721692 10023504 - 44030415.8 .016144851 46976168.6 .015316685 50119000.0 .014531000 10023504 - 53088720.1 .013859927 55430928.0 .013377041 59139410.2 .012684071 10023504 - 63096000.0 .012027000 66834639.9 .011466121 69783291.7 .011062694 10023504 - 74451972.5 .010484012 79433000.0 .009935600 84139654.5 .009468391 10023504 - 87851775.6 .009132460 93729278.1 .008650777 100000000. .008194500 10023504 - 105924839. .007806214 110597719. .007527121 117996385. .007127080 10023504 - 125890000. .006748300 133350268. .006426332 139234189. .006194978 10023504 - 148550418. .005863469 158490000. .005549700 167881736. .005283213 10023504 - 175288991. .005091779 187017145. .004817555 199530000. .004558100 10023504 - 211352184. .004337988 220676274. .004179908 235439320. .003953524 10023504 - 251190000. .003739400 266074055. .003557822 277813064. .003427449 10023504 - 296399773. .003240792 316230000. .003064300 334967810. .002914784 10023504 - 349746259. .002807454 373145392. .002653823 398110000. .002508600 10023504 - 421699334. .002385653 440304158. .002297414 469761686. .002171137 10023504 - 501190000. .002051800 530887201. .001950811 554309280. .001878344 10023504 - 591394102. .001774660 630960000. .001676700 668346399. .001593831 10023504 - 697832917. .001534379 744519725. .001449333 794330000. .001369000 10023504 - 841396545. .001301086 878517756. .001252372 937292781. .001182698 10023504 - 1.00000E+9 .001116900 1.05926E+9 .001061313 1.10599E+9 .001021446 10023504 - 1.17998E+9 9.64444E-4 1.25890E+9 9.10630E-4 1.33351E+9 8.65154E-4 10023504 - 1.39236E+9 8.32544E-4 1.48552E+9 7.85925E-4 1.58490E+9 7.41920E-4 10023504 - 1.67882E+9 7.04758E-4 1.75290E+9 6.78113E-4 1.87018E+9 6.40025E-4 10023504 - 1.99530E+9 6.04080E-4 2.11353E+9 5.73735E-4 2.20678E+9 5.51981E-4 10023504 - 2.35441E+9 5.20889E-4 2.51190E+9 4.91550E-4 2.66075E+9 4.66790E-4 10023504 - 2.77814E+9 4.49042E-4 2.96401E+9 4.23679E-4 3.16230E+9 3.99750E-4 10023504 - 3.34969E+9 3.79561E-4 3.49748E+9 3.65091E-4 3.73147E+9 3.44415E-4 10023504 - 3.98110E+9 3.24910E-4 4.21700E+9 3.08462E-4 4.40305E+9 2.96675E-4 10023504 - 4.69763E+9 2.79834E-4 5.01190E+9 2.63950E-4 5.30888E+9 2.50557E-4 10023504 - 5.54311E+9 2.40960E-4 5.91395E+9 2.27250E-4 6.30960E+9 2.14320E-4 10023504 - 6.68347E+9 2.03421E-4 6.97834E+9 1.95613E-4 7.44521E+9 1.84458E-4 10023504 - 7.94330E+9 1.73940E-4 8.41397E+9 1.65075E-4 8.78519E+9 1.58724E-4 10023504 - 9.37294E+9 1.49653E-4 1.0000E+10 1.41100E-4 1.0593E+10 1.33886E-4 10023504 - 1.1061E+10 1.28718E-4 1.1801E+10 1.21349E-4 1.2589E+10 1.14410E-4 10023504 - 1.3336E+10 1.08551E-4 1.3925E+10 1.04354E-4 1.4856E+10 9.83680E-5 10023504 - 1.5849E+10 9.27310E-5 1.6789E+10 8.79738E-5 1.7530E+10 8.45668E-5 10023504 - 1.8703E+10 7.97064E-5 1.9953E+10 7.51290E-5 2.1136E+10 7.12686E-5 10023504 - 2.2069E+10 6.85041E-5 2.3545E+10 6.45598E-5 2.5119E+10 6.08450E-5 10023504 - 2.6608E+10 5.77137E-5 2.7783E+10 5.54715E-5 2.9641E+10 5.22722E-5 10023504 - 3.1623E+10 4.92590E-5 3.3498E+10 4.67198E-5 3.4976E+10 4.49016E-5 10023504 - 3.7316E+10 4.23074E-5 3.9811E+10 3.98640E-5 4.2171E+10 3.78060E-5 10023504 - 4.4032E+10 3.63326E-5 4.6977E+10 3.42302E-5 5.0119E+10 3.22500E-5 10023504 - 5.3089E+10 3.05828E-5 5.5432E+10 2.93892E-5 5.9141E+10 2.76860E-5 10023504 - 6.3096E+10 2.60820E-5 6.6835E+10 2.47315E-5 6.9785E+10 2.37647E-5 10023504 - 7.4453E+10 2.23852E-5 7.9433E+10 2.10860E-5 8.4140E+10 1.99927E-5 10023504 - 8.7853E+10 1.92102E-5 9.3730E+10 1.80935E-5 1.0000E+11 1.70420E-5 10023504 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023515 - 0.0 0.0 0 0 1 217 10023515 - 217 2 10023515 - 2044000.00 0.0 2085810.00 1.00423E-8 2087368.08 1.07915E-8 10023515 - 2088878.59 1.15706E-8 2090342.93 1.23790E-8 2091762.49 1.32159E-8 10023515 - 2093138.61 1.40805E-8 2094472.59 1.49721E-8 2095765.69 1.58896E-8 10023515 - 2097019.15 1.68320E-8 2098234.15 1.77982E-8 2099411.85 1.87871E-8 10023515 - 2100553.38 1.97974E-8 2101659.83 2.08280E-8 2102732.25 2.18774E-8 10023515 - 2103771.69 2.29445E-8 2104779.13 2.40279E-8 2106732.42 2.62745E-8 10023515 - 2108565.27 2.85712E-8 2110285.01 3.09064E-8 2111898.55 3.32686E-8 10023515 - 2113412.36 3.56470E-8 2114832.54 3.80308E-8 2116164.83 4.04103E-8 10023515 - 2117414.61 4.27761E-8 2118586.95 4.51197E-8 2119686.61 4.74332E-8 10023515 - 2120718.06 4.97098E-8 2122653.37 5.42771E-8 2124348.21 5.86163E-8 10023515 - 2125832.31 6.26968E-8 2127131.75 6.64996E-8 2128269.40 7.00158E-8 10023515 - 2129265.35 7.32447E-8 2131009.38 7.92575E-8 2132318.34 8.40889E-8 10023515 - 2134283.27 9.18938E-8 2136250.00 1.00423E-7 2139825.37 1.07915E-7 10023515 - 2143294.72 1.15706E-7 2146661.02 1.23790E-7 2149927.16 1.32159E-7 10023515 - 2153095.98 1.40805E-7 2156170.22 1.49721E-7 2159152.58 1.58895E-7 10023515 - 2162045.67 1.68319E-7 2164852.05 1.77981E-7 2167574.21 1.87870E-7 10023515 - 2170214.56 1.97974E-7 2172775.47 2.08279E-7 2175259.23 2.18774E-7 10023515 - 2177668.08 2.29445E-7 2180004.20 2.40278E-7 2184537.55 2.62745E-7 10023515 - 2188796.13 2.85711E-7 2192796.09 3.09063E-7 2196552.68 3.32685E-7 10023515 - 2200080.34 3.56469E-7 2203392.66 3.80307E-7 2206502.50 4.04102E-7 10023515 - 2209421.95 4.27760E-7 2212162.44 4.51195E-7 2214734.75 4.74331E-7 10023515 - 2217148.99 4.97097E-7 2221682.80 5.42769E-7 2225657.48 5.86162E-7 10023515 - 2229141.16 6.26967E-7 2232193.85 6.64994E-7 2234868.39 7.00156E-7 10023515 - 2239556.52 7.66222E-7 2243079.08 8.19831E-7 2245724.63 8.62485E-7 10023515 - 2249698.81 9.30663E-7 2253680.00 1.00423E-6 2260603.04 1.09249E-6 10023515 - 2265809.28 1.16374E-6 2269721.82 1.22021E-6 2275603.29 1.31009E-6 10023515 - 2281500.00 1.40660E-6 2287848.46 1.50584E-6 2292621.40 1.58483E-6 10023515 - 2299799.47 1.71117E-6 2307000.00 1.84757E-6 2314760.76 1.98952E-6 10023515 - 2320598.46 2.10309E-6 2329382.61 2.28572E-6 2338200.00 2.48421E-6 10023515 - 2347938.99 2.69489E-6 2355269.85 2.86455E-6 2366309.06 3.13927E-6 10023515 - 2377400.00 3.44034E-6 2385557.92 3.65350E-6 2397847.31 3.99825E-6 10023515 - 2410200.00 4.37554E-6 2419298.36 4.64685E-6 2433010.33 5.08567E-6 10023515 - 2446800.00 5.56593E-6 2456516.97 5.89588E-6 2471164.82 6.42785E-6 10023515 - 2485900.00 7.00781E-6 2497567.61 7.45361E-6 2515171.77 8.17604E-6 10023515 - 2532900.00 8.96849E-6 2544637.81 9.49022E-6 2556430.00 1.00423E-5 10023515 - 2570186.08 1.06714E-5 2590959.10 1.16896E-5 2611900.00 1.28050E-5 10023515 - 2623941.48 1.34271E-5 2642107.86 1.44173E-5 2660400.00 1.54806E-5 10023515 - 2681375.63 1.66509E-5 2697215.81 1.75863E-5 2721151.70 1.90888E-5 10023515 - 2745300.00 2.07197E-5 2761088.29 2.17357E-5 2784941.12 2.33540E-5 10023515 - 2809000.00 2.50927E-5 2832576.52 2.67331E-5 2868312.84 2.93968E-5 10023515 - 2904500.00 3.23260E-5 2928086.15 3.41684E-5 2963824.97 3.71308E-5 10023515 - 3000000.00 4.03500E-5 3030773.26 4.29979E-5 3077526.03 4.72991E-5 10023515 - 3125000.00 5.20305E-5 3179229.47 5.73941E-5 3234400.00 6.33106E-5 10023515 - 3281223.39 6.82016E-5 3316785.23 7.21163E-5 3370851.95 7.84135E-5 10023515 - 3425800.00 8.52607E-5 3496813.97 9.38901E-5 3569300.00 1.03393E-4 10023515 - 3621972.55 1.10097E-4 3702442.38 1.20976E-4 3784700.00 1.32930E-4 10023515 - 3837413.45 1.40246E-4 3917863.43 1.51982E-4 4000000.00 1.64700E-4 10023515 - 4061086.38 1.73659E-4 4154469.54 1.88020E-4 4250000.00 2.03568E-4 10023515 - 4340798.56 2.17381E-4 4480646.54 2.39879E-4 4625000.00 2.64704E-4 10023515 - 4808846.02 2.94792E-4 5000000.00 3.28300E-4 5120568.45 3.48239E-4 10023515 - 5306894.25 3.80442E-4 5500000.00 4.15622E-4 5744562.65 4.57774E-4 10023515 - 6000000.00 5.04200E-4 6363961.04 5.66404E-4 6750000.00 6.36282E-4 10023515 - 7000000.00 6.79800E-4 7483314.78 7.60285E-4 8000000.00 8.50300E-4 10023515 - 8485281.38 9.28550E-4 9000000.00 .001014000 10000000.0 .001170000 10023515 - 11000000.0 .001318000 12000000.0 .001458000 13000000.0 .001590000 10023515 - 14000000.0 .001716000 15000000.0 .001836000 16000000.0 .001951000 10023515 - 18000000.0 .002164000 20000000.0 .002359000 22000000.0 .002539000 10023515 - 24000000.0 .002706000 26000000.0 .002862000 28000000.0 .003007000 10023515 - 30000000.0 .003143000 34641016.2 .003418891 40000000.0 .003719000 10023515 - 44721359.6 .003939465 50000000.0 .004173000 54772255.8 .004355509 10023515 - 60000000.0 .004546000 69282032.4 .004832003 80000000.0 .005136000 10023515 - 89442719.2 .005359631 100000000. .005593000 110668193. .005787380 10023515 - 128841876. .006091689 150000000. .006412000 173205081. .006688057 10023515 - 200000000. .006976000 244948975. .007343804 300000000. .007731000 10023515 - 346410162. .007973206 400000000. .008223000 500000000. .008575000 10023515 - 600000000. .008841000 692820324. .009029980 800000000. .009223000 10023515 - 1.00000E+9 .009485000 1.22475E+9 .009684408 1.50000E+9 .009888000 10023515 - 2.00000E+9 .010120000 2.44949E+9 .010249177 3.00000E+9 .010380000 10023515 - 4.00000E+9 .010530000 5.00000E+9 .010630000 6.00000E+9 .010700000 10023515 - 8.00000E+9 .010790000 1.0000E+10 .010850000 1.5000E+10 .010930000 10023515 - 2.0000E+10 .010970000 3.0000E+10 .011020000 4.0000E+10 .011050000 10023515 - 5.0000E+10 .011060000 6.0000E+10 .011080000 8.0000E+10 .011090000 10023515 - 1.0000E+11 .011100000 10023515 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023516 - 0.0 0.0 0 0 1 466 10023516 - 466 2 10023516 - 1022000.00 0.0 1025120.00 3.6252E-11 1025233.25 3.8957E-11 10023516 - 1025342.98 4.1769E-11 1025449.29 4.4688E-11 1025552.28 4.7709E-11 10023516 - 1025652.07 5.0831E-11 1025748.75 5.4049E-11 1025842.42 5.7362E-11 10023516 - 1025933.16 6.0764E-11 1026021.08 6.4253E-11 1026106.26 6.7823E-11 10023516 - 1026188.78 7.1470E-11 1026268.74 7.5191E-11 1026346.19 7.8980E-11 10023516 - 1026421.24 8.2833E-11 1026493.94 8.6744E-11 1026634.81 9.4855E-11 10023516 - 1026766.89 1.0315E-10 1026890.73 1.1158E-10 1027006.85 1.2011E-10 10023516 - 1027115.72 1.2869E-10 1027217.79 1.3730E-10 1027313.50 1.4589E-10 10023516 - 1027403.23 1.5443E-10 1027487.36 1.6289E-10 1027566.24 1.7124E-10 10023516 - 1027640.19 1.7946E-10 1027778.86 1.9595E-10 1027900.21 2.1161E-10 10023516 - 1028006.41 2.2634E-10 1028099.34 2.4007E-10 1028180.66 2.5277E-10 10023516 - 1028251.81 2.6442E-10 1028376.35 2.8613E-10 1028469.75 3.0356E-10 10023516 - 1028609.87 3.3174E-10 1028750.00 3.6252E-10 1028995.66 3.8956E-10 10023516 - 1029233.70 4.1769E-10 1029464.35 4.4687E-10 1029687.85 4.7708E-10 10023516 - 1029904.41 5.0830E-10 1030114.24 5.4048E-10 1030317.56 5.7361E-10 10023516 - 1030514.56 6.0763E-10 1030705.44 6.4251E-10 1030890.39 6.7821E-10 10023516 - 1031069.59 7.1468E-10 1031243.22 7.5189E-10 1031411.45 7.8977E-10 10023516 - 1031574.45 8.2830E-10 1031732.39 8.6741E-10 1032038.44 9.4851E-10 10023516 - 1032325.45 1.03142E-9 1032594.59 1.11572E-9 1032846.97 1.20100E-9 10023516 - 1033083.64 1.28686E-9 1033305.56 1.37292E-9 1033513.66 1.45882E-9 10023516 - 1033708.79 1.54422E-9 1033891.76 1.62883E-9 1034063.32 1.71235E-9 10023516 - 1034224.18 1.79453E-9 1034525.86 1.95941E-9 1034789.90 2.11605E-9 10023516 - 1035020.99 2.26336E-9 1035223.24 2.40063E-9 1035400.24 2.52757E-9 10023516 - 1035555.13 2.64412E-9 1035826.25 2.86117E-9 1036029.64 3.03558E-9 10023516 - 1036334.78 3.31731E-9 1036640.00 3.62517E-9 1037180.62 3.89564E-9 10023516 - 1037704.61 4.17689E-9 1038212.48 4.46870E-9 1038704.71 4.77081E-9 10023516 - 1039181.79 5.08295E-9 1039644.16 5.40480E-9 1040092.29 5.73600E-9 10023516 - 1040526.59 6.07621E-9 1040947.49 6.42501E-9 1041355.41 6.78199E-9 10023516 - 1041750.73 7.14672E-9 1042133.83 7.51875E-9 1042505.10 7.89761E-9 10023516 - 1042864.90 8.28282E-9 1043213.57 8.67391E-9 1043889.43 9.48495E-9 10023516 - 1044523.46 1.03140E-8 1045118.20 1.11570E-8 1045676.09 1.20098E-8 10023516 - 1046199.37 1.28683E-8 1046690.19 1.37289E-8 1047150.54 1.45879E-8 10023516 - 1047582.30 1.54419E-8 1047987.24 1.62879E-8 1048367.02 1.71231E-8 10023516 - 1048723.18 1.79450E-8 1049391.30 1.95937E-8 1049976.25 2.11601E-8 10023516 - 1050488.35 2.26332E-8 1050936.65 2.40059E-8 1051329.06 2.52752E-8 10023516 - 1051672.55 2.64408E-8 1052273.90 2.86114E-8 1052725.14 3.03554E-8 10023516 - 1053402.36 3.31728E-8 1054080.00 3.62517E-8 1055296.44 3.89564E-8 10023516 - 1056476.20 4.17688E-8 1057620.35 4.46869E-8 1058729.92 4.77080E-8 10023516 - 1059805.94 5.08293E-8 1060849.37 5.40477E-8 1061861.17 5.73598E-8 10023516 - 1062842.28 6.07618E-8 1063793.59 6.42497E-8 1064715.98 6.78195E-8 10023516 - 1065610.31 7.14667E-8 1066477.41 7.51869E-8 1067318.08 7.89755E-8 10023516 - 1068133.12 8.28275E-8 1068923.28 8.67383E-8 1070455.87 9.48486E-8 10023516 - 1071894.67 1.03139E-7 1073245.29 1.11569E-7 1074513.05 1.20097E-7 10023516 - 1075702.94 1.28682E-7 1076819.65 1.37288E-7 1077867.63 1.45877E-7 10023516 - 1078851.03 1.54418E-7 1079773.78 1.62878E-7 1080639.58 1.71230E-7 10023516 - 1081451.89 1.79448E-7 1082976.62 1.95935E-7 1084312.52 2.11599E-7 10023516 - 1085482.78 2.26330E-7 1086507.80 2.40057E-7 1087405.48 2.52750E-7 10023516 - 1088191.56 2.64406E-7 1089568.56 2.86112E-7 1090602.46 3.03553E-7 10023516 - 1092155.13 3.31727E-7 1093710.00 3.62517E-7 1096143.36 3.91080E-7 10023516 - 1098429.54 4.19897E-7 1100577.18 4.48840E-7 1102594.39 4.77783E-7 10023516 - 1104488.89 5.06609E-7 1106267.94 5.35212E-7 1107938.40 5.63492E-7 10023516 - 1109506.75 5.91360E-7 1112453.38 6.47381E-7 1115038.10 7.00736E-7 10023516 - 1117304.66 7.51016E-7 1119291.67 7.97962E-7 1121033.21 8.41441E-7 10023516 - 1122559.27 8.81425E-7 1125234.88 9.56021E-7 1127245.77 1.01608E-6 10023516 - 1128756.30 1.06359E-6 1131025.87 1.13905E-6 1133300.00 1.21987E-6 10023516 - 1136833.45 1.32238E-6 1139490.76 1.40488E-6 1143488.37 1.53838E-6 10023516 - 1147500.00 1.68456E-6 1150165.70 1.77863E-6 1154175.87 1.92969E-6 10023516 - 1158200.00 2.09357E-6 1162154.71 2.25092E-6 1165129.60 2.37664E-6 10023516 - 1169606.20 2.57851E-6 1174100.00 2.79753E-6 1178082.20 2.98479E-6 10023516 - 1181077.71 3.13341E-6 1185585.26 3.37033E-6 1190110.00 3.62517E-6 10023516 - 1193839.94 3.82842E-6 1199456.76 4.15485E-6 1205100.00 4.50912E-6 10023516 - 1210661.39 4.84917E-6 1214849.27 5.12094E-6 1221158.26 5.55742E-6 10023516 - 1227500.00 6.03109E-6 1233086.75 6.43265E-6 1237293.49 6.75128E-6 10023516 - 1243630.52 7.25904E-6 1250000.00 7.80500E-6 1257752.59 8.44310E-6 10023516 - 1263598.56 8.95568E-6 1272418.50 9.78348E-6 1281300.00 1.06878E-5 10023516 - 1288071.14 1.13517E-5 1298295.00 1.24256E-5 1308600.00 1.36012E-5 10023516 - 1314534.52 1.42638E-5 1323486.78 1.53187E-5 1332500.00 1.64517E-5 10023516 - 1342853.71 1.77155E-5 1350671.75 1.87266E-5 1362484.23 2.03526E-5 10023516 - 1374400.00 2.21197E-5 1382183.64 2.32305E-5 1393941.81 2.50020E-5 10023516 - 1405800.00 2.69087E-5 1417429.89 2.87201E-5 1426215.41 3.01583E-5 10023516 - 1439495.88 3.24516E-5 1452900.00 3.49194E-5 1464534.51 3.69652E-5 10023516 - 1482161.19 4.02607E-5 1500000.00 4.38500E-5 1515386.64 4.68104E-5 10023516 - 1527030.10 4.91611E-5 1544663.25 5.29103E-5 1562500.00 5.69455E-5 10023516 - 1581789.84 6.10418E-5 1596413.35 6.43063E-5 1618602.47 6.95332E-5 10023516 - 1641100.00 7.51850E-5 1673676.67 8.30470E-5 1706900.00 9.17312E-5 10023516 - 1732493.60 9.81169E-5 1771605.32 1.08538E-4 1811600.00 1.20067E-4 10023516 - 1845936.41 1.29281E-4 1872115.14 1.36652E-4 1912080.98 1.48505E-4 10023516 - 1952900.00 1.61386E-4 2000000.00 1.75800E-4 2044000.00 1.89500E-4 10023516 - 2085810.00 2.02396E-4 2087368.08 2.02877E-4 2088878.59 2.03344E-4 10023516 - 2090342.93 2.03796E-4 2091762.49 2.04234E-4 2093138.61 2.04659E-4 10023516 - 2094472.59 2.05071E-4 2095765.69 2.05471E-4 2097019.15 2.05858E-4 10023516 - 2098234.15 2.06233E-4 2099411.85 2.06597E-4 2100553.38 2.06950E-4 10023516 - 2101659.83 2.07292E-4 2102732.25 2.07624E-4 2102901.33 2.07676E-4 10023516 - 2103771.69 2.07963E-4 2104779.13 2.08294E-4 2106732.42 2.08938E-4 10023516 - 2108565.27 2.09542E-4 2110285.01 2.10109E-4 2111898.55 2.10641E-4 10023516 - 2113412.36 2.11140E-4 2114832.54 2.11609E-4 2116164.83 2.12049E-4 10023516 - 2117414.61 2.12461E-4 2118586.95 2.12849E-4 2119686.61 2.13212E-4 10023516 - 2120718.06 2.13553E-4 2122653.37 2.14193E-4 2124348.21 2.14753E-4 10023516 - 2125832.31 2.15245E-4 2127131.75 2.15675E-4 2128269.40 2.16052E-4 10023516 - 2129265.35 2.16382E-4 2131009.38 2.16961E-4 2132318.34 2.17395E-4 10023516 - 2134283.27 2.18048E-4 2136250.00 2.18702E-4 2139825.37 2.19884E-4 10023516 - 2143294.72 2.21030E-4 2146661.02 2.22144E-4 2149927.16 2.23224E-4 10023516 - 2153095.98 2.24273E-4 2156170.22 2.25291E-4 2159152.58 2.26280E-4 10023516 - 2162045.67 2.27239E-4 2163500.00 2.27721E-4 2164852.05 2.28141E-4 10023516 - 2167574.21 2.28985E-4 2170214.56 2.29805E-4 2172775.47 2.30601E-4 10023516 - 2175259.23 2.31373E-4 2177668.08 2.32123E-4 2180004.20 2.32850E-4 10023516 - 2184537.55 2.34263E-4 2188796.13 2.35592E-4 2192796.09 2.36842E-4 10023516 - 2196552.68 2.38018E-4 2200080.34 2.39123E-4 2203392.66 2.40163E-4 10023516 - 2206502.50 2.41141E-4 2209421.95 2.42060E-4 2212162.44 2.42924E-4 10023516 - 2213980.58 2.43498E-4 2214734.75 2.43748E-4 2217148.99 2.44552E-4 10023516 - 2221682.80 2.46065E-4 2225657.48 2.47395E-4 2229141.16 2.48563E-4 10023516 - 2232193.85 2.49589E-4 2234868.39 2.50489E-4 2239556.52 2.52072E-4 10023516 - 2243079.08 2.53266E-4 2245724.63 2.54165E-4 2249698.81 2.55519E-4 10023516 - 2253680.00 2.56881E-4 2260603.04 2.59209E-4 2265809.28 2.60965E-4 10023516 - 2269721.82 2.62288E-4 2275603.29 2.64281E-4 2281500.00 2.66285E-4 10023516 - 2287848.46 2.68439E-4 2291918.49 2.69823E-4 2292621.40 2.70077E-4 10023516 - 2299799.47 2.72680E-4 2307000.00 2.75301E-4 2314760.76 2.78121E-4 10023516 - 2320598.46 2.80249E-4 2329382.61 2.83462E-4 2338200.00 2.86703E-4 10023516 - 2347938.99 2.90274E-4 2355269.85 2.92973E-4 2366309.06 2.97057E-4 10023516 - 2372600.00 2.99398E-4 2377400.00 3.01032E-4 2385557.92 3.03800E-4 10023516 - 2397847.31 3.07994E-4 2410200.00 3.12240E-4 2419298.36 3.15361E-4 10023516 - 2433010.33 3.20094E-4 2438433.87 3.21982E-4 2446800.00 3.25028E-4 10023516 - 2456516.97 3.28558E-4 2471164.82 3.33913E-4 2485900.00 3.39345E-4 10023516 - 2497567.61 3.43633E-4 2515171.77 3.50152E-4 2532900.00 3.56783E-4 10023516 - 2540625.58 3.59670E-4 2544637.81 3.61251E-4 2556430.00 3.65926E-4 10023516 - 2570186.08 3.71364E-4 2590959.10 3.79645E-4 2611900.00 3.88082E-4 10023516 - 2623941.48 3.92914E-4 2642107.86 4.00256E-4 2647100.00 4.02291E-4 10023516 - 2660400.00 4.07249E-4 2681375.63 4.15018E-4 2697215.81 4.20937E-4 10023516 - 2721151.70 4.29970E-4 2731228.75 4.33820E-4 2745300.00 4.39395E-4 10023516 - 2761088.29 4.45600E-4 2784941.12 4.55057E-4 2809000.00 4.64703E-4 10023516 - 2832576.52 4.74092E-4 2862461.58 4.86141E-4 2868312.84 4.88603E-4 10023516 - 2904500.00 5.04061E-4 2928086.15 5.14070E-4 2963824.97 5.29406E-4 10023516 - 3000000.00 5.45150E-4 3030773.26 5.57486E-4 3077526.03 5.76505E-4 10023516 - 3125000.00 5.96182E-4 3179229.47 6.18617E-4 3211308.15 6.32156E-4 10023516 - 3234400.00 6.42319E-4 3281223.39 6.62795E-4 3316785.23 6.78547E-4 10023516 - 3370851.95 7.02840E-4 3425800.00 7.27977E-4 3437500.00 7.33293E-4 10023516 - 3496813.97 7.58396E-4 3569300.00 7.89769E-4 3621972.55 8.12364E-4 10023516 - 3702442.38 8.47521E-4 3708099.25 8.50050E-4 3784700.00 8.85311E-4 10023516 - 3837413.45 9.09232E-4 3917863.43 9.46309E-4 4000000.00 9.84900E-4 10023516 - 4061086.38 .001011029 4154469.54 .001051639 4250000.00 .001094039 10023516 - 4340798.56 .001133374 4358898.95 .001141374 4480646.54 .001196226 10023516 - 4625000.00 .001262866 4750000.00 .001319531 4808846.02 .001345081 10023516 - 5000000.00 .001430300 5120568.45 .001480743 5306894.25 .001560086 10023516 - 5500000.00 .001644122 5744562.65 .001748148 6000000.00 .001859200 10023516 - 6363961.04 .002003295 6750000.00 .002160032 7000000.00 .002259800 10023516 - 7483314.78 .002438881 8000000.00 .002634300 8485281.38 .002802812 10023516 - 9000000.00 .002984000 10000000.0 .003308000 11000000.0 .003610000 10023516 - 12000000.0 .003891000 13000000.0 .004155000 14000000.0 .004404000 10023516 - 15000000.0 .004639000 16000000.0 .004863000 18000000.0 .005276000 10023516 - 20000000.0 .005651000 22000000.0 .005996000 24000000.0 .006314000 10023516 - 26000000.0 .006609000 28000000.0 .006884000 30000000.0 .007141000 10023516 - 34641016.2 .007663298 40000000.0 .008225000 44721359.6 .008639296 10023516 - 50000000.0 .009075000 54772255.8 .009411653 60000000.0 .009771000 10023516 - 69282032.4 .010304158 80000000.0 .010867000 89442719.2 .011280002 10023516 - 100000000. .011709000 110668193. .012057139 122474488. .012424992 10023516 - 128841876. .012610511 150000000. .013193000 173205081. .013682207 10023516 - 200000000. .014190000 244948975. .014822450 300000000. .015484000 10023516 - 346410162. .015887528 400000000. .016302000 500000000. .016875000 10023516 - 600000000. .017302000 692820324. .017592618 800000000. .017903000 10023516 - 1.00000E+9 .018309000 1.22475E+9 .018613287 1.50000E+9 .018923000 10023516 - 2.00000E+9 .019273000 2.44949E+9 .019457914 3.00000E+9 .019657000 10023516 - 4.00000E+9 .019883000 5.00000E+9 .020027000 6.00000E+9 .020128000 10023516 - 8.00000E+9 .020259000 1.0000E+10 .020345000 1.5000E+10 .020459000 10023516 - 2.0000E+10 .020519000 3.0000E+10 .020587000 4.0000E+10 .020631000 10023516 - 5.0000E+10 .020648000 6.0000E+10 .020672000 8.0000E+10 .020687000 10023516 - 1.0000E+11 .020701000 10023516 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023517 - 0.0 0.0 0 0 1 308 10023517 - 308 2 10023517 - 1022000.00 0.0 1025120.00 3.6252E-11 1025233.25 3.8957E-11 10023517 - 1025342.98 4.1769E-11 1025449.29 4.4688E-11 1025552.28 4.7709E-11 10023517 - 1025652.07 5.0831E-11 1025748.75 5.4049E-11 1025842.42 5.7362E-11 10023517 - 1025933.16 6.0764E-11 1026021.08 6.4253E-11 1026106.26 6.7823E-11 10023517 - 1026188.78 7.1470E-11 1026268.74 7.5191E-11 1026346.19 7.8980E-11 10023517 - 1026421.24 8.2833E-11 1026493.94 8.6744E-11 1026634.81 9.4855E-11 10023517 - 1026766.89 1.0315E-10 1026890.73 1.1158E-10 1027006.85 1.2011E-10 10023517 - 1027115.72 1.2869E-10 1027217.79 1.3730E-10 1027313.50 1.4589E-10 10023517 - 1027403.23 1.5443E-10 1027487.36 1.6289E-10 1027566.24 1.7124E-10 10023517 - 1027640.19 1.7946E-10 1027778.86 1.9595E-10 1027900.21 2.1161E-10 10023517 - 1028006.41 2.2634E-10 1028099.34 2.4007E-10 1028180.66 2.5277E-10 10023517 - 1028251.81 2.6442E-10 1028376.35 2.8613E-10 1028469.75 3.0356E-10 10023517 - 1028609.87 3.3174E-10 1028750.00 3.6252E-10 1028995.66 3.8956E-10 10023517 - 1029233.70 4.1769E-10 1029464.35 4.4687E-10 1029687.85 4.7708E-10 10023517 - 1029904.41 5.0830E-10 1030114.24 5.4048E-10 1030317.56 5.7361E-10 10023517 - 1030514.56 6.0763E-10 1030705.44 6.4251E-10 1030890.39 6.7821E-10 10023517 - 1031069.59 7.1468E-10 1031243.22 7.5189E-10 1031411.45 7.8977E-10 10023517 - 1031574.45 8.2830E-10 1031732.39 8.6741E-10 1032038.44 9.4851E-10 10023517 - 1032325.45 1.03142E-9 1032594.59 1.11572E-9 1032846.97 1.20100E-9 10023517 - 1033083.64 1.28686E-9 1033305.56 1.37292E-9 1033513.66 1.45882E-9 10023517 - 1033708.79 1.54422E-9 1033891.76 1.62883E-9 1034063.32 1.71235E-9 10023517 - 1034224.18 1.79453E-9 1034525.86 1.95941E-9 1034789.90 2.11605E-9 10023517 - 1035020.99 2.26336E-9 1035223.24 2.40063E-9 1035400.24 2.52757E-9 10023517 - 1035555.13 2.64412E-9 1035826.25 2.86117E-9 1036029.64 3.03558E-9 10023517 - 1036334.78 3.31731E-9 1036640.00 3.62517E-9 1037180.62 3.89564E-9 10023517 - 1037704.61 4.17689E-9 1038212.48 4.46870E-9 1038704.71 4.77081E-9 10023517 - 1039181.79 5.08295E-9 1039644.16 5.40480E-9 1040092.29 5.73600E-9 10023517 - 1040526.59 6.07621E-9 1040947.49 6.42501E-9 1041355.41 6.78199E-9 10023517 - 1041750.73 7.14672E-9 1042133.83 7.51875E-9 1042505.10 7.89761E-9 10023517 - 1042864.90 8.28282E-9 1043213.57 8.67391E-9 1043889.43 9.48495E-9 10023517 - 1044523.46 1.03140E-8 1045118.20 1.11570E-8 1045676.09 1.20098E-8 10023517 - 1046199.37 1.28683E-8 1046690.19 1.37289E-8 1047150.54 1.45879E-8 10023517 - 1047582.30 1.54419E-8 1047987.24 1.62879E-8 1048367.02 1.71231E-8 10023517 - 1048723.18 1.79450E-8 1049391.30 1.95937E-8 1049976.25 2.11601E-8 10023517 - 1050488.35 2.26332E-8 1050936.65 2.40059E-8 1051329.06 2.52752E-8 10023517 - 1051672.55 2.64408E-8 1052273.90 2.86114E-8 1052725.14 3.03554E-8 10023517 - 1053402.36 3.31728E-8 1054080.00 3.62517E-8 1055296.44 3.89564E-8 10023517 - 1056476.20 4.17688E-8 1057620.35 4.46869E-8 1058729.92 4.77080E-8 10023517 - 1059805.94 5.08293E-8 1060849.37 5.40477E-8 1061861.17 5.73598E-8 10023517 - 1062842.28 6.07618E-8 1063793.59 6.42497E-8 1064715.98 6.78195E-8 10023517 - 1065610.31 7.14667E-8 1066477.41 7.51869E-8 1067318.08 7.89755E-8 10023517 - 1068133.12 8.28275E-8 1068923.28 8.67383E-8 1070455.87 9.48486E-8 10023517 - 1071894.67 1.03139E-7 1073245.29 1.11569E-7 1074513.05 1.20097E-7 10023517 - 1075702.94 1.28682E-7 1076819.65 1.37288E-7 1077867.63 1.45877E-7 10023517 - 1078851.03 1.54418E-7 1079773.78 1.62878E-7 1080639.58 1.71230E-7 10023517 - 1081451.89 1.79448E-7 1082976.62 1.95935E-7 1084312.52 2.11599E-7 10023517 - 1085482.78 2.26330E-7 1086507.80 2.40057E-7 1087405.48 2.52750E-7 10023517 - 1088191.56 2.64406E-7 1089568.56 2.86112E-7 1090602.46 3.03553E-7 10023517 - 1092155.13 3.31727E-7 1093710.00 3.62517E-7 1096143.36 3.91080E-7 10023517 - 1098429.54 4.19897E-7 1100577.18 4.48840E-7 1102594.39 4.77783E-7 10023517 - 1104488.89 5.06609E-7 1106267.94 5.35212E-7 1107938.40 5.63492E-7 10023517 - 1109506.75 5.91360E-7 1112453.38 6.47381E-7 1115038.10 7.00736E-7 10023517 - 1117304.66 7.51016E-7 1119291.67 7.97962E-7 1121033.21 8.41441E-7 10023517 - 1122559.27 8.81425E-7 1125234.88 9.56021E-7 1127245.77 1.01608E-6 10023517 - 1128756.30 1.06359E-6 1131025.87 1.13905E-6 1133300.00 1.21987E-6 10023517 - 1136833.45 1.32238E-6 1139490.76 1.40488E-6 1143488.37 1.53838E-6 10023517 - 1147500.00 1.68456E-6 1150165.70 1.77863E-6 1154175.87 1.92969E-6 10023517 - 1158200.00 2.09357E-6 1162154.71 2.25092E-6 1165129.60 2.37664E-6 10023517 - 1169606.20 2.57851E-6 1174100.00 2.79753E-6 1178082.20 2.98479E-6 10023517 - 1181077.71 3.13341E-6 1185585.26 3.37033E-6 1190110.00 3.62517E-6 10023517 - 1193839.94 3.82842E-6 1199456.76 4.15485E-6 1205100.00 4.50912E-6 10023517 - 1210661.39 4.84917E-6 1214849.27 5.12094E-6 1221158.26 5.55742E-6 10023517 - 1227500.00 6.03109E-6 1233086.75 6.43265E-6 1237293.49 6.75128E-6 10023517 - 1243630.52 7.25904E-6 1250000.00 7.80500E-6 1257752.59 8.44310E-6 10023517 - 1263598.56 8.95568E-6 1272418.50 9.78348E-6 1281300.00 1.06878E-5 10023517 - 1288071.14 1.13517E-5 1298295.00 1.24256E-5 1308600.00 1.36012E-5 10023517 - 1314534.52 1.42638E-5 1323486.78 1.53187E-5 1332500.00 1.64517E-5 10023517 - 1342853.71 1.77155E-5 1350671.75 1.87266E-5 1362484.23 2.03526E-5 10023517 - 1374400.00 2.21197E-5 1382183.64 2.32305E-5 1393941.81 2.50020E-5 10023517 - 1405800.00 2.69087E-5 1417429.89 2.87201E-5 1426215.41 3.01583E-5 10023517 - 1439495.88 3.24516E-5 1452900.00 3.49194E-5 1464534.51 3.69652E-5 10023517 - 1482161.19 4.02607E-5 1500000.00 4.38500E-5 1515386.64 4.68104E-5 10023517 - 1527030.10 4.91611E-5 1544663.25 5.29103E-5 1562500.00 5.69455E-5 10023517 - 1581789.84 6.10418E-5 1596413.35 6.43063E-5 1618602.47 6.95332E-5 10023517 - 1641100.00 7.51850E-5 1673676.67 8.30470E-5 1706900.00 9.17312E-5 10023517 - 1732493.60 9.81169E-5 1771605.32 1.08538E-4 1811600.00 1.20067E-4 10023517 - 1845936.41 1.29281E-4 1872115.14 1.36652E-4 1912080.98 1.48505E-4 10023517 - 1952900.00 1.61386E-4 2000000.00 1.75800E-4 2044000.00 1.89500E-4 10023517 - 2102901.33 2.07654E-4 2163500.00 2.27548E-4 2213980.58 2.43030E-4 10023517 - 2291918.49 2.68250E-4 2372600.00 2.96088E-4 2438433.87 3.16707E-4 10023517 - 2540625.58 3.50358E-4 2647100.00 3.87584E-4 2731228.75 4.14051E-4 10023517 - 2862461.58 4.57180E-4 3000000.00 5.04800E-4 3211308.15 5.71322E-4 10023517 - 3437500.00 6.46611E-4 3708099.25 7.28252E-4 4000000.00 8.20200E-4 10023517 - 4358898.95 9.21081E-4 4750000.00 .001034370 5000000.00 .001102000 10023517 - 6000000.00 .001355000 7000000.00 .001580000 8000000.00 .001784000 10023517 - 9000000.00 .001970000 10000000.0 .002138000 11000000.0 .002292000 10023517 - 12000000.0 .002433000 13000000.0 .002565000 14000000.0 .002688000 10023517 - 15000000.0 .002803000 16000000.0 .002912000 18000000.0 .003112000 10023517 - 20000000.0 .003292000 22000000.0 .003457000 24000000.0 .003608000 10023517 - 26000000.0 .003747000 28000000.0 .003877000 30000000.0 .003998000 10023517 - 34641016.2 .004244407 40000000.0 .004506000 44721359.6 .004699831 10023517 - 50000000.0 .004902000 60000000.0 .005225000 69282032.4 .005472155 10023517 - 80000000.0 .005731000 89442719.2 .005920371 100000000. .006116000 10023517 - 122474488. .006439922 150000000. .006781000 173205081. .006994150 10023517 - 200000000. .007214000 244948975. .007478646 300000000. .007753000 10023517 - 346410162. .007914322 400000000. .008079000 500000000. .008300000 10023517 - 600000000. .008461000 800000000. .008680000 1.00000E+9 .008824000 10023517 - 1.22475E+9 .008928879 1.50000E+9 .009035000 2.00000E+9 .009153000 10023517 - 3.00000E+9 .009277000 4.00000E+9 .009353000 5.00000E+9 .009397000 10023517 - 6.00000E+9 .009428000 8.00000E+9 .009469000 1.0000E+10 .009495000 10023517 - 1.5000E+10 .009529000 2.0000E+10 .009549000 3.0000E+10 .009567000 10023517 - 4.0000E+10 .009581000 5.0000E+10 .009588000 6.0000E+10 .009592000 10023517 - 8.0000E+10 .009597000 1.0000E+11 .009601000 10023517 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023522 - 0.0 0.0 0 0 1 904 10023522 - 904 2 10023522 - 13.6000000 6318358.25 13.6100000 6305834.00 13.9717518 5874735.37 10023522 - 14.2961635 5521770.62 14.5861968 5230366.94 14.8447987 4988031.99 10023522 - 15.0748336 4785217.34 15.4860050 4449932.70 15.8017267 4213978.09 10023522 - 16.0427351 4045259.60 16.4111572 3804762.82 16.7880400 3578564.00 10023522 - 17.1594652 3369752.37 17.4911970 3197061.83 17.7867189 3053233.04 10023522 - 18.0493935 2932700.80 18.5184426 2733105.64 18.8782114 2592375.54 10023522 - 19.1526175 2491604.11 19.5717233 2347743.94 20.0000000 2212190.00 10023522 - 20.4303711 2084478.71 20.8145359 1978794.18 21.1566011 1890725.09 10023522 - 21.4605165 1816886.02 22.0029110 1694538.55 22.4186843 1608215.64 10023522 - 22.7356621 1546371.73 23.2195517 1458036.31 23.7137400 1374747.00 10023522 - 24.2312071 1293141.39 24.6932454 1225720.19 25.1047501 1169616.54 10023522 - 25.4704383 1122636.47 26.1232567 1044916.35 26.6238276 990178.078 10023522 - 27.0055404 951014.514 27.5883954 895154.308 28.1838300 842575.200 10023522 - 28.8403162 788588.031 29.4272734 744194.578 29.9506519 707405.256 10023522 - 30.4162383 676709.604 30.8295597 650945.518 31.5664328 608196.157 10023522 - 32.1306229 577986.833 32.9958713 535462.866 33.8844200 496067.500 10023522 - 34.7236242 461908.529 35.4749601 433954.591 36.1457029 410886.199 10023522 - 36.7429980 391709.553 37.2737222 375665.616 38.2210020 349153.737 10023522 - 38.9472275 330505.074 39.5009378 317175.190 40.3462982 298181.591 10023522 - 41.2097500 280325.400 42.2303791 260771.031 43.1441438 244783.211 10023522 - 43.9598923 231600.037 44.6863147 220648.509 45.3317745 211491.575 10023522 - 46.4838438 196371.839 47.3670696 185745.717 48.0404849 178155.203 10023522 - 49.0686011 167347.052 50.1187200 157194.600 51.3599953 146101.888 10023522 - 52.4713037 137039.813 53.4634061 129572.792 54.3468712 123373.674 10023522 - 55.1318707 118193.228 56.5330020 109645.361 57.6071695 103642.651 10023522 - 58.4261681 99357.2818 59.6765494 93259.1573 60.9536900 87535.3100 10023522 - 61.7488440 84167.7995 63.2678223 78198.9705 64.6275487 73324.5177 10023522 - 65.8412598 69309.2776 66.9219402 65976.7259 67.8820762 63192.4545 10023522 - 69.5955793 58599.7197 70.9090320 55375.5783 71.9103635 53074.4285 10023522 - 73.4389356 49800.7526 75.0000000 46729.0000 75.9770513 44914.1373 10023522 - 77.8434595 41699.0961 79.5141392 39075.2957 81.0053710 36915.2617 10023522 - 82.3331226 35123.4097 83.5127457 33627.0328 85.6178996 31160.1354 10023522 - 87.2315168 29429.4691 88.4616560 28194.8473 90.3394675 26439.3471 10023522 - 92.2571400 24793.1500 93.5944287 23713.3929 94.8657365 22743.8673 10023522 - 96.0732662 21870.9685 98.3789666 20323.5680 100.441802 19059.6708 10023522 - 102.282234 18018.4076 103.920254 17154.0745 105.375027 16431.8634 10023522 - 107.970053 15240.3870 109.958175 14403.8265 111.473255 13806.6812 10023522 - 113.785105 12957.0588 116.144900 12159.7200 117.913256 11598.2709 10023522 - 119.595534 11095.4793 121.194462 10643.9258 122.712865 10237.2986 10023522 - 125.611333 9516.27554 128.203597 8927.16251 130.515674 8441.68357 10023522 - 132.572921 8038.59676 134.399596 7701.71639 137.657046 7145.79033 10023522 - 140.151841 6755.34182 142.052565 6476.57091 144.952091 6079.83548 10023522 - 147.910800 5707.40300 150.162813 5441.20199 152.305205 5202.92587 10023522 - 154.341450 4989.02728 156.275147 4796.49067 159.966365 4455.28610 10023522 - 163.267631 4176.70299 166.212078 3947.27005 168.831997 3756.87876 10023522 - 171.158279 3597.83488 175.306666 3335.53743 178.483807 3151.44160 10023522 - 180.904392 3020.06886 184.596961 2833.20649 188.364900 2657.90600 10023522 - 191.370496 2526.93158 194.231783 2410.01077 196.953081 2305.31560 10023522 - 199.538915 2211.29830 201.993959 2126.64239 206.678872 1976.55021 10023522 - 210.867220 1853.93525 214.601591 1752.90320 217.923377 1669.02709 10023522 - 220.872091 1598.93443 226.128670 1483.28083 230.153042 1402.06429 10023522 - 233.218252 1344.08377 237.892780 1261.57757 242.661000 1184.13600 10023522 - 246.710418 1122.65353 250.568097 1067.91613 254.239437 1019.02617 10023522 - 257.730158 975.226547 261.046225 935.875722 267.379279 866.322185 10023522 - 273.046608 809.716584 278.103974 763.229121 282.605951 724.747279 10023522 - 286.604924 692.670668 290.150417 665.770389 296.460892 621.184223 10023522 - 301.283655 589.715270 308.665301 545.475580 316.227800 504.554700 10023522 - 321.736287 477.010587 326.987609 452.555184 331.988540 430.768165 10023522 - 336.746353 411.296395 341.268711 393.841747 345.563564 378.151361 10023522 - 353.762631 350.397113 361.096238 327.788350 367.637747 309.205624 10023522 - 373.458705 293.811995 378.627599 280.972549 387.845901 259.838824 10023522 - 394.906616 245.038404 400.286379 234.494003 408.493749 219.522036 10023522 - 416.869400 205.506000 424.436299 193.736578 431.654964 183.315651 10023522 - 438.533925 174.055689 445.082480 165.799745 451.310535 158.415808 10023522 - 457.228463 151.792306 462.846977 145.834507 473.568446 135.286687 10023522 - 483.153264 126.685083 491.698981 119.608514 499.300383 113.741548 10023522 - 506.047947 108.844514 518.076340 100.776557 527.284893 95.1205257 10023522 - 534.298562 91.0878156 544.994375 85.3570423 555.904300 79.9868200 10023522 - 566.402331 75.1913948 576.424216 70.9571223 585.980723 67.2043069 10023522 - 595.083792 63.8665048 603.746310 60.8880323 611.981909 58.2219913 10023522 - 619.804782 55.8286950 627.229521 53.6744059 641.391469 49.8566469 10023522 - 654.045228 46.7395374 665.321884 44.1723582 675.348334 42.0420117 10023522 - 684.245348 40.2624111 700.098084 37.3274472 712.228201 35.2674998 10023522 - 721.463515 33.7974909 735.541506 31.7065612 749.894200 29.7449900 10023522 - 765.156005 27.8151013 779.745923 26.1197062 793.676533 24.6242466 10023522 - 806.962428 23.3001088 819.619870 22.1234707 831.666474 21.0743949 10023522 - 843.120921 20.1361112 854.002703 19.2944458 864.331894 18.5373638 10023522 - 884.037043 17.1969862 901.647218 16.1039038 917.343647 15.2046048 10023522 - 931.302014 14.4590118 943.689702 13.8366722 965.765962 12.8113376 10023522 - 982.661416 12.0925138 995.526699 11.5799898 1015.14113 10.8516444 10023522 - 1035.14200 10.1691100 1057.73027 9.45914318 1079.35424 8.83863297 10023522 - 1100.02803 8.29392435 1119.76920 7.81378764 1138.59818 7.38893409 10023522 - 1156.53780 7.01163774 1173.61281 6.67543839 1189.84952 6.37490687 10023522 - 1205.27538 6.10545829 1219.91871 5.86320281 1247.85616 5.43458197 10023522 - 1272.82577 5.08532211 1295.08369 4.79818236 1314.87843 4.56026676 10023522 - 1332.44686 4.36178806 1363.75832 4.03500999 1387.72384 3.80609527 10023522 - 1405.97396 3.64297286 1433.80012 3.41130357 1462.17700 3.19436700 10023522 - 1496.23550 2.95553057 1528.88549 2.74786527 1560.14163 2.56645064 10023522 - 1590.02435 2.40726724 1618.55903 2.26701155 1645.77519 2.14295263 10023522 - 1671.70582 2.03282026 1696.38673 1.93471720 1719.85591 1.84704976 10023522 - 1742.15307 1.76847278 1763.31913 1.69784554 1803.70104 1.57293330 10023522 - 1839.79310 1.47119731 1871.96560 1.38759095 1900.57771 1.31834228 10023522 - 1925.97182 1.26059058 1971.23066 1.16554584 2005.87139 1.09899529 10023522 - 2032.25085 1.05158816 2072.47191 .984284114 2113.48900 .921287700 10023522 - 2140.27089 .882724673 2166.53945 .846906706 2192.29452 .813594596 10023522 - 2243.06945 .752735242 2291.73847 .699820735 2338.32431 .653596667 10023522 - 2382.85822 .613038376 2425.37876 .577303753 2465.93061 .545696672 10023522 - 2504.56353 .517638472 2541.33141 .492645574 2576.29136 .470311797 10023522 - 2609.50297 .450294304 2641.02758 .432302377 2701.16633 .400482527 10023522 - 2754.91002 .374567445 2802.81219 .353271154 2845.40936 .335632538 10023522 - 2883.21261 .320922711 2950.58081 .296714759 3002.13798 .279764866 10023522 - 3041.39620 .267690950 3101.24819 .250550036 3162.27800 .234506700 10023522 - 3215.04863 .221627239 3267.00980 .209825201 3318.14788 .198991639 10023522 - 3368.45110 .189030322 3417.90945 .179856070 3466.51463 .171393333 10023522 - 3514.25993 .163574969 3561.14021 .156341196 3607.15177 .149638680 10023522 - 3652.29231 .143419757 3696.56083 .137641750 3739.95757 .132266382 10023522 - 3825.49386 .122441701 3907.46001 .113894891 3985.89757 .106424887 10023522 - 4060.86219 .099867337 4132.42150 .094087077 4200.65317 .088972301 10023522 - 4265.64319 .084430016 4327.48422 .080382459 4386.27418 .076764280 10023522 - 4442.11493 .073520289 4495.11110 .070603662 4596.18898 .065443237 10023522 - 4686.49485 .061238229 4766.96680 .057781092 4838.51244 .054916579 10023522 - 4901.99519 .052526866 5015.10075 .048592362 5101.63928 .045836126 10023522 - 5167.52174 .043872040 5267.94410 .041082581 5370.31800 .038470480 10023522 - 5454.04547 .036483038 5536.40107 .034655669 5617.36876 .032972735 10023522 - 5696.93522 .031420368 5775.08981 .029986242 5851.82437 .028659385 10023522 - 5927.13312 .027430006 6001.01257 .026289358 6073.46133 .025229607 10023522 - 6144.48005 .024243729 6284.45063 .022441879 6418.56750 .020874462 10023522 - 6546.90037 .019504580 6669.54182 .018302075 6786.60389 .017242146 10023522 - 6898.21493 .016304281 7004.51675 .015471416 7105.66197 .014729286 10023522 - 7201.81168 .014065903 7293.13331 .013471142 7379.79875 .012936414 10023522 - 7545.08186 .011990345 7692.73840 .011219468 7824.30633 .010585717 10023522 - 7941.27283 .010060621 8045.05198 .009622573 8229.93954 .008901383 10023522 - 8371.38831 .008396189 8479.06802 .008036200 8643.19013 .007524948 10023522 - 8810.48900 .007046222 8989.79966 .006573880 9166.98617 .006146515 10023522 - 9341.96523 .005759017 9514.66063 .005406940 9685.00307 .005086405 10023522 - 9852.92999 .004794018 10018.3853 .004526806 10181.3193 .004282156 10023522 - 10341.6881 .004057767 10499.4538 .003851609 10654.5841 .003661887 10023522 - 10807.0519 .003487011 10956.8355 .003325567 11103.9177 .003176300 10023522 - 11248.2861 .003038089 11389.9327 .002909935 11528.8537 .002790944 10023522 - 11665.0489 .002680312 11933.5225 .002478289 12190.8256 .002302744 10023522 - 12437.0835 .002149481 12672.4663 .002015073 12897.1819 .001896710 10023522 - 13111.4705 .001792066 13315.5985 .001699212 13509.8539 .001616535 10023522 - 13694.5412 .001542684 13869.9780 .001476515 14036.4906 .001417061 10023522 - 14354.1085 .001311962 14637.9142 .001226415 14890.8435 .001156150 10023522 - 15115.7392 .001097978 15315.3074 .001049484 15492.0898 .001008812 10023522 - 15806.3831 9.41392E-4 16046.2805 8.93801E-4 16412.9705 8.26886E-4 10023522 - 16788.0400 7.64982E-4 17154.3788 7.10057E-4 17516.8910 6.60613E-4 10023522 - 17875.3785 6.15999E-4 18229.6580 5.75655E-4 18579.5608 5.39093E-4 10023522 - 18924.9324 5.05889E-4 19265.6321 4.75675E-4 19601.5330 4.48126E-4 10023522 - 19932.5207 4.22961E-4 20258.4939 3.99931E-4 20579.3632 3.78817E-4 10023522 - 20895.0509 3.59426E-4 21205.4907 3.41589E-4 21510.6269 3.25153E-4 10023522 - 21810.4140 3.09986E-4 22104.8164 2.95967E-4 22393.8078 2.82992E-4 10023522 - 22677.3707 2.70964E-4 22955.4958 2.59801E-4 23228.1819 2.49424E-4 10023522 - 23495.4352 2.39768E-4 24022.0199 2.22109E-4 24526.4068 2.06737E-4 10023522 - 25008.8836 1.93294E-4 25469.8219 1.81486E-4 25909.6644 1.71072E-4 10023522 - 26328.9127 1.61852E-4 26728.1171 1.53660E-4 27107.8666 1.46357E-4 10023522 - 27468.7806 1.39826E-4 27811.5003 1.33968E-4 28136.6825 1.28699E-4 10023522 - 28756.6819 1.19373E-4 29310.3781 1.11768E-4 29803.6009 1.05512E-4 10023522 - 30241.9744 1.00327E-4 30630.8373 9.59986E-5 31323.4175 8.88689E-5 10023522 - 31853.1101 8.38714E-5 32256.2496 8.03085E-5 32870.5454 7.52460E-5 10023522 - 33496.5400 7.05026E-5 34129.1091 6.60991E-5 34753.2999 6.20957E-5 10023522 - 35368.8691 5.84488E-5 35975.5973 5.51202E-5 36573.2886 5.20765E-5 10023522 - 37161.7698 4.92883E-5 37740.8892 4.67297E-5 38310.5159 4.43777E-5 10023522 - 38870.5391 4.22122E-5 39420.8671 4.02152E-5 39961.4263 3.83707E-5 10023522 - 40492.1606 3.66646E-5 41013.0304 3.50842E-5 41524.0115 3.36181E-5 10023522 - 42025.0947 3.22563E-5 42516.2845 3.09897E-5 43484.3617 2.86755E-5 10023522 - 44411.9438 2.66631E-5 45299.5144 2.49049E-5 46147.7149 2.33621E-5 10023522 - 46957.3213 2.20026E-5 47729.2223 2.08000E-5 48464.3996 1.97323E-5 10023522 - 49163.9095 1.87812E-5 49828.8668 1.79312E-5 50460.4301 1.71693E-5 10023522 - 51059.7889 1.64845E-5 52202.8410 1.52732E-5 53223.9831 1.42865E-5 10023522 - 54133.8546 1.34756E-5 54942.7425 1.28039E-5 55660.4282 1.22437E-5 10023522 - 56939.0095 1.13217E-5 57917.1833 1.06760E-5 58661.8257 1.02161E-5 10023522 - 59796.7787 9.56299E-6 60953.6900 8.95168E-6 61770.5193 8.55244E-6 10023522 - 62572.2597 8.18266E-6 63358.8677 7.83969E-6 64130.3229 7.52115E-6 10023522 - 64886.6264 7.22492E-6 66377.4395 6.68376E-6 67806.1702 6.21329E-6 10023522 - 69173.5222 5.80235E-6 70480.4466 5.44181E-6 71728.1050 5.12418E-6 10023522 - 72917.8363 4.84326E-6 74051.1254 4.59389E-6 75129.5754 4.37179E-6 10023522 - 76154.8824 4.17333E-6 77128.8121 3.99547E-6 78053.1802 3.83561E-6 10023522 - 79816.3343 3.55291E-6 81391.7350 3.32270E-6 82795.6973 3.13353E-6 10023522 - 84044.0162 2.97687E-6 85151.7246 2.84622E-6 87125.4605 2.63124E-6 10023522 - 88635.7278 2.48073E-6 89785.5840 2.37352E-6 91538.3976 2.22134E-6 10023522 - 93325.4300 2.07891E-6 94746.3515 1.97479E-6 96098.1075 1.88192E-6 10023522 - 97382.8889 1.79882E-6 98602.9672 1.72426E-6 99760.6699 1.65716E-6 10023522 - 101968.124 1.53831E-6 103939.679 1.44133E-6 105696.034 1.36150E-6 10023522 - 107257.174 1.29529E-6 108642.074 1.23999E-6 111108.816 1.14885E-6 10023522 - 112995.558 1.08492E-6 114431.610 1.03932E-6 116619.981 9.74483E-7 10023522 - 118850.200 9.13692E-7 120399.566 8.74719E-7 121870.436 8.39693E-7 10023522 - 124676.920 7.77755E-7 127185.559 7.27319E-7 129421.990 6.85878E-7 10023522 - 131411.103 6.51558E-7 133176.639 6.22940E-7 134740.930 5.98933E-7 10023522 - 137522.781 5.59124E-7 139646.795 5.31014E-7 142894.483 4.91476E-7 10023522 - 146217.700 4.54883E-7 149623.555 4.21277E-7 152668.693 3.93915E-7 10023522 - 155383.984 3.71436E-7 157799.450 3.52821E-7 159943.765 3.37300E-7 10023522 - 161843.930 3.24280E-7 165223.697 3.02693E-7 167804.761 2.87451E-7 10023522 - 171752.152 2.66015E-7 175792.400 2.46178E-7 179112.166 2.31491E-7 10023522 - 182068.349 2.19361E-7 184695.005 2.09270E-7 187024.396 2.00822E-7 10023522 - 191171.743 1.86850E-7 194342.498 1.77013E-7 196755.028 1.69976E-7 10023522 - 200430.092 1.59942E-7 204173.800 1.50501E-7 208029.545 1.41656E-7 10023522 - 211463.005 1.34345E-7 214513.737 1.28258E-7 217219.209 1.23158E-7 10023522 - 222036.149 1.14717E-7 225718.824 1.08768E-7 228520.860 1.04509E-7 10023522 - 232789.267 9.84321E-8 237137.400 9.27084E-8 240921.219 8.81514E-8 10023522 - 244281.555 8.43482E-8 250275.315 7.80831E-8 254866.950 7.36917E-8 10023522 - 258365.874 7.05609E-8 263704.531 6.61124E-8 269153.500 6.19444E-8 10023522 - 273054.938 5.92214E-8 276515.058 5.69371E-8 282676.107 5.31497E-8 10023522 - 287386.813 5.04754E-8 294600.473 4.67141E-8 301995.200 4.32330E-8 10023522 - 306372.686 4.13712E-8 314186.520 3.83038E-8 320177.402 3.61535E-8 10023522 - 324745.410 3.46203E-8 331719.911 3.24416E-8 338844.200 3.04000E-8 10023522 - 343261.463 2.92456E-8 351130.688 2.73299E-8 357150.769 2.59759E-8 10023522 - 366374.968 2.40697E-8 375837.400 2.23033E-8 384591.775 2.08544E-8 10023522 - 391291.118 1.98299E-8 401559.575 1.83867E-8 412097.500 1.70485E-8 10023522 - 421696.479 1.59686E-8 429042.161 1.52038E-8 440301.297 1.41248E-8 10023522 - 451855.900 1.31224E-8 462380.990 1.23146E-8 470435.385 1.17416E-8 10023522 - 482780.805 1.09316E-8 495450.200 1.01776E-8 505533.578 9.64281E-9 10023522 - 513230.558 9.26025E-9 524996.315 8.71468E-9 537031.800 8.20126E-9 10023522 - 547961.441 7.78272E-9 556304.402 7.48289E-9 569057.619 7.05468E-9 10023522 - 582103.200 6.65096E-9 593950.132 6.32229E-9 602993.291 6.08649E-9 10023522 - 616816.844 5.74917E-9 630957.300 5.43055E-9 643798.538 5.17112E-9 10023522 - 663552.073 4.80501E-9 683911.700 4.46483E-9 697830.616 4.25913E-9 10023522 - 719241.930 3.96821E-9 741310.200 3.69717E-9 756397.316 3.53231E-9 10023522 - 779605.661 3.29870E-9 803526.100 3.08055E-9 817523.033 2.96704E-9 10023522 - 838976.915 2.80458E-9 860993.800 2.65101E-9 891250.950 2.46746E-9 10023522 - 922571.400 2.29662E-9 954992.575 2.14543E-9 988553.100 2.00420E-9 10023522 - 1011579.49 1.92022E-9 1047128.61 1.80081E-9 1083927.00 1.68882E-9 10023522 - 1109174.84 1.62097E-9 1148153.53 1.52426E-9 1188502.00 1.43333E-9 10023522 - 1216185.89 1.37804E-9 1258925.46 1.29908E-9 1303167.00 1.22464E-9 10023522 - 1341220.07 1.16818E-9 1370487.32 1.12754E-9 1415590.00 1.06923E-9 10023522 - 1462177.00 1.01393E-9 1522298.92 9.5052E-10 1569007.18 9.0558E-10 10023522 - 1604976.49 8.7327E-10 1660482.45 8.2696E-10 1717908.00 7.8311E-10 10023522 - 1768071.95 7.4903E-10 1846077.71 7.0069E-10 1927525.00 6.5546E-10 10023522 - 1983809.84 6.2813E-10 2071333.69 5.8926E-10 2162719.00 5.5280E-10 10023522 - 2232287.24 5.2853E-10 2340857.88 4.9410E-10 2454709.00 4.6192E-10 10023522 - 2540972.79 4.4071E-10 2607654.30 4.2545E-10 2710971.89 4.0354E-10 10023522 - 2818383.00 3.8275E-10 2934269.52 3.6309E-10 3024300.88 3.4901E-10 10023522 - 3164553.81 3.2891E-10 3311311.00 3.0996E-10 3447465.81 2.9460E-10 10023522 - 3553243.45 2.8358E-10 3718026.30 2.6782E-10 3890451.00 2.5294E-10 10023522 - 4073802.34 2.3912E-10 4216964.61 2.2926E-10 4441196.20 2.1522E-10 10023522 - 4677351.00 2.0205E-10 4911905.08 1.9072E-10 5095507.78 1.8264E-10 10023522 - 5383859.57 1.7116E-10 5688529.00 1.6040E-10 5854637.08 1.5519E-10 10023522 - 6157082.65 1.4649E-10 6394126.68 1.4028E-10 6766913.35 1.3145E-10 10023522 - 7161434.00 1.2319E-10 7413102.35 1.1854E-10 7640556.63 1.1462E-10 10023522 - 8055523.19 1.0806E-10 8381472.36 1.0339E-10 8634560.58 1.0003E-10 10023522 - 9028594.05 9.5179E-11 9440609.00 9.0566E-11 9814654.82 8.6827E-11 10023522 - 10154082.2 8.3682E-11 10460696.7 8.1024E-11 11019718.5 7.6574E-11 10023522 - 11458503.9 7.3397E-11 12149657.5 6.8878E-11 12882500.0 6.4637E-11 10023522 - 13489632.9 6.1555E-11 14044300.5 5.8978E-11 14548311.7 5.6813E-11 10023522 - 15004137.0 5.4983E-11 15836465.5 5.1922E-11 16490874.6 4.9739E-11 10023522 - 16999367.4 4.8162E-11 17791655.7 4.5890E-11 18620870.0 4.3724E-11 10023522 - 19639253.2 4.1366E-11 20575923.9 3.9407E-11 21432085.0 3.7770E-11 10023522 - 22210399.3 3.6392E-11 22914575.6 3.5229E-11 24201030.2 3.3281E-11 10023522 - 25213049.8 3.1891E-11 25999741.3 3.0887E-11 27226041.0 2.9440E-11 10023522 - 28510180.0 2.8061E-11 29512089.8 2.7084E-11 30483334.2 2.6199E-11 10023522 - 32391395.7 2.4617E-11 34158670.2 2.3311E-11 35783954.9 2.2226E-11 10023522 - 37269391.2 2.1317E-11 38619643.7 2.0553E-11 39841183.6 1.9907E-11 10023522 - 42072583.1 1.8824E-11 43827771.1 1.8051E-11 46598796.2 1.6951E-11 10023522 - 49545020.0 1.5918E-11 51730896.9 1.5236E-11 53867662.9 1.4624E-11 10023522 - 55950970.8 1.4072E-11 57977188.4 1.3573E-11 59943359.5 1.3122E-11 10023522 - 63811425.3 1.2316E-11 67400193.1 1.1651E-11 70705549.0 1.1099E-11 10023522 - 73730437.7 1.0638E-11 76483184.4 1.0250E-11 78976015.2 9.9220E-12 10023522 - 83535564.9 9.3732E-12 87127160.7 8.9816E-12 89921837.3 8.6987E-12 10023522 - 94282825.1 8.2910E-12 98855310.0 7.9023E-12 103216709. 7.5661E-12 10023522 - 107480120. 7.2640E-12 111636867. 6.9917E-12 115679704. 6.7457E-12 10023522 - 119602733. 6.5229E-12 127320541. 6.1248E-12 134481076. 5.7965E-12 10023522 - 141076130. 5.5237E-12 147111579. 5.2955E-12 152604032. 5.1036E-12 10023522 - 157577885. 4.9415E-12 166675385. 4.6699E-12 173841562. 4.4761E-12 10023522 - 179417677. 4.3360E-12 188118993. 4.1341E-12 197242300. 3.9416E-12 10023522 - 205974964. 3.7742E-12 214512652. 3.6236E-12 222837863. 3.4880E-12 10023522 - 230935955. 3.3654E-12 238794991. 3.2544E-12 254258698. 3.0561E-12 10023522 - 268608715. 2.8925E-12 281827809. 2.7566E-12 293927095. 2.6429E-12 10023522 - 304939320. 2.5472E-12 314912940. 2.4664E-12 333158114. 2.3311E-12 10023522 - 347532409. 2.2344E-12 358718684. 2.1646E-12 376176816. 2.0640E-12 10023522 - 394484600. 1.9680E-12 411949926. 1.8844E-12 429025303. 1.8092E-12 10023522 - 445675724. 1.7415E-12 461871906. 1.6803E-12 477589977. 1.6249E-12 10023522 - 508517391. 1.5259E-12 537217425. 1.4442E-12 563655613. 1.3763E-12 10023522 - 587854184. 1.3195E-12 609878634. 1.2718E-12 629825874. 1.2314E-12 10023522 - 666316222. 1.1639E-12 695064812. 1.1156E-12 717437362. 1.0808E-12 10023522 - 752353629. 1.0305E-12 788969200. 9.8258E-13 823534011. 9.4125E-13 10023522 - 857312551. 9.0409E-13 890237156. 8.7059E-13 922252556. 8.4031E-13 10023522 - 953311850. 8.1287E-13 1.01440E+9 7.6382E-13 1.07105E+9 7.2334E-13 10023522 - 1.12322E+9 6.8968E-13 1.17094E+9 6.6151E-13 1.21435E+9 6.3781E-13 10023522 - 1.25366E+9 6.1778E-13 1.32552E+9 5.8422E-13 1.38211E+9 5.6025E-13 10023522 - 1.47154E+9 5.2613E-13 1.56675E+9 4.9410E-13 1.63613E+9 4.7314E-13 10023522 - 1.70395E+9 4.5430E-13 1.77009E+9 4.3733E-13 1.83442E+9 4.2199E-13 10023522 - 1.89686E+9 4.0810E-13 2.01970E+9 3.8327E-13 2.13369E+9 3.6279E-13 10023522 - 2.23869E+9 3.4577E-13 2.33481E+9 3.3154E-13 2.42228E+9 3.1956E-13 10023522 - 2.50151E+9 3.0944E-13 2.64643E+9 2.9249E-13 2.76060E+9 2.8039E-13 10023522 - 2.84945E+9 2.7165E-13 2.98811E+9 2.5904E-13 3.13350E+9 2.4702E-13 10023522 - 3.27224E+9 2.3654E-13 3.40789E+9 2.2713E-13 3.54015E+9 2.1864E-13 10023522 - 3.66881E+9 2.1097E-13 3.79367E+9 2.0403E-13 4.03934E+9 1.9162E-13 10023522 - 4.26732E+9 1.8138E-13 4.47733E+9 1.7287E-13 4.66955E+9 1.6575E-13 10023522 - 4.84450E+9 1.5976E-13 5.00295E+9 1.5470E-13 5.29280E+9 1.4623E-13 10023522 - 5.52115E+9 1.4018E-13 5.69886E+9 1.3581E-13 5.97619E+9 1.2951E-13 10023522 - 6.26700E+9 1.2350E-13 6.54448E+9 1.1826E-13 6.81575E+9 1.1355E-13 10023522 - 7.08028E+9 1.0931E-13 7.33759E+9 1.0547E-13 7.58731E+9 1.0200E-13 10023522 - 8.07864E+9 9.5798E-14 8.53470E+9 9.0678E-14 8.95481E+9 8.6423E-14 10023522 - 9.33934E+9 8.2864E-14 9.68956E+9 7.9869E-14 1.0007E+10 7.7333E-14 10023522 - 1.0587E+10 7.3095E-14 1.1044E+10 7.0070E-14 1.1400E+10 6.7883E-14 10023522 - 1.1954E+10 6.4737E-14 1.2534E+10 6.1741E-14 1.3090E+10 5.9119E-14 10023522 - 1.3633E+10 5.6762E-14 1.4163E+10 5.4638E-14 1.4679E+10 5.2719E-14 10023522 - 1.5179E+10 5.0982E-14 1.6162E+10 4.7880E-14 1.7074E+10 4.5321E-14 10023522 - 1.7915E+10 4.3194E-14 1.8684E+10 4.1416E-14 1.9384E+10 3.9920E-14 10023522 - 2.0018E+10 3.8655E-14 2.1177E+10 3.6540E-14 2.2090E+10 3.5029E-14 10023522 - 2.2800E+10 3.3938E-14 2.3908E+10 3.2365E-14 2.5068E+10 3.0867E-14 10023522 - 2.6179E+10 2.9557E-14 2.7265E+10 2.8380E-14 2.8324E+10 2.7318E-14 10023522 - 2.9354E+10 2.6360E-14 3.0353E+10 2.5491E-14 3.2319E+10 2.3941E-14 10023522 - 3.4143E+10 2.2661E-14 3.5824E+10 2.1598E-14 3.7362E+10 2.0709E-14 10023522 - 3.8762E+10 1.9961E-14 4.0030E+10 1.9329E-14 4.2348E+10 1.8270E-14 10023522 - 4.4174E+10 1.7515E-14 4.5595E+10 1.6969E-14 4.7812E+10 1.6182E-14 10023522 - 5.0136E+10 1.5432E-14 5.2348E+10 1.4780E-14 5.4510E+10 1.4193E-14 10023522 - 5.6618E+10 1.3665E-14 5.8668E+10 1.3187E-14 6.0657E+10 1.2755E-14 10023522 - 6.4569E+10 1.1982E-14 6.8199E+10 1.1344E-14 7.1542E+10 1.0814E-14 10023522 - 7.4601E+10 1.0370E-14 7.7385E+10 9.9972E-15 7.9906E+10 9.6817E-15 10023522 - 8.4516E+10 9.1536E-15 8.8147E+10 8.7764E-15 9.3887E+10 8.2398E-15 10023522 - 1.0000E+11 7.7360E-15 10023522 - 10023 0 - 1000.00000 .999242000 0 0 0 0 10023534 - 13.6000000 0.0 0 0 1 904 10023534 - 904 2 10023534 - 13.6000000 6318358.25 13.6100000 6305834.00 13.9717518 5874735.37 10023534 - 14.2961635 5521770.62 14.5861968 5230366.94 14.8447987 4988031.99 10023534 - 15.0748336 4785217.34 15.4860050 4449932.70 15.8017267 4213978.09 10023534 - 16.0427351 4045259.60 16.4111572 3804762.82 16.7880400 3578564.00 10023534 - 17.1594652 3369752.37 17.4911970 3197061.83 17.7867189 3053233.04 10023534 - 18.0493935 2932700.80 18.5184426 2733105.64 18.8782114 2592375.54 10023534 - 19.1526175 2491604.11 19.5717233 2347743.94 20.0000000 2212190.00 10023534 - 20.4303711 2084478.71 20.8145359 1978794.18 21.1566011 1890725.09 10023534 - 21.4605165 1816886.02 22.0029110 1694538.55 22.4186843 1608215.64 10023534 - 22.7356621 1546371.73 23.2195517 1458036.31 23.7137400 1374747.00 10023534 - 24.2312071 1293141.39 24.6932454 1225720.19 25.1047501 1169616.54 10023534 - 25.4704383 1122636.47 26.1232567 1044916.35 26.6238276 990178.078 10023534 - 27.0055404 951014.514 27.5883954 895154.308 28.1838300 842575.200 10023534 - 28.8403162 788588.031 29.4272734 744194.578 29.9506519 707405.256 10023534 - 30.4162383 676709.604 30.8295597 650945.518 31.5664328 608196.157 10023534 - 32.1306229 577986.833 32.9958713 535462.866 33.8844200 496067.500 10023534 - 34.7236242 461908.529 35.4749601 433954.591 36.1457029 410886.199 10023534 - 36.7429980 391709.553 37.2737222 375665.616 38.2210020 349153.737 10023534 - 38.9472275 330505.074 39.5009378 317175.190 40.3462982 298181.591 10023534 - 41.2097500 280325.400 42.2303791 260771.031 43.1441438 244783.211 10023534 - 43.9598923 231600.037 44.6863147 220648.509 45.3317745 211491.575 10023534 - 46.4838438 196371.839 47.3670696 185745.717 48.0404849 178155.203 10023534 - 49.0686011 167347.052 50.1187200 157194.600 51.3599953 146101.888 10023534 - 52.4713037 137039.813 53.4634061 129572.792 54.3468712 123373.674 10023534 - 55.1318707 118193.228 56.5330020 109645.361 57.6071695 103642.651 10023534 - 58.4261681 99357.2818 59.6765494 93259.1573 60.9536900 87535.3100 10023534 - 61.7488440 84167.7995 63.2678223 78198.9705 64.6275487 73324.5177 10023534 - 65.8412598 69309.2776 66.9219402 65976.7259 67.8820762 63192.4545 10023534 - 69.5955793 58599.7197 70.9090320 55375.5783 71.9103635 53074.4285 10023534 - 73.4389356 49800.7526 75.0000000 46729.0000 75.9770513 44914.1373 10023534 - 77.8434595 41699.0961 79.5141392 39075.2957 81.0053710 36915.2617 10023534 - 82.3331226 35123.4097 83.5127457 33627.0328 85.6178996 31160.1354 10023534 - 87.2315168 29429.4691 88.4616560 28194.8473 90.3394675 26439.3471 10023534 - 92.2571400 24793.1500 93.5944287 23713.3929 94.8657365 22743.8673 10023534 - 96.0732662 21870.9685 98.3789666 20323.5680 100.441802 19059.6708 10023534 - 102.282234 18018.4076 103.920254 17154.0745 105.375027 16431.8634 10023534 - 107.970053 15240.3870 109.958175 14403.8265 111.473255 13806.6812 10023534 - 113.785105 12957.0588 116.144900 12159.7200 117.913256 11598.2709 10023534 - 119.595534 11095.4793 121.194462 10643.9258 122.712865 10237.2986 10023534 - 125.611333 9516.27554 128.203597 8927.16251 130.515674 8441.68357 10023534 - 132.572921 8038.59676 134.399596 7701.71639 137.657046 7145.79033 10023534 - 140.151841 6755.34182 142.052565 6476.57091 144.952091 6079.83548 10023534 - 147.910800 5707.40300 150.162813 5441.20199 152.305205 5202.92587 10023534 - 154.341450 4989.02728 156.275147 4796.49067 159.966365 4455.28610 10023534 - 163.267631 4176.70299 166.212078 3947.27005 168.831997 3756.87876 10023534 - 171.158279 3597.83488 175.306666 3335.53743 178.483807 3151.44160 10023534 - 180.904392 3020.06886 184.596961 2833.20649 188.364900 2657.90600 10023534 - 191.370496 2526.93158 194.231783 2410.01077 196.953081 2305.31560 10023534 - 199.538915 2211.29830 201.993959 2126.64239 206.678872 1976.55021 10023534 - 210.867220 1853.93525 214.601591 1752.90320 217.923377 1669.02709 10023534 - 220.872091 1598.93443 226.128670 1483.28083 230.153042 1402.06429 10023534 - 233.218252 1344.08377 237.892780 1261.57757 242.661000 1184.13600 10023534 - 246.710418 1122.65353 250.568097 1067.91613 254.239437 1019.02617 10023534 - 257.730158 975.226547 261.046225 935.875722 267.379279 866.322185 10023534 - 273.046608 809.716584 278.103974 763.229121 282.605951 724.747279 10023534 - 286.604924 692.670668 290.150417 665.770389 296.460892 621.184223 10023534 - 301.283655 589.715270 308.665301 545.475580 316.227800 504.554700 10023534 - 321.736287 477.010587 326.987609 452.555184 331.988540 430.768165 10023534 - 336.746353 411.296395 341.268711 393.841747 345.563564 378.151361 10023534 - 353.762631 350.397113 361.096238 327.788350 367.637747 309.205624 10023534 - 373.458705 293.811995 378.627599 280.972549 387.845901 259.838824 10023534 - 394.906616 245.038404 400.286379 234.494003 408.493749 219.522036 10023534 - 416.869400 205.506000 424.436299 193.736578 431.654964 183.315651 10023534 - 438.533925 174.055689 445.082480 165.799745 451.310535 158.415808 10023534 - 457.228463 151.792306 462.846977 145.834507 473.568446 135.286687 10023534 - 483.153264 126.685083 491.698981 119.608514 499.300383 113.741548 10023534 - 506.047947 108.844514 518.076340 100.776557 527.284893 95.1205257 10023534 - 534.298562 91.0878156 544.994375 85.3570423 555.904300 79.9868200 10023534 - 566.402331 75.1913948 576.424216 70.9571223 585.980723 67.2043069 10023534 - 595.083792 63.8665048 603.746310 60.8880323 611.981909 58.2219913 10023534 - 619.804782 55.8286950 627.229521 53.6744059 641.391469 49.8566469 10023534 - 654.045228 46.7395374 665.321884 44.1723582 675.348334 42.0420117 10023534 - 684.245348 40.2624111 700.098084 37.3274472 712.228201 35.2674998 10023534 - 721.463515 33.7974909 735.541506 31.7065612 749.894200 29.7449900 10023534 - 765.156005 27.8151013 779.745923 26.1197062 793.676533 24.6242466 10023534 - 806.962428 23.3001088 819.619870 22.1234707 831.666474 21.0743949 10023534 - 843.120921 20.1361112 854.002703 19.2944458 864.331894 18.5373638 10023534 - 884.037043 17.1969862 901.647218 16.1039038 917.343647 15.2046048 10023534 - 931.302014 14.4590118 943.689702 13.8366722 965.765962 12.8113376 10023534 - 982.661416 12.0925138 995.526699 11.5799898 1015.14113 10.8516444 10023534 - 1035.14200 10.1691100 1057.73027 9.45914318 1079.35424 8.83863297 10023534 - 1100.02803 8.29392435 1119.76920 7.81378764 1138.59818 7.38893409 10023534 - 1156.53780 7.01163774 1173.61281 6.67543839 1189.84952 6.37490687 10023534 - 1205.27538 6.10545829 1219.91871 5.86320281 1247.85616 5.43458197 10023534 - 1272.82577 5.08532211 1295.08369 4.79818236 1314.87843 4.56026676 10023534 - 1332.44686 4.36178806 1363.75832 4.03500999 1387.72384 3.80609527 10023534 - 1405.97396 3.64297286 1433.80012 3.41130357 1462.17700 3.19436700 10023534 - 1496.23550 2.95553057 1528.88549 2.74786527 1560.14163 2.56645064 10023534 - 1590.02435 2.40726724 1618.55903 2.26701155 1645.77519 2.14295263 10023534 - 1671.70582 2.03282026 1696.38673 1.93471720 1719.85591 1.84704976 10023534 - 1742.15307 1.76847278 1763.31913 1.69784554 1803.70104 1.57293330 10023534 - 1839.79310 1.47119731 1871.96560 1.38759095 1900.57771 1.31834228 10023534 - 1925.97182 1.26059058 1971.23066 1.16554584 2005.87139 1.09899529 10023534 - 2032.25085 1.05158816 2072.47191 .984284114 2113.48900 .921287700 10023534 - 2140.27089 .882724673 2166.53945 .846906706 2192.29452 .813594596 10023534 - 2243.06945 .752735242 2291.73847 .699820735 2338.32431 .653596667 10023534 - 2382.85822 .613038376 2425.37876 .577303753 2465.93061 .545696672 10023534 - 2504.56353 .517638472 2541.33141 .492645574 2576.29136 .470311797 10023534 - 2609.50297 .450294304 2641.02758 .432302377 2701.16633 .400482527 10023534 - 2754.91002 .374567445 2802.81219 .353271154 2845.40936 .335632538 10023534 - 2883.21261 .320922711 2950.58081 .296714759 3002.13798 .279764866 10023534 - 3041.39620 .267690950 3101.24819 .250550036 3162.27800 .234506700 10023534 - 3215.04863 .221627239 3267.00980 .209825201 3318.14788 .198991639 10023534 - 3368.45110 .189030322 3417.90945 .179856070 3466.51463 .171393333 10023534 - 3514.25993 .163574969 3561.14021 .156341196 3607.15177 .149638680 10023534 - 3652.29231 .143419757 3696.56083 .137641750 3739.95757 .132266382 10023534 - 3825.49386 .122441701 3907.46001 .113894891 3985.89757 .106424887 10023534 - 4060.86219 .099867337 4132.42150 .094087077 4200.65317 .088972301 10023534 - 4265.64319 .084430016 4327.48422 .080382459 4386.27418 .076764280 10023534 - 4442.11493 .073520289 4495.11110 .070603662 4596.18898 .065443237 10023534 - 4686.49485 .061238229 4766.96680 .057781092 4838.51244 .054916579 10023534 - 4901.99519 .052526866 5015.10075 .048592362 5101.63928 .045836126 10023534 - 5167.52174 .043872040 5267.94410 .041082581 5370.31800 .038470480 10023534 - 5454.04547 .036483038 5536.40107 .034655669 5617.36876 .032972735 10023534 - 5696.93522 .031420368 5775.08981 .029986242 5851.82437 .028659385 10023534 - 5927.13312 .027430006 6001.01257 .026289358 6073.46133 .025229607 10023534 - 6144.48005 .024243729 6284.45063 .022441879 6418.56750 .020874462 10023534 - 6546.90037 .019504580 6669.54182 .018302075 6786.60389 .017242146 10023534 - 6898.21493 .016304281 7004.51675 .015471416 7105.66197 .014729286 10023534 - 7201.81168 .014065903 7293.13331 .013471142 7379.79875 .012936414 10023534 - 7545.08186 .011990345 7692.73840 .011219468 7824.30633 .010585717 10023534 - 7941.27283 .010060621 8045.05198 .009622573 8229.93954 .008901383 10023534 - 8371.38831 .008396189 8479.06802 .008036200 8643.19013 .007524948 10023534 - 8810.48900 .007046222 8989.79966 .006573880 9166.98617 .006146515 10023534 - 9341.96523 .005759017 9514.66063 .005406940 9685.00307 .005086405 10023534 - 9852.92999 .004794018 10018.3853 .004526806 10181.3193 .004282156 10023534 - 10341.6881 .004057767 10499.4538 .003851609 10654.5841 .003661887 10023534 - 10807.0519 .003487011 10956.8355 .003325567 11103.9177 .003176300 10023534 - 11248.2861 .003038089 11389.9327 .002909935 11528.8537 .002790944 10023534 - 11665.0489 .002680312 11933.5225 .002478289 12190.8256 .002302744 10023534 - 12437.0835 .002149481 12672.4663 .002015073 12897.1819 .001896710 10023534 - 13111.4705 .001792066 13315.5985 .001699212 13509.8539 .001616535 10023534 - 13694.5412 .001542684 13869.9780 .001476515 14036.4906 .001417061 10023534 - 14354.1085 .001311962 14637.9142 .001226415 14890.8435 .001156150 10023534 - 15115.7392 .001097978 15315.3074 .001049484 15492.0898 .001008812 10023534 - 15806.3831 9.41392E-4 16046.2805 8.93801E-4 16412.9705 8.26886E-4 10023534 - 16788.0400 7.64982E-4 17154.3788 7.10057E-4 17516.8910 6.60613E-4 10023534 - 17875.3785 6.15999E-4 18229.6580 5.75655E-4 18579.5608 5.39093E-4 10023534 - 18924.9324 5.05889E-4 19265.6321 4.75675E-4 19601.5330 4.48126E-4 10023534 - 19932.5207 4.22961E-4 20258.4939 3.99931E-4 20579.3632 3.78817E-4 10023534 - 20895.0509 3.59426E-4 21205.4907 3.41589E-4 21510.6269 3.25153E-4 10023534 - 21810.4140 3.09986E-4 22104.8164 2.95967E-4 22393.8078 2.82992E-4 10023534 - 22677.3707 2.70964E-4 22955.4958 2.59801E-4 23228.1819 2.49424E-4 10023534 - 23495.4352 2.39768E-4 24022.0199 2.22109E-4 24526.4068 2.06737E-4 10023534 - 25008.8836 1.93294E-4 25469.8219 1.81486E-4 25909.6644 1.71072E-4 10023534 - 26328.9127 1.61852E-4 26728.1171 1.53660E-4 27107.8666 1.46357E-4 10023534 - 27468.7806 1.39826E-4 27811.5003 1.33968E-4 28136.6825 1.28699E-4 10023534 - 28756.6819 1.19373E-4 29310.3781 1.11768E-4 29803.6009 1.05512E-4 10023534 - 30241.9744 1.00327E-4 30630.8373 9.59986E-5 31323.4175 8.88689E-5 10023534 - 31853.1101 8.38714E-5 32256.2496 8.03085E-5 32870.5454 7.52460E-5 10023534 - 33496.5400 7.05026E-5 34129.1091 6.60991E-5 34753.2999 6.20957E-5 10023534 - 35368.8691 5.84488E-5 35975.5973 5.51202E-5 36573.2886 5.20765E-5 10023534 - 37161.7698 4.92883E-5 37740.8892 4.67297E-5 38310.5159 4.43777E-5 10023534 - 38870.5391 4.22122E-5 39420.8671 4.02152E-5 39961.4263 3.83707E-5 10023534 - 40492.1606 3.66646E-5 41013.0304 3.50842E-5 41524.0115 3.36181E-5 10023534 - 42025.0947 3.22563E-5 42516.2845 3.09897E-5 43484.3617 2.86755E-5 10023534 - 44411.9438 2.66631E-5 45299.5144 2.49049E-5 46147.7149 2.33621E-5 10023534 - 46957.3213 2.20026E-5 47729.2223 2.08000E-5 48464.3996 1.97323E-5 10023534 - 49163.9095 1.87812E-5 49828.8668 1.79312E-5 50460.4301 1.71693E-5 10023534 - 51059.7889 1.64845E-5 52202.8410 1.52732E-5 53223.9831 1.42865E-5 10023534 - 54133.8546 1.34756E-5 54942.7425 1.28039E-5 55660.4282 1.22437E-5 10023534 - 56939.0095 1.13217E-5 57917.1833 1.06760E-5 58661.8257 1.02161E-5 10023534 - 59796.7787 9.56299E-6 60953.6900 8.95168E-6 61770.5193 8.55244E-6 10023534 - 62572.2597 8.18266E-6 63358.8677 7.83969E-6 64130.3229 7.52115E-6 10023534 - 64886.6264 7.22492E-6 66377.4395 6.68376E-6 67806.1702 6.21329E-6 10023534 - 69173.5222 5.80235E-6 70480.4466 5.44181E-6 71728.1050 5.12418E-6 10023534 - 72917.8363 4.84326E-6 74051.1254 4.59389E-6 75129.5754 4.37179E-6 10023534 - 76154.8824 4.17333E-6 77128.8121 3.99547E-6 78053.1802 3.83561E-6 10023534 - 79816.3343 3.55291E-6 81391.7350 3.32270E-6 82795.6973 3.13353E-6 10023534 - 84044.0162 2.97687E-6 85151.7246 2.84622E-6 87125.4605 2.63124E-6 10023534 - 88635.7278 2.48073E-6 89785.5840 2.37352E-6 91538.3976 2.22134E-6 10023534 - 93325.4300 2.07891E-6 94746.3515 1.97479E-6 96098.1075 1.88192E-6 10023534 - 97382.8889 1.79882E-6 98602.9672 1.72426E-6 99760.6699 1.65716E-6 10023534 - 101968.124 1.53831E-6 103939.679 1.44133E-6 105696.034 1.36150E-6 10023534 - 107257.174 1.29529E-6 108642.074 1.23999E-6 111108.816 1.14885E-6 10023534 - 112995.558 1.08492E-6 114431.610 1.03932E-6 116619.981 9.74483E-7 10023534 - 118850.200 9.13692E-7 120399.566 8.74719E-7 121870.436 8.39693E-7 10023534 - 124676.920 7.77755E-7 127185.559 7.27319E-7 129421.990 6.85878E-7 10023534 - 131411.103 6.51558E-7 133176.639 6.22940E-7 134740.930 5.98933E-7 10023534 - 137522.781 5.59124E-7 139646.795 5.31014E-7 142894.483 4.91476E-7 10023534 - 146217.700 4.54883E-7 149623.555 4.21277E-7 152668.693 3.93915E-7 10023534 - 155383.984 3.71436E-7 157799.450 3.52821E-7 159943.765 3.37300E-7 10023534 - 161843.930 3.24280E-7 165223.697 3.02693E-7 167804.761 2.87451E-7 10023534 - 171752.152 2.66015E-7 175792.400 2.46178E-7 179112.166 2.31491E-7 10023534 - 182068.349 2.19361E-7 184695.005 2.09270E-7 187024.396 2.00822E-7 10023534 - 191171.743 1.86850E-7 194342.498 1.77013E-7 196755.028 1.69976E-7 10023534 - 200430.092 1.59942E-7 204173.800 1.50501E-7 208029.545 1.41656E-7 10023534 - 211463.005 1.34345E-7 214513.737 1.28258E-7 217219.209 1.23158E-7 10023534 - 222036.149 1.14717E-7 225718.824 1.08768E-7 228520.860 1.04509E-7 10023534 - 232789.267 9.84321E-8 237137.400 9.27084E-8 240921.219 8.81514E-8 10023534 - 244281.555 8.43482E-8 250275.315 7.80831E-8 254866.950 7.36917E-8 10023534 - 258365.874 7.05609E-8 263704.531 6.61124E-8 269153.500 6.19444E-8 10023534 - 273054.938 5.92214E-8 276515.058 5.69371E-8 282676.107 5.31497E-8 10023534 - 287386.813 5.04754E-8 294600.473 4.67141E-8 301995.200 4.32330E-8 10023534 - 306372.686 4.13712E-8 314186.520 3.83038E-8 320177.402 3.61535E-8 10023534 - 324745.410 3.46203E-8 331719.911 3.24416E-8 338844.200 3.04000E-8 10023534 - 343261.463 2.92456E-8 351130.688 2.73299E-8 357150.769 2.59759E-8 10023534 - 366374.968 2.40697E-8 375837.400 2.23033E-8 384591.775 2.08544E-8 10023534 - 391291.118 1.98299E-8 401559.575 1.83867E-8 412097.500 1.70485E-8 10023534 - 421696.479 1.59686E-8 429042.161 1.52038E-8 440301.297 1.41248E-8 10023534 - 451855.900 1.31224E-8 462380.990 1.23146E-8 470435.385 1.17416E-8 10023534 - 482780.805 1.09316E-8 495450.200 1.01776E-8 505533.578 9.64281E-9 10023534 - 513230.558 9.26025E-9 524996.315 8.71468E-9 537031.800 8.20126E-9 10023534 - 547961.441 7.78272E-9 556304.402 7.48289E-9 569057.619 7.05468E-9 10023534 - 582103.200 6.65096E-9 593950.132 6.32229E-9 602993.291 6.08649E-9 10023534 - 616816.844 5.74917E-9 630957.300 5.43055E-9 643798.538 5.17112E-9 10023534 - 663552.073 4.80501E-9 683911.700 4.46483E-9 697830.616 4.25913E-9 10023534 - 719241.930 3.96821E-9 741310.200 3.69717E-9 756397.316 3.53231E-9 10023534 - 779605.661 3.29870E-9 803526.100 3.08055E-9 817523.033 2.96704E-9 10023534 - 838976.915 2.80458E-9 860993.800 2.65101E-9 891250.950 2.46746E-9 10023534 - 922571.400 2.29662E-9 954992.575 2.14543E-9 988553.100 2.00420E-9 10023534 - 1011579.49 1.92022E-9 1047128.61 1.80081E-9 1083927.00 1.68882E-9 10023534 - 1109174.84 1.62097E-9 1148153.53 1.52426E-9 1188502.00 1.43333E-9 10023534 - 1216185.89 1.37804E-9 1258925.46 1.29908E-9 1303167.00 1.22464E-9 10023534 - 1341220.07 1.16818E-9 1370487.32 1.12754E-9 1415590.00 1.06923E-9 10023534 - 1462177.00 1.01393E-9 1522298.92 9.5052E-10 1569007.18 9.0558E-10 10023534 - 1604976.49 8.7327E-10 1660482.45 8.2696E-10 1717908.00 7.8311E-10 10023534 - 1768071.95 7.4903E-10 1846077.71 7.0069E-10 1927525.00 6.5546E-10 10023534 - 1983809.84 6.2813E-10 2071333.69 5.8926E-10 2162719.00 5.5280E-10 10023534 - 2232287.24 5.2853E-10 2340857.88 4.9410E-10 2454709.00 4.6192E-10 10023534 - 2540972.79 4.4071E-10 2607654.30 4.2545E-10 2710971.89 4.0354E-10 10023534 - 2818383.00 3.8275E-10 2934269.52 3.6309E-10 3024300.88 3.4901E-10 10023534 - 3164553.81 3.2891E-10 3311311.00 3.0996E-10 3447465.81 2.9460E-10 10023534 - 3553243.45 2.8358E-10 3718026.30 2.6782E-10 3890451.00 2.5294E-10 10023534 - 4073802.34 2.3912E-10 4216964.61 2.2926E-10 4441196.20 2.1522E-10 10023534 - 4677351.00 2.0205E-10 4911905.08 1.9072E-10 5095507.78 1.8264E-10 10023534 - 5383859.57 1.7116E-10 5688529.00 1.6040E-10 5854637.08 1.5519E-10 10023534 - 6157082.65 1.4649E-10 6394126.68 1.4028E-10 6766913.35 1.3145E-10 10023534 - 7161434.00 1.2319E-10 7413102.35 1.1854E-10 7640556.63 1.1462E-10 10023534 - 8055523.19 1.0806E-10 8381472.36 1.0339E-10 8634560.58 1.0003E-10 10023534 - 9028594.05 9.5179E-11 9440609.00 9.0566E-11 9814654.82 8.6827E-11 10023534 - 10154082.2 8.3682E-11 10460696.7 8.1024E-11 11019718.5 7.6574E-11 10023534 - 11458503.9 7.3397E-11 12149657.5 6.8878E-11 12882500.0 6.4637E-11 10023534 - 13489632.9 6.1555E-11 14044300.5 5.8978E-11 14548311.7 5.6813E-11 10023534 - 15004137.0 5.4983E-11 15836465.5 5.1922E-11 16490874.6 4.9739E-11 10023534 - 16999367.4 4.8162E-11 17791655.7 4.5890E-11 18620870.0 4.3724E-11 10023534 - 19639253.2 4.1366E-11 20575923.9 3.9407E-11 21432085.0 3.7770E-11 10023534 - 22210399.3 3.6392E-11 22914575.6 3.5229E-11 24201030.2 3.3281E-11 10023534 - 25213049.8 3.1891E-11 25999741.3 3.0887E-11 27226041.0 2.9440E-11 10023534 - 28510180.0 2.8061E-11 29512089.8 2.7084E-11 30483334.2 2.6199E-11 10023534 - 32391395.7 2.4617E-11 34158670.2 2.3311E-11 35783954.9 2.2226E-11 10023534 - 37269391.2 2.1317E-11 38619643.7 2.0553E-11 39841183.6 1.9907E-11 10023534 - 42072583.1 1.8824E-11 43827771.1 1.8051E-11 46598796.2 1.6951E-11 10023534 - 49545020.0 1.5918E-11 51730896.9 1.5236E-11 53867662.9 1.4624E-11 10023534 - 55950970.8 1.4072E-11 57977188.4 1.3573E-11 59943359.5 1.3122E-11 10023534 - 63811425.3 1.2316E-11 67400193.1 1.1651E-11 70705549.0 1.1099E-11 10023534 - 73730437.7 1.0638E-11 76483184.4 1.0250E-11 78976015.2 9.9220E-12 10023534 - 83535564.9 9.3732E-12 87127160.7 8.9816E-12 89921837.3 8.6987E-12 10023534 - 94282825.1 8.2910E-12 98855310.0 7.9023E-12 103216709. 7.5661E-12 10023534 - 107480120. 7.2640E-12 111636867. 6.9917E-12 115679704. 6.7457E-12 10023534 - 119602733. 6.5229E-12 127320541. 6.1248E-12 134481076. 5.7965E-12 10023534 - 141076130. 5.5237E-12 147111579. 5.2955E-12 152604032. 5.1036E-12 10023534 - 157577885. 4.9415E-12 166675385. 4.6699E-12 173841562. 4.4761E-12 10023534 - 179417677. 4.3360E-12 188118993. 4.1341E-12 197242300. 3.9416E-12 10023534 - 205974964. 3.7742E-12 214512652. 3.6236E-12 222837863. 3.4880E-12 10023534 - 230935955. 3.3654E-12 238794991. 3.2544E-12 254258698. 3.0561E-12 10023534 - 268608715. 2.8925E-12 281827809. 2.7566E-12 293927095. 2.6429E-12 10023534 - 304939320. 2.5472E-12 314912940. 2.4664E-12 333158114. 2.3311E-12 10023534 - 347532409. 2.2344E-12 358718684. 2.1646E-12 376176816. 2.0640E-12 10023534 - 394484600. 1.9680E-12 411949926. 1.8844E-12 429025303. 1.8092E-12 10023534 - 445675724. 1.7415E-12 461871906. 1.6803E-12 477589977. 1.6249E-12 10023534 - 508517391. 1.5259E-12 537217425. 1.4442E-12 563655613. 1.3763E-12 10023534 - 587854184. 1.3195E-12 609878634. 1.2718E-12 629825874. 1.2314E-12 10023534 - 666316222. 1.1639E-12 695064812. 1.1156E-12 717437362. 1.0808E-12 10023534 - 752353629. 1.0305E-12 788969200. 9.8258E-13 823534011. 9.4125E-13 10023534 - 857312551. 9.0409E-13 890237156. 8.7059E-13 922252556. 8.4031E-13 10023534 - 953311850. 8.1287E-13 1.01440E+9 7.6382E-13 1.07105E+9 7.2334E-13 10023534 - 1.12322E+9 6.8968E-13 1.17094E+9 6.6151E-13 1.21435E+9 6.3781E-13 10023534 - 1.25366E+9 6.1778E-13 1.32552E+9 5.8422E-13 1.38211E+9 5.6025E-13 10023534 - 1.47154E+9 5.2613E-13 1.56675E+9 4.9410E-13 1.63613E+9 4.7314E-13 10023534 - 1.70395E+9 4.5430E-13 1.77009E+9 4.3733E-13 1.83442E+9 4.2199E-13 10023534 - 1.89686E+9 4.0810E-13 2.01970E+9 3.8327E-13 2.13369E+9 3.6279E-13 10023534 - 2.23869E+9 3.4577E-13 2.33481E+9 3.3154E-13 2.42228E+9 3.1956E-13 10023534 - 2.50151E+9 3.0944E-13 2.64643E+9 2.9249E-13 2.76060E+9 2.8039E-13 10023534 - 2.84945E+9 2.7165E-13 2.98811E+9 2.5904E-13 3.13350E+9 2.4702E-13 10023534 - 3.27224E+9 2.3654E-13 3.40789E+9 2.2713E-13 3.54015E+9 2.1864E-13 10023534 - 3.66881E+9 2.1097E-13 3.79367E+9 2.0403E-13 4.03934E+9 1.9162E-13 10023534 - 4.26732E+9 1.8138E-13 4.47733E+9 1.7287E-13 4.66955E+9 1.6575E-13 10023534 - 4.84450E+9 1.5976E-13 5.00295E+9 1.5470E-13 5.29280E+9 1.4623E-13 10023534 - 5.52115E+9 1.4018E-13 5.69886E+9 1.3581E-13 5.97619E+9 1.2951E-13 10023534 - 6.26700E+9 1.2350E-13 6.54448E+9 1.1826E-13 6.81575E+9 1.1355E-13 10023534 - 7.08028E+9 1.0931E-13 7.33759E+9 1.0547E-13 7.58731E+9 1.0200E-13 10023534 - 8.07864E+9 9.5798E-14 8.53470E+9 9.0678E-14 8.95481E+9 8.6423E-14 10023534 - 9.33934E+9 8.2864E-14 9.68956E+9 7.9869E-14 1.0007E+10 7.7333E-14 10023534 - 1.0587E+10 7.3095E-14 1.1044E+10 7.0070E-14 1.1400E+10 6.7883E-14 10023534 - 1.1954E+10 6.4737E-14 1.2534E+10 6.1741E-14 1.3090E+10 5.9119E-14 10023534 - 1.3633E+10 5.6762E-14 1.4163E+10 5.4638E-14 1.4679E+10 5.2719E-14 10023534 - 1.5179E+10 5.0982E-14 1.6162E+10 4.7880E-14 1.7074E+10 4.5321E-14 10023534 - 1.7915E+10 4.3194E-14 1.8684E+10 4.1416E-14 1.9384E+10 3.9920E-14 10023534 - 2.0018E+10 3.8655E-14 2.1177E+10 3.6540E-14 2.2090E+10 3.5029E-14 10023534 - 2.2800E+10 3.3938E-14 2.3908E+10 3.2365E-14 2.5068E+10 3.0867E-14 10023534 - 2.6179E+10 2.9557E-14 2.7265E+10 2.8380E-14 2.8324E+10 2.7318E-14 10023534 - 2.9354E+10 2.6360E-14 3.0353E+10 2.5491E-14 3.2319E+10 2.3941E-14 10023534 - 3.4143E+10 2.2661E-14 3.5824E+10 2.1598E-14 3.7362E+10 2.0709E-14 10023534 - 3.8762E+10 1.9961E-14 4.0030E+10 1.9329E-14 4.2348E+10 1.8270E-14 10023534 - 4.4174E+10 1.7515E-14 4.5595E+10 1.6969E-14 4.7812E+10 1.6182E-14 10023534 - 5.0136E+10 1.5432E-14 5.2348E+10 1.4780E-14 5.4510E+10 1.4193E-14 10023534 - 5.6618E+10 1.3665E-14 5.8668E+10 1.3187E-14 6.0657E+10 1.2755E-14 10023534 - 6.4569E+10 1.1982E-14 6.8199E+10 1.1344E-14 7.1542E+10 1.0814E-14 10023534 - 7.4601E+10 1.0370E-14 7.7385E+10 9.9972E-15 7.9906E+10 9.6817E-15 10023534 - 8.4516E+10 9.1536E-15 8.8147E+10 8.7764E-15 9.3887E+10 8.2398E-15 10023534 - 1.0000E+11 7.7360E-15 10023534 - 10023 0 - 100 0 0 - 1000.00000 .999242000 0 0 0 0 10027502 - 0.0 1.00000000 0 0 1 1253 10027502 - 1253 2 10027502 - 0.0 1.00000000 .001000000 1.00000000 .002000000 .999763091 10027502 - .004000000 .999526238 .005000000 .999450000 .010000000 .997790000 10027502 - .015000000 .995040000 .020000000 .991210000 .025000000 .986320000 10027502 - .025300000 .985930930 .030000000 .980390000 .037500000 .969591000 10027502 - .040000000 .965540000 .047500000 .951888000 .050000000 .946940000 10027502 - .058750000 .927840000 .066250000 .909601000 .070000000 .899870000 10027502 - .078750000 .875776000 .080000000 .872161000 .086250000 .853727000 10027502 - .090000000 .842390000 .097500000 .818793000 .100000000 .810820000 10027502 - .106250000 .790380000 .115630000 .759029000 .125000000 .727120000 10027502 - .135940000 .689468000 .145310000 .657270000 .150000000 .641300000 10027502 - .160940000 .604320000 .170310000 .573352000 .175000000 .558120000 10027502 - .181142210 .537968711 .187500000 .518545000 .193649168 .499310774 10027502 - .200000000 .480790000 .206155282 .462504791 .212500000 .444915000 10027502 - .221880000 .419312000 .228910000 .400939000 .235940000 .383209000 10027502 - .242970000 .366136000 .250000000 .349750000 .256173770 .335677385 10027502 - .262500000 .322171000 .271880000 .302814000 .278910000 .289065000 10027502 - .284709701 .278025706 .290630000 .267408000 .292970000 .263270000 10027502 - .300000000 .251270000 .308854335 .236689464 .317970000 .222955000 10027502 - .325000000 .212804000 .333010000 .201798000 .341282256 .190954146 10027502 - .349760000 .180693000 .356073027 .173302355 .362500000 .166214000 10027502 - .367700000 .160675000 .378311871 .149856807 .389230000 .139767000 10027502 - .400000000 .130450000 .406108638 .125388741 .415446954 .118162652 10027502 - .425000000 .111353000 .434273820 .105040897 .443750000 .099086600 10027502 - .450000000 .095336200 .460810157 .089198744 .471880000 .083456400 10027502 - .478758150 .080036807 .489263810 .075168334 .500000000 .070596000 10027502 - .512347539 .065652301 .525000000 .061054800 .534133860 .057914556 10027502 - .541088389 .055665827 .551690329 .052455385 .562500000 .049430100 10027502 - .571649342 .046977791 .585653145 .043525549 .600000000 .040327000 10027502 - .612127340 .037789698 .621383437 .035992046 .635530672 .033454630 10027502 - .650000000 .031096100 .662154794 .029232667 .671419819 .027908746 10027502 - .685560992 .026034435 .700000000 .024286000 .712178480 .022898063 10027502 - .721451185 .021909417 .735587105 .020505904 .750000000 .019192300 10027502 - .762199123 .018145682 .771478506 .017398347 .785609830 .016334658 10027502 - .800000000 .015336000 .809011594 .014739339 .825026832 .013750494 10027502 - .837245975 .013052646 .855914849 .012071713 .875000000 .011164500 10027502 - .887411968 .010614713 .900000000 .010092000 .911931455 .009620359 10027502 - .922501162 .009225789 .941293786 .008573833 .955639064 .008115282 10027502 - .966541311 .007787536 .983128329 .007320567 1.00000000 .006881600 10027502 - 1.01483180 .006516539 1.02798997 .006213033 1.03964325 .005959083 10027502 - 1.06035524 .005539393 1.07615958 .005244139 1.08816722 .005033072 10027502 - 1.10643036 .004732294 1.12500000 .004449490 1.13991433 .004234667 10027502 - 1.15312647 .004055222 1.17661725 .003759296 1.19454885 .003551612 10027502 - 1.20817666 .003403413 1.22891043 .003192629 1.25000000 .002994900 10027502 - 1.27202968 .002802163 1.29162391 .002643720 1.30901629 .002512450 10027502 - 1.32442663 .002402946 1.35183253 .002222674 1.37275848 .002096402 10027502 - 1.38866525 .002006428 1.41287165 .001878656 1.43750000 .001759020 10027502 - 1.45287653 .001688626 1.47625025 .001588282 1.50000000 .001493900 10027502 - 1.52918352 .001386635 1.55518449 .001299115 1.57829775 .001227079 10027502 - 1.59880345 .001167332 1.61696437 .001117444 1.64924377 .001035216 10027502 - 1.67387550 9.77541E-4 1.69259042 9.36403E-4 1.72105586 8.77920E-4 10027502 - 1.75000000 8.23089E-4 1.77945514 7.71234E-4 1.80563480 7.28548E-4 10027502 - 1.82885775 6.93140E-4 1.84942272 6.63573E-4 1.88596940 6.14833E-4 10027502 - 1.91385258 5.80642E-4 1.93503517 5.56252E-4 1.96724944 5.21575E-4 10027502 - 2.00000000 4.89060E-4 2.02808836 4.62987E-4 2.05477937 4.39808E-4 10027502 - 2.08012112 4.19132E-4 2.10416280 4.00632E-4 2.12695417 3.84031E-4 10027502 - 2.17035546 3.54735E-4 2.20905746 3.30941E-4 2.24348742 3.11433E-4 10027502 - 2.27405354 2.95310E-4 2.30114033 2.81889E-4 2.32510579 2.70646E-4 10027502 - 2.36764749 2.52040E-4 2.40006379 2.38929E-4 2.42466695 2.29546E-4 10027502 - 2.46204537 2.16158E-4 2.50000000 2.03550E-4 2.52865068 1.94586E-4 10027502 - 2.55580883 1.86542E-4 2.60751898 1.72344E-4 2.65362287 1.60810E-4 10027502 - 2.69463198 1.51353E-4 2.73103449 1.43536E-4 2.76328987 1.37027E-4 10027502 - 2.79182568 1.31575E-4 2.84247425 1.22550E-4 2.88106276 1.16190E-4 10027502 - 2.91034754 1.11638E-4 2.95483378 1.05141E-4 3.00000000 9.90230E-5 10027502 - 3.05836704 9.17382E-5 3.11036897 8.58050E-5 3.15659547 8.09291E-5 10027502 - 3.19760688 7.68905E-5 3.23392871 7.35224E-5 3.29848751 6.79794E-5 10027502 - 3.34775097 6.40981E-5 3.38518081 6.13333E-5 3.44211169 5.74080E-5 10027502 - 3.50000000 5.37340E-5 3.55891027 5.02851E-5 3.61126957 4.74494E-5 10027502 - 3.65771548 4.50996E-5 3.69884540 4.31392E-5 3.77193877 3.99114E-5 10027502 - 3.82770513 3.76500E-5 3.87007030 3.60384E-5 3.93449886 3.37495E-5 10027502 - 4.00000000 3.16060E-5 4.05617672 2.98986E-5 4.10955872 2.83818E-5 10027502 - 4.16024222 2.70298E-5 4.20832556 2.58208E-5 4.25390829 2.47365E-5 10027502 - 4.29709041 2.37614E-5 4.37924186 2.20355E-5 4.45241171 2.06285E-5 10027502 - 4.51743750 1.94712E-5 4.57511363 1.85120E-5 4.62618399 1.77115E-5 10027502 - 4.71693267 1.63931E-5 4.78616052 1.54691E-5 4.83874735 1.48104E-5 10027502 - 4.91871292 1.38747E-5 5.00000000 1.29980E-5 5.05730135 1.24206E-5 10027502 - 5.11161764 1.19026E-5 5.21503794 1.09888E-5 5.30724571 1.02470E-5 10027502 - 5.38926393 9.63916E-6 5.46206895 9.13692E-6 5.52657970 8.71898E-6 10027502 - 5.58365132 8.36899E-6 5.68494845 7.78998E-6 5.76212547 7.38216E-6 10027502 - 5.82069504 7.09037E-6 5.90966753 6.67417E-6 6.00000000 6.28240E-6 10027502 - 6.11673407 5.81734E-6 6.22073793 5.43874E-6 6.31319091 5.12774E-6 10027502 - 6.39521373 4.87023E-6 6.46785739 4.65554E-6 6.59697499 4.30236E-6 10027502 - 6.69550191 4.05517E-6 6.77036159 3.87915E-6 6.88422336 3.62933E-6 10027502 - 7.00000000 3.39560E-6 7.11782054 3.17664E-6 7.22253913 2.99667E-6 10027502 - 7.31543094 2.84758E-6 7.39769078 2.72322E-6 7.54387750 2.51852E-6 10027502 - 7.65541023 2.37516E-6 7.74014057 2.27302E-6 7.86899769 2.12798E-6 10027502 - 8.00000000 1.99220E-6 8.11235343 1.88422E-6 8.21911742 1.78832E-6 10027502 - 8.32048441 1.70284E-6 8.41665108 1.62643E-6 8.50781654 1.55790E-6 10027502 - 8.59418077 1.49628E-6 8.75848367 1.38724E-6 8.90482336 1.29837E-6 10027502 - 9.03487495 1.22529E-6 9.15022721 1.16473E-6 9.25236791 1.11420E-6 10027502 - 9.43386529 1.03099E-6 9.57232099 9.72685E-7 9.67749466 9.31131E-7 10027502 - 9.83742582 8.72105E-7 10.0000000 8.16820E-7 10.1275141 7.76477E-7 10027502 - 10.2525937 7.39296E-7 10.3752375 7.04975E-7 10.4954476 6.73247E-7 10027502 - 10.6132291 6.43873E-7 10.7285903 6.16640E-7 10.8415421 5.91357E-7 10027502 - 10.9520979 5.67852E-7 11.1695183 5.24938E-7 11.3772683 4.87656E-7 10027502 - 11.5755419 4.55113E-7 11.7645604 4.26579E-7 11.9445675 4.01455E-7 10027502 - 12.1158248 3.79247E-7 12.2786079 3.59544E-7 12.4332028 3.42003E-7 10027502 - 12.5799028 3.26336E-7 12.7190057 3.12301E-7 12.8508113 2.99692E-7 10027502 - 13.1016393 2.77406E-7 13.3251266 2.59269E-7 13.5238030 2.44375E-7 10027502 - 13.7000733 2.32046E-7 13.8561935 2.21770E-7 14.1336968 2.04869E-7 10027502 - 14.3454655 1.93045E-7 14.5063717 1.84626E-7 14.7511212 1.72682E-7 10027502 - 15.0000000 1.61510E-7 15.2721413 1.50305E-7 15.5317562 1.40508E-7 10027502 - 15.7791519 1.31903E-7 16.0146630 1.24316E-7 16.2386462 1.17600E-7 10027502 - 16.4514747 1.11633E-7 16.6535340 1.06314E-7 16.8452180 1.01559E-7 10027502 - 17.0269250 9.72936E-8 17.1990550 9.34578E-8 17.5265027 8.66688E-8 10027502 - 17.8181293 8.11341E-8 18.0772804 7.65821E-8 18.3071277 7.28090E-8 10027502 - 18.5106400 6.96604E-8 18.8722455 6.44744E-8 19.1480778 6.08398E-8 10027502 - 19.3575945 5.82490E-8 19.6761757 5.45682E-8 20.0000000 5.11200E-8 10027502 - 20.2177858 4.89529E-8 20.4344848 4.69094E-8 20.6500663 4.49812E-8 10027502 - 20.8645005 4.31605E-8 21.0777588 4.14403E-8 21.2898138 3.98140E-8 10027502 - 21.7135518 3.67962E-8 22.1320889 3.40911E-8 22.5452385 3.16603E-8 10027502 - 22.9528303 2.94708E-8 23.3547106 2.74943E-8 23.7507410 2.57060E-8 10027502 - 24.1407984 2.40846E-8 24.5247741 2.26115E-8 24.9025738 2.12704E-8 10027502 - 25.2741163 2.00471E-8 25.6393335 1.89292E-8 25.9981696 1.79056E-8 10027502 - 26.3505805 1.69669E-8 26.6965334 1.61045E-8 27.0360059 1.53108E-8 10027502 - 27.3689858 1.45793E-8 27.6954704 1.39039E-8 28.0154659 1.32796E-8 10027502 - 28.3289868 1.27014E-8 28.6360557 1.21654E-8 28.9367024 1.16677E-8 10027502 - 29.2309635 1.12050E-8 29.8096369 1.03600E-8 30.3625431 9.62583E-9 10027502 - 30.8902029 8.98485E-9 31.3932092 8.42276E-9 31.8722140 7.92777E-9 10027502 - 32.3279167 7.49017E-9 32.7610537 7.10189E-9 33.1723887 6.75617E-9 10027502 - 33.5627046 6.44736E-9 33.9327956 6.17068E-9 34.2834615 5.92209E-9 10027502 - 34.9507566 5.48266E-9 35.5452857 5.12499E-9 36.0737887 4.83122E-9 10027502 - 36.5426710 4.58802E-9 36.9579396 4.38528E-9 37.6960472 4.05181E-9 10027502 - 38.2592858 3.81845E-9 38.6872306 3.65230E-9 39.3381396 3.41653E-9 10027502 - 40.0000000 3.19598E-9 40.5617672 3.02259E-9 41.0955872 2.86859E-9 10027502 - 41.6024222 2.73134E-9 42.0832556 2.60865E-9 42.5390829 2.49863E-9 10027502 - 42.9709041 2.39971E-9 43.7924186 2.22467E-9 44.5241171 2.08201E-9 10027502 - 45.1743750 1.96471E-9 45.7511363 1.86750E-9 46.2618399 1.78640E-9 10027502 - 47.1693267 1.65286E-9 47.8616052 1.55930E-9 48.3874735 1.49262E-9 10027502 - 49.1871292 1.39790E-9 50.0000000 1.30920E-9 50.7398004 1.23450E-9 10027502 - 51.4669188 1.16620E-9 52.1812498 1.10364E-9 52.8827111 1.04624E-9 10027502 - 53.5712428 9.9348E-10 54.2468054 9.4491E-10 54.9093798 9.0012E-10 10027502 - 55.5589650 8.5876E-10 56.1955780 8.2050E-10 56.8192521 7.8506E-10 10027502 - 57.4300364 7.5220E-10 58.0279940 7.2167E-10 58.6132019 6.9328E-10 10027502 - 59.7638898 6.4140E-10 60.8631677 5.9631E-10 61.9120975 5.5691E-10 10027502 - 62.9118813 5.2234E-10 63.8638366 4.9189E-10 64.7693729 4.6495E-10 10027502 - 65.6299709 4.4104E-10 66.4471637 4.1974E-10 67.2225209 4.0071E-10 10027502 - 67.9576332 3.8365E-10 68.6541002 3.6832E-10 69.9792717 3.4120E-10 10027502 - 71.1597625 3.1912E-10 72.2090161 3.0097E-10 73.1397966 2.8594E-10 10027502 - 73.9640662 2.7340E-10 75.4289533 2.5278E-10 76.5466269 2.3833E-10 10027502 - 77.3957371 2.2805E-10 78.6870953 2.1344E-10 80.0000000 1.9977E-10 10027502 - 81.1235343 1.8893E-10 82.1911742 1.7930E-10 83.2048441 1.7073E-10 10027502 - 84.1665108 1.6306E-10 85.0781654 1.5618E-10 85.9418077 1.4999E-10 10027502 - 87.5848367 1.3905E-10 89.0482336 1.3014E-10 90.3487495 1.2280E-10 10027502 - 91.5022721 1.1673E-10 92.5236791 1.1166E-10 94.3386529 1.0331E-10 10027502 - 95.7232099 9.7461E-11 96.7749466 9.3293E-11 98.3742582 8.7373E-11 10027502 - 100.000000 8.1828E-11 101.088930 7.8359E-11 102.172425 7.5087E-11 10027502 - 103.250333 7.2001E-11 104.322504 6.9086E-11 105.388797 6.6332E-11 10027502 - 106.449072 6.3729E-11 108.567762 5.8898E-11 110.660448 5.4567E-11 10027502 - 112.726196 5.0676E-11 114.764156 4.7171E-11 116.773558 4.4007E-11 10027502 - 118.753710 4.1145E-11 120.703998 3.8549E-11 122.623877 3.6191E-11 10027502 - 124.512876 3.4044E-11 126.370589 3.2086E-11 128.196675 3.0297E-11 10027502 - 129.990856 2.8658E-11 131.752911 2.7156E-11 133.482675 2.5775E-11 10027502 - 135.180038 2.4505E-11 136.844938 2.3334E-11 138.477361 2.2253E-11 10027502 - 140.077339 2.1254E-11 141.644944 2.0328E-11 143.180288 1.9470E-11 10027502 - 144.683522 1.8674E-11 146.154828 1.7933E-11 149.048195 1.6580E-11 10027502 - 151.812726 1.5405E-11 154.451025 1.4379E-11 156.966056 1.3480E-11 10027502 - 159.361080 1.2687E-11 161.639594 1.1987E-11 163.805279 1.1366E-11 10027502 - 165.861954 1.0812E-11 167.813533 1.0318E-11 169.663988 9.8752E-12 10027502 - 171.417317 9.4773E-12 174.753792 8.7740E-12 177.726437 8.2015E-12 10027502 - 180.368952 7.7314E-12 182.713363 7.3421E-12 184.789705 7.0177E-12 10027502 - 188.480242 6.4840E-12 191.296434 6.1105E-12 193.436157 5.8446E-12 10027502 - 196.690700 5.4672E-12 200.000000 5.1143E-12 202.177858 4.8974E-12 10027502 - 204.344848 4.6930E-12 206.500663 4.5001E-12 208.645005 4.3179E-12 10027502 - 210.777588 4.1458E-12 212.898138 3.9831E-12 217.135518 3.6811E-12 10027502 - 221.320889 3.4105E-12 225.452385 3.1673E-12 229.528303 2.9482E-12 10027502 - 233.547106 2.7505E-12 237.507410 2.5716E-12 241.407984 2.4093E-12 10027502 - 245.247741 2.2620E-12 249.025738 2.1278E-12 252.741163 2.0054E-12 10027502 - 256.393335 1.8936E-12 259.981696 1.7912E-12 263.505805 1.6972E-12 10027502 - 266.965334 1.6110E-12 270.360059 1.5316E-12 273.689858 1.4584E-12 10027502 - 276.954704 1.3908E-12 280.154659 1.3284E-12 283.289868 1.2705E-12 10027502 - 286.360557 1.2169E-12 289.367024 1.1671E-12 292.309635 1.1208E-12 10027502 - 298.096369 1.0363E-12 303.625431 9.6284E-13 308.902029 8.9871E-13 10027502 - 313.932092 8.4248E-13 318.722140 7.9297E-13 323.279167 7.4919E-13 10027502 - 327.610537 7.1035E-13 331.723887 6.7577E-13 335.627046 6.4488E-13 10027502 - 339.327956 6.1720E-13 342.834615 5.9233E-13 349.507566 5.4838E-13 10027502 - 355.452857 5.1260E-13 360.737887 4.8321E-13 365.426710 4.5888E-13 10027502 - 369.579396 4.3861E-13 376.960472 4.0525E-13 382.592858 3.8191E-13 10027502 - 386.872306 3.6529E-13 393.381396 3.4170E-13 400.000000 3.1964E-13 10027502 - 404.355715 3.0609E-13 408.689695 2.9331E-13 413.001323 2.8125E-13 10027502 - 417.290006 2.6987E-13 421.555172 2.5911E-13 425.796271 2.4894E-13 10027502 - 434.271030 2.3007E-13 442.641771 2.1316E-13 450.904761 1.9795E-13 10027502 - 459.056597 1.8426E-13 467.094202 1.7190E-13 475.014809 1.6072E-13 10027502 - 482.815956 1.5058E-13 490.495471 1.4137E-13 498.051463 1.3299E-13 10027502 - 505.482313 1.2534E-13 512.786656 1.1835E-13 519.963377 1.1195E-13 10027502 - 527.011595 1.0608E-13 533.930651 1.0069E-13 540.720100 9.5723E-14 10027502 - 547.379698 9.1149E-14 553.909390 8.6926E-14 560.309299 8.3022E-14 10027502 - 566.579717 7.9408E-14 572.721094 7.6056E-14 578.734026 7.2944E-14 10027502 - 584.619249 7.0051E-14 596.192717 6.4768E-14 607.250840 6.0177E-14 10027502 - 617.804037 5.6170E-14 627.864163 5.2655E-14 637.444259 4.9561E-14 10027502 - 646.558314 4.6825E-14 655.221054 4.4397E-14 663.447754 4.2236E-14 10027502 - 671.254071 4.0305E-14 678.655892 3.8575E-14 685.669209 3.7021E-14 10027502 - 699.015113 3.4274E-14 710.905695 3.2037E-14 721.475758 3.0201E-14 10027502 - 730.853404 2.8680E-14 739.158778 2.7413E-14 753.920932 2.5328E-14 10027502 - 765.185705 2.3869E-14 773.744604 2.2831E-14 786.762788 2.1357E-14 10027502 - 800.000000 1.9978E-14 811.235343 1.8894E-14 821.911742 1.7931E-14 10027502 - 832.048441 1.7073E-14 841.665108 1.6306E-14 850.781654 1.5618E-14 10027502 - 859.418077 1.5000E-14 875.848367 1.3906E-14 890.482336 1.3014E-14 10027502 - 903.487495 1.2281E-14 915.022721 1.1673E-14 925.236791 1.1166E-14 10027502 - 943.386529 1.0331E-14 957.232099 9.7463E-15 967.749466 9.3294E-15 10027502 - 983.742582 8.7374E-15 1000.00000 8.1829E-15 1010.88930 7.8360E-15 10027502 - 1021.72425 7.5088E-15 1032.50333 7.2001E-15 1043.22504 6.9087E-15 10027502 - 1053.88797 6.6333E-15 1064.49072 6.3729E-15 1085.67762 5.8898E-15 10027502 - 1106.60448 5.4568E-15 1127.26196 5.0677E-15 1147.64156 4.7172E-15 10027502 - 1167.73558 4.4008E-15 1187.53710 4.1145E-15 1207.03998 3.8550E-15 10027502 - 1226.23877 3.6192E-15 1245.12876 3.4045E-15 1263.70589 3.2087E-15 10027502 - 1281.96675 3.0297E-15 1299.90856 2.8659E-15 1317.52911 2.7156E-15 10027502 - 1334.82675 2.5776E-15 1351.80038 2.4505E-15 1368.44938 2.3334E-15 10027502 - 1384.77361 2.2253E-15 1400.77339 2.1254E-15 1416.44944 2.0328E-15 10027502 - 1431.80288 1.9470E-15 1446.83522 1.8674E-15 1461.54828 1.7933E-15 10027502 - 1490.48195 1.6581E-15 1518.12726 1.5405E-15 1544.51025 1.4380E-15 10027502 - 1569.66056 1.3480E-15 1593.61080 1.2688E-15 1616.39594 1.1987E-15 10027502 - 1638.05279 1.1366E-15 1658.61954 1.0812E-15 1678.13533 1.0318E-15 10027502 - 1696.63988 9.8753E-16 1714.17317 9.4774E-16 1747.53792 8.7741E-16 10027502 - 1777.26437 8.2016E-16 1803.68952 7.7314E-16 1827.13363 7.3422E-16 10027502 - 1847.89705 7.0177E-16 1884.80242 6.4840E-16 1912.96434 6.1105E-16 10027502 - 1934.36157 5.8446E-16 1966.90700 5.4673E-16 2000.00000 5.1143E-16 10027502 - 2021.77858 4.8975E-16 2043.44848 4.6930E-16 2065.00663 4.5001E-16 10027502 - 2086.45005 4.3179E-16 2107.77588 4.1458E-16 2128.98138 3.9831E-16 10027502 - 2171.35518 3.6812E-16 2213.20889 3.4105E-16 2254.52385 3.1673E-16 10027502 - 2295.28303 2.9482E-16 2335.47106 2.7505E-16 2375.07410 2.5716E-16 10027502 - 2414.07984 2.4094E-16 2452.47741 2.2620E-16 2490.25738 2.1278E-16 10027502 - 2527.41163 2.0054E-16 2563.93335 1.8936E-16 2599.81696 1.7912E-16 10027502 - 2635.05805 1.6973E-16 2669.65334 1.6110E-16 2703.60059 1.5316E-16 10027502 - 2736.89858 1.4584E-16 2769.54704 1.3908E-16 2801.54659 1.3284E-16 10027502 - 2832.89868 1.2705E-16 2863.60557 1.2169E-16 2893.67024 1.1671E-16 10027502 - 2923.09635 1.1208E-16 2980.96369 1.0363E-16 3036.25431 9.6284E-17 10027502 - 3089.02029 8.9872E-17 3139.32092 8.4249E-17 3187.22140 7.9297E-17 10027502 - 3232.79167 7.4920E-17 3276.10537 7.1036E-17 3317.23887 6.7577E-17 10027502 - 3356.27046 6.4488E-17 3393.27956 6.1720E-17 3428.34615 5.9234E-17 10027502 - 3495.07566 5.4838E-17 3554.52857 5.1260E-17 3607.37887 4.8321E-17 10027502 - 3654.26710 4.5889E-17 3695.79396 4.3861E-17 3769.60472 4.0525E-17 10027502 - 3825.92858 3.8191E-17 3868.72306 3.6529E-17 3933.81396 3.4171E-17 10027502 - 4000.00000 3.1964E-17 4043.55715 3.0609E-17 4086.89695 2.9331E-17 10027502 - 4130.01323 2.8126E-17 4172.90006 2.6987E-17 4215.55172 2.5911E-17 10027502 - 4257.96271 2.4894E-17 4342.71030 2.3007E-17 4426.41771 2.1316E-17 10027502 - 4509.04761 1.9796E-17 4590.56597 1.8426E-17 4670.94202 1.7191E-17 10027502 - 4750.14809 1.6072E-17 4828.15956 1.5058E-17 4904.95471 1.4137E-17 10027502 - 4980.51463 1.3299E-17 5054.82313 1.2534E-17 5127.86656 1.1835E-17 10027502 - 5199.63377 1.1195E-17 5270.11595 1.0608E-17 5339.30651 1.0069E-17 10027502 - 5407.20100 9.5723E-18 5473.79698 9.1149E-18 5539.09390 8.6927E-18 10027502 - 5603.09299 8.3023E-18 5665.79717 7.9408E-18 5727.21094 7.6056E-18 10027502 - 5787.34026 7.2944E-18 5846.19249 7.0051E-18 5961.92717 6.4768E-18 10027502 - 6072.50840 6.0178E-18 6178.04037 5.6170E-18 6278.64163 5.2656E-18 10027502 - 6374.44259 4.9561E-18 6465.58314 4.6825E-18 6552.21054 4.4397E-18 10027502 - 6634.47754 4.2236E-18 6712.54071 4.0305E-18 6786.55892 3.8575E-18 10027502 - 6856.69209 3.7021E-18 6990.15113 3.4274E-18 7109.05695 3.2038E-18 10027502 - 7214.75758 3.0201E-18 7308.53404 2.8680E-18 7391.58778 2.7413E-18 10027502 - 7539.20932 2.5328E-18 7651.85705 2.3869E-18 7737.44604 2.2831E-18 10027502 - 7867.62788 2.1357E-18 8000.00000 1.9978E-18 8087.11430 1.9131E-18 10027502 - 8173.79388 1.8332E-18 8260.02643 1.7578E-18 8345.80008 1.6867E-18 10027502 - 8431.10340 1.6195E-18 8515.92537 1.5559E-18 8685.42054 1.4380E-18 10027502 - 8852.83537 1.3322E-18 9018.09515 1.2372E-18 9181.13188 1.1517E-18 10027502 - 9341.88397 1.0744E-18 9500.29611 1.0045E-18 9656.31906 9.4115E-19 10027502 - 9809.90937 8.8358E-19 9961.02925 8.3117E-19 10109.6463 7.8336E-19 10027502 - 10255.7333 7.3967E-19 10399.2678 6.9967E-19 10540.2322 6.6299E-19 10027502 - 10678.6134 6.2929E-19 10814.4024 5.9827E-19 10947.5945 5.6968E-19 10027502 - 11078.1884 5.4329E-19 11206.1866 5.1889E-19 11331.5950 4.9630E-19 10027502 - 11454.4226 4.7535E-19 11574.6813 4.5590E-19 11692.3858 4.3782E-19 10027502 - 11923.8552 4.0480E-19 12145.0177 3.7611E-19 12356.0817 3.5106E-19 10027502 - 12557.2842 3.2910E-19 12748.8862 3.0975E-19 12931.1673 2.9266E-19 10027502 - 13104.4221 2.7748E-19 13268.9562 2.6397E-19 13425.0825 2.5191E-19 10027502 - 13573.1190 2.4110E-19 13713.3853 2.3138E-19 13980.3033 2.1421E-19 10027502 - 14218.1149 2.0023E-19 14429.5162 1.8876E-19 14617.0690 1.7925E-19 10027502 - 14783.1765 1.7133E-19 15078.4194 1.5830E-19 15303.7147 1.4918E-19 10027502 - 15474.8926 1.4269E-19 15735.2561 1.3348E-19 16000.0000 1.2486E-19 10027502 - 16174.2287 1.1957E-19 16347.5879 1.1458E-19 16520.0531 1.0987E-19 10027502 - 16691.6005 1.0542E-19 16862.2072 1.0122E-19 17031.8512 9.7243E-20 10027502 - 17370.8416 8.9872E-20 17705.6713 8.3264E-20 18036.1909 7.7326E-20 10027502 - 18362.2644 7.1978E-20 18683.7687 6.7151E-20 19000.5930 6.2783E-20 10027502 - 19312.6389 5.8822E-20 19619.8196 5.5224E-20 19922.0593 5.1948E-20 10027502 - 20219.2933 4.8960E-20 20511.4671 4.6230E-20 20798.5360 4.3730E-20 10027502 - 21080.4647 4.1437E-20 21357.2270 3.9330E-20 21628.8050 3.7392E-20 10027502 - 21895.1890 3.5605E-20 22156.3767 3.3956E-20 22412.3731 3.2431E-20 10027502 - 22663.1898 3.1019E-20 22908.8450 2.9709E-20 23149.3623 2.8494E-20 10027502 - 23384.7712 2.7364E-20 23847.7099 2.5300E-20 24290.0349 2.3507E-20 10027502 - 24712.1627 2.1941E-20 25114.5678 2.0569E-20 25497.7716 1.9360E-20 10027502 - 25862.3338 1.8291E-20 26208.8434 1.7343E-20 26537.9114 1.6498E-20 10027502 - 26850.1641 1.5744E-20 27146.2369 1.5068E-20 27426.7696 1.4461E-20 10027502 - 27960.6056 1.3388E-20 28436.2289 1.2515E-20 28859.0313 1.1797E-20 10027502 - 29234.1371 1.1203E-20 29566.3520 1.0708E-20 30156.8380 9.8938E-21 10027502 - 30607.4288 9.3239E-21 30949.7846 8.9182E-21 31470.5118 8.3424E-21 10027502 - 32000.0000 7.8038E-21 32348.4573 7.4730E-21 32695.1756 7.1610E-21 10027502 - 33040.1059 6.8666E-21 33383.2006 6.5886E-21 33724.4139 6.3260E-21 10027502 - 34063.7018 6.0777E-21 34741.6825 5.6170E-21 35411.3418 5.2040E-21 10027502 - 36072.3810 4.8329E-21 36724.5280 4.4987E-21 37367.5363 4.1969E-21 10027502 - 38001.1849 3.9239E-21 38625.2767 3.6764E-21 39239.6379 3.4515E-21 10027502 - 39844.1173 3.2468E-21 40438.5853 3.0600E-21 41022.9328 2.8894E-21 10027502 - 41597.0705 2.7331E-21 42160.9279 2.5898E-21 42714.4524 2.4581E-21 10027502 - 43257.6084 2.3370E-21 43790.3762 2.2253E-21 44312.7515 2.1222E-21 10027502 - 44824.7443 2.0269E-21 45326.3777 1.9387E-21 45817.6879 1.8568E-21 10027502 - 46298.7225 1.7809E-21 46769.5404 1.7102E-21 47695.4178 1.5813E-21 10027502 - 48580.0676 1.4692E-21 49424.3233 1.3713E-21 50229.1334 1.2855E-21 10027502 - 50995.5411 1.2100E-21 51724.6655 1.1432E-21 52417.6847 1.0839E-21 10027502 - 53075.8208 1.0311E-21 53700.3261 9.8401E-22 54292.4718 9.4178E-22 10027502 - 54853.5371 9.0383E-22 55921.2094 8.3676E-22 56872.4560 7.8217E-22 10027502 - 57718.0610 7.3733E-22 58468.2727 7.0021E-22 59132.7025 6.6926E-22 10027502 - 60313.6748 6.1836E-22 61214.8566 5.8275E-22 61899.5685 5.5739E-22 10027502 - 62941.0231 5.2140E-22 64000.0000 4.8774E-22 64696.9144 4.6706E-22 10027502 - 65390.3511 4.4756E-22 66080.2115 4.2916E-22 66766.4007 4.1179E-22 10027502 - 67448.8273 3.9538E-22 68127.4030 3.7986E-22 69483.3644 3.5106E-22 10027502 - 70822.6830 3.2525E-22 72144.7612 3.0206E-22 73449.0550 2.8117E-22 10027502 - 74735.0717 2.6231E-22 76002.3688 2.4524E-22 77250.5522 2.2977E-22 10027502 - 78479.2746 2.1572E-22 79688.2334 2.0292E-22 80877.1693 1.9125E-22 10027502 - 82045.8642 1.8058E-22 83194.1396 1.7082E-22 84321.8543 1.6186E-22 10027502 - 85428.9033 1.5363E-22 86515.2152 1.4606E-22 87580.7508 1.3908E-22 10027502 - 88625.5014 1.3264E-22 89649.4868 1.2668E-22 90652.7537 1.2117E-22 10027502 - 91635.3741 1.1605E-22 92597.4433 1.1130E-22 93539.0789 1.0689E-22 10027502 - 95390.8339 9.8828E-23 97160.1338 9.1824E-23 98848.6455 8.5709E-23 10027502 - 100458.267 8.0346E-23 101991.083 7.5624E-23 103449.332 7.1449E-23 10027502 - 104835.371 6.7745E-23 106151.644 6.4447E-23 107400.655 6.1501E-23 10027502 - 108584.947 5.8861E-23 109707.078 5.6490E-23 111842.423 5.2298E-23 10027502 - 113744.917 4.8885E-23 115436.127 4.6083E-23 116936.550 4.3763E-23 10027502 - 118265.410 4.1829E-23 120627.354 3.8648E-23 122429.717 3.6422E-23 10027502 - 123799.141 3.4837E-23 125882.048 3.2588E-23 128000.000 3.0484E-23 10027502 - 129393.830 2.9191E-23 130780.704 2.7973E-23 132160.425 2.6823E-23 10027502 - 133532.805 2.5737E-23 134897.658 2.4711E-23 136254.811 2.3741E-23 10027502 - 138966.734 2.1941E-23 141645.372 2.0328E-23 144289.529 1.8879E-23 10027502 - 146898.117 1.7573E-23 149470.151 1.6394E-23 152004.746 1.5328E-23 10027502 - 154501.114 1.4361E-23 156958.559 1.3482E-23 159376.477 1.2683E-23 10027502 - 161754.349 1.1953E-23 164091.740 1.1287E-23 166388.291 1.0676E-23 10027502 - 168643.721 1.0116E-23 170857.820 9.6021E-24 173030.444 9.1289E-24 10027502 - 175161.515 8.6927E-24 177251.017 8.2900E-24 179298.988 7.9176E-24 10027502 - 181305.523 7.5729E-24 183270.764 7.2533E-24 185194.902 6.9565E-24 10027502 - 187078.174 6.6806E-24 190781.684 6.1768E-24 194320.283 5.7390E-24 10027502 - 197697.306 5.3568E-24 200916.546 5.0216E-24 203982.177 4.7265E-24 10027502 - 206898.674 4.4656E-24 209670.751 4.2340E-24 212303.295 4.0279E-24 10027502 - 214801.317 3.8438E-24 217169.899 3.6788E-24 219414.161 3.5306E-24 10027502 - 223684.849 3.2686E-24 227489.835 3.0553E-24 230872.254 2.8802E-24 10027502 - 233873.100 2.7352E-24 236530.819 2.6143E-24 241254.706 2.4155E-24 10027502 - 244859.432 2.2764E-24 247598.279 2.1773E-24 251764.095 2.0367E-24 10027502 - 256000.000 1.9052E-24 258787.658 1.8245E-24 261561.405 1.7483E-24 10027502 - 264320.848 1.6764E-24 267065.605 1.6086E-24 269795.312 1.5444E-24 10027502 - 272509.616 1.4838E-24 277933.462 1.3713E-24 283290.736 1.2705E-24 10027502 - 288579.050 1.1799E-24 293796.225 1.0983E-24 298940.293 1.0246E-24 10027502 - 304009.482 9.5799E-25 309002.216 8.9755E-25 313917.106 8.4265E-25 10027502 - 318752.941 7.9267E-25 323508.685 7.4707E-25 328183.465 7.0541E-25 10027502 - 332776.567 6.6726E-25 337287.426 6.3228E-25 341715.623 6.0013E-25 10027502 - 346060.870 5.7055E-25 350323.013 5.4329E-25 354502.016 5.1812E-25 10027502 - 358597.958 4.9485E-25 362611.026 4.7331E-25 366541.507 4.5333E-25 10027502 - 370389.784 4.3478E-25 374156.327 4.1754E-25 381563.346 3.8605E-25 10027502 - 388640.545 3.5869E-25 395394.591 3.3480E-25 401833.072 3.1385E-25 10027502 - 407964.333 2.9541E-25 413797.328 2.7910E-25 419341.482 2.6463E-25 10027502 - 424606.570 2.5174E-25 429602.613 2.4024E-25 434339.778 2.2993E-25 10027502 - 438828.301 2.2066E-25 447369.679 2.0429E-25 454979.651 1.9096E-25 10027502 - 461744.491 1.8001E-25 467746.184 1.7095E-25 473061.623 1.6339E-25 10027502 - 482509.401 1.5097E-25 489718.855 1.4227E-25 495196.549 1.3608E-25 10027502 - 503528.186 1.2730E-25 512000.000 1.1908E-25 517383.553 1.1420E-25 10027502 - 522738.271 1.0959E-25 528063.447 1.0524E-25 538706.438 9.7162E-26 10027502 - 549221.350 8.9933E-26 559603.350 8.3442E-26 569848.024 7.7602E-26 10027502 - 579951.368 7.2334E-26 589909.773 6.7572E-26 599720.013 6.3258E-26 10027502 - 609379.234 5.9341E-26 618884.937 5.5779E-26 628234.964 5.2531E-26 10027502 - 637427.489 4.9566E-26 646460.996 4.6853E-26 655334.270 4.4367E-26 10027502 - 664046.383 4.2084E-26 672596.674 3.9984E-26 680984.742 3.8050E-26 10027502 - 689210.426 3.6266E-26 697273.796 3.4617E-26 705175.135 3.3092E-26 10027502 - 712914.930 3.1678E-26 720493.857 3.0366E-26 727912.767 2.9147E-26 10027502 - 742504.993 2.6922E-26 756450.767 2.4991E-26 769762.724 2.3307E-26 10027502 - 782455.364 2.1831E-26 794544.726 2.0532E-26 806048.090 1.9385E-26 10027502 - 816983.704 1.8368E-26 827370.548 1.7463E-26 837228.116 1.6655E-26 10027502 - 846576.224 1.5931E-26 855434.848 1.5281E-26 872295.378 1.4134E-26 10027502 - 887320.725 1.3200E-26 900680.059 1.2434E-26 912534.367 1.1801E-26 10027502 - 923034.803 1.1273E-26 932321.753 1.0830E-26 948799.317 1.0097E-26 10027502 - 961348.322 9.5804E-27 980483.719 8.8541E-27 1000000.00 8.1829E-27 10027502 - 1010889.30 7.8360E-27 1021724.25 7.5088E-27 1032503.33 7.2001E-27 10027502 - 1043225.04 6.9087E-27 1053887.97 6.6333E-27 1064490.72 6.3729E-27 10027502 - 1085677.62 5.8898E-27 1106604.48 5.4568E-27 1127261.96 5.0677E-27 10027502 - 1147641.56 4.7172E-27 1167735.58 4.4008E-27 1187537.10 4.1145E-27 10027502 - 1207039.98 3.8550E-27 1226238.77 3.6192E-27 1245128.76 3.4045E-27 10027502 - 1263705.89 3.2087E-27 1281966.75 3.0297E-27 1299908.56 2.8659E-27 10027502 - 1317529.11 2.7156E-27 1334826.75 2.5776E-27 1351800.38 2.4505E-27 10027502 - 1368449.38 2.3334E-27 1384773.61 2.2253E-27 1400773.39 2.1254E-27 10027502 - 1416449.44 2.0328E-27 1431802.88 1.9470E-27 1446835.22 1.8674E-27 10027502 - 1461548.28 1.7933E-27 1490481.95 1.6581E-27 1518127.26 1.5405E-27 10027502 - 1544510.25 1.4380E-27 1569660.56 1.3480E-27 1593610.80 1.2688E-27 10027502 - 1616395.94 1.1987E-27 1638052.79 1.1366E-27 1658619.54 1.0812E-27 10027502 - 1678135.33 1.0318E-27 1696639.88 9.8753E-28 1714173.17 9.4774E-28 10027502 - 1747537.92 8.7741E-28 1777264.37 8.2016E-28 1803689.52 7.7314E-28 10027502 - 1827133.63 7.3422E-28 1847897.05 7.0177E-28 1884802.42 6.4840E-28 10027502 - 1912964.34 6.1105E-28 1934361.57 5.8446E-28 1966907.00 5.4673E-28 10027502 - 2000000.00 5.1143E-28 2021778.58 4.8975E-28 2043448.48 4.6930E-28 10027502 - 2065006.63 4.5001E-28 2086450.05 4.3179E-28 2107775.88 4.1458E-28 10027502 - 2128981.38 3.9831E-28 2171355.18 3.6812E-28 2213208.89 3.4105E-28 10027502 - 2254523.85 3.1673E-28 2295283.03 2.9482E-28 2335471.06 2.7505E-28 10027502 - 2375074.10 2.5716E-28 2414079.84 2.4094E-28 2452477.41 2.2620E-28 10027502 - 2490257.38 2.1278E-28 2527411.63 2.0054E-28 2563933.35 1.8936E-28 10027502 - 2599816.96 1.7912E-28 2635058.05 1.6973E-28 2669653.34 1.6110E-28 10027502 - 2703600.59 1.5316E-28 2736898.58 1.4584E-28 2769547.04 1.3908E-28 10027502 - 2801546.59 1.3284E-28 2832898.68 1.2705E-28 2863605.57 1.2169E-28 10027502 - 2893670.24 1.1671E-28 2923096.35 1.1208E-28 2980963.69 1.0363E-28 10027502 - 3036254.31 9.6284E-29 3089020.29 8.9872E-29 3139320.92 8.4249E-29 10027502 - 3187221.40 7.9297E-29 3232791.67 7.4920E-29 3276105.37 7.1036E-29 10027502 - 3317238.87 6.7577E-29 3356270.46 6.4488E-29 3393279.56 6.1720E-29 10027502 - 3428346.15 5.9234E-29 3495075.66 5.4838E-29 3554528.57 5.1260E-29 10027502 - 3607378.87 4.8321E-29 3654267.10 4.5889E-29 3695793.96 4.3861E-29 10027502 - 3769604.72 4.0525E-29 3825928.58 3.8191E-29 3868723.06 3.6529E-29 10027502 - 3933813.96 3.4171E-29 4000000.00 3.1964E-29 4043557.15 3.0609E-29 10027502 - 4086896.95 2.9331E-29 4130013.23 2.8126E-29 4172900.06 2.6987E-29 10027502 - 4215551.72 2.5911E-29 4257962.71 2.4894E-29 4342710.30 2.3007E-29 10027502 - 4426417.71 2.1316E-29 4509047.61 1.9796E-29 4590565.97 1.8426E-29 10027502 - 4670942.02 1.7191E-29 4750148.09 1.6072E-29 4828159.56 1.5058E-29 10027502 - 4904954.71 1.4137E-29 4980514.63 1.3299E-29 5054823.13 1.2534E-29 10027502 - 5127866.56 1.1835E-29 5199633.77 1.1195E-29 5270115.95 1.0608E-29 10027502 - 5339306.51 1.0069E-29 5407201.00 9.5723E-30 5473796.98 9.1149E-30 10027502 - 5539093.90 8.6927E-30 5603092.99 8.3023E-30 5665797.17 7.9408E-30 10027502 - 5727210.94 7.6056E-30 5787340.26 7.2944E-30 5846192.49 7.0051E-30 10027502 - 5961927.17 6.4768E-30 6072508.40 6.0178E-30 6178040.37 5.6170E-30 10027502 - 6278641.63 5.2656E-30 6374442.59 4.9561E-30 6465583.14 4.6825E-30 10027502 - 6552210.54 4.4397E-30 6634477.54 4.2236E-30 6712540.71 4.0305E-30 10027502 - 6786558.92 3.8575E-30 6856692.09 3.7021E-30 6990151.13 3.4274E-30 10027502 - 7109056.95 3.2038E-30 7214757.58 3.0201E-30 7308534.04 2.8680E-30 10027502 - 7391587.78 2.7413E-30 7539209.32 2.5328E-30 7651857.05 2.3869E-30 10027502 - 7737446.04 2.2831E-30 7867627.88 2.1357E-30 8000000.00 1.9978E-30 10027502 - 8087114.30 1.9131E-30 8173793.88 1.8332E-30 8260026.43 1.7578E-30 10027502 - 8345800.08 1.6867E-30 8431103.40 1.6195E-30 8515925.37 1.5559E-30 10027502 - 8685420.54 1.4380E-30 8852835.37 1.3322E-30 9018095.15 1.2372E-30 10027502 - 9181131.88 1.1517E-30 9341883.97 1.0744E-30 9500296.11 1.0045E-30 10027502 - 9656319.06 9.4115E-31 16000000.0 1.2486E-31 32000000.0 7.8038E-33 10027502 - 64000000.0 4.8774E-34 128000000. 3.0484E-35 256000000. 1.9052E-36 10027502 - 512000000. 1.1908E-37 1.00000E+9 8.1829E-39 10027502 - 10027 0 - 1000.00000 .999242000 0 0 0 0 10027504 - 0.0 1.00000000 0 0 1 398 10027504 - 398 2 10027504 - 0.0 0.0 1.00000E-7 4.4097E-13 1.04428E-7 4.8089E-13 10027504 - 1.08758E-7 5.2159E-13 1.12979E-7 5.6287E-13 1.17086E-7 6.0453E-13 10027504 - 1.21071E-7 6.4638E-13 1.28912E-7 7.3281E-13 1.36187E-7 8.1787E-13 10027504 - 1.42890E-7 9.0035E-13 1.49024E-7 9.7932E-13 1.54608E-7 1.0541E-12 10027504 - 1.59664E-7 1.1242E-12 1.68914E-7 1.2582E-12 1.76201E-7 1.3691E-12 10027504 - 1.81872E-7 1.4586E-12 1.90721E-7 1.6040E-12 2.00000E-7 1.7639E-12 10027504 - 2.08856E-7 1.9235E-12 2.17514E-7 2.0863E-12 2.25956E-7 2.2514E-12 10027504 - 2.34168E-7 2.4180E-12 2.42138E-7 2.5854E-12 2.57818E-7 2.9311E-12 10027504 - 2.72369E-7 3.2713E-12 2.85774E-7 3.6013E-12 2.98043E-7 3.9171E-12 10027504 - 3.09209E-7 4.2161E-12 3.19322E-7 4.4964E-12 3.37822E-7 5.0325E-12 10027504 - 3.52397E-7 5.4761E-12 3.63739E-7 5.8343E-12 3.81439E-7 6.4159E-12 10027504 - 4.00000E-7 7.0555E-12 4.17710E-7 7.6941E-12 4.35025E-7 8.3452E-12 10027504 - 4.51909E-7 9.0056E-12 4.68333E-7 9.6720E-12 4.84272E-7 1.0342E-11 10027504 - 5.15632E-7 1.1724E-11 5.44734E-7 1.3085E-11 5.71542E-7 1.4405E-11 10027504 - 5.96079E-7 1.5668E-11 6.18412E-7 1.6864E-11 6.38638E-7 1.7985E-11 10027504 - 6.75638E-7 2.0130E-11 7.04788E-7 2.1904E-11 7.27473E-7 2.3337E-11 10027504 - 7.62876E-7 2.5664E-11 8.00000E-7 2.8222E-11 8.45898E-7 3.1553E-11 10027504 - 8.82041E-7 3.4307E-11 9.39171E-7 3.8895E-11 1.00000E-6 4.4097E-11 10027504 - 1.04428E-6 4.8089E-11 1.08758E-6 5.2159E-11 1.12979E-6 5.6287E-11 10027504 - 1.17086E-6 6.0453E-11 1.21071E-6 6.4638E-11 1.28912E-6 7.3281E-11 10027504 - 1.36187E-6 8.1787E-11 1.42890E-6 9.0035E-11 1.49024E-6 9.7932E-11 10027504 - 1.54608E-6 1.0541E-10 1.59664E-6 1.1242E-10 1.68914E-6 1.2582E-10 10027504 - 1.76201E-6 1.3691E-10 1.81872E-6 1.4586E-10 1.90721E-6 1.6040E-10 10027504 - 2.00000E-6 1.7639E-10 2.08856E-6 1.9235E-10 2.17514E-6 2.0863E-10 10027504 - 2.25956E-6 2.2514E-10 2.34168E-6 2.4180E-10 2.42138E-6 2.5854E-10 10027504 - 2.57818E-6 2.9311E-10 2.72369E-6 3.2713E-10 2.85774E-6 3.6013E-10 10027504 - 2.98043E-6 3.9171E-10 3.09209E-6 4.2161E-10 3.19322E-6 4.4964E-10 10027504 - 3.37822E-6 5.0325E-10 3.52397E-6 5.4761E-10 3.63739E-6 5.8343E-10 10027504 - 3.81439E-6 6.4159E-10 4.00000E-6 7.0555E-10 4.17710E-6 7.6941E-10 10027504 - 4.35025E-6 8.3452E-10 4.51909E-6 9.0056E-10 4.68333E-6 9.6720E-10 10027504 - 4.84272E-6 1.03416E-9 5.15632E-6 1.17243E-9 5.44734E-6 1.30851E-9 10027504 - 5.71542E-6 1.44047E-9 5.96079E-6 1.56681E-9 6.18412E-6 1.68642E-9 10027504 - 6.38638E-6 1.79853E-9 6.75638E-6 2.01297E-9 7.04788E-6 2.19041E-9 10027504 - 7.27473E-6 2.33369E-9 7.62876E-6 2.56635E-9 8.00000E-6 2.82221E-9 10027504 - 8.45898E-6 3.15533E-9 8.82041E-6 3.43073E-9 9.39171E-6 3.88954E-9 10027504 - 1.00000E-5 4.40970E-9 1.04428E-5 4.80889E-9 1.08758E-5 5.21590E-9 10027504 - 1.12979E-5 5.62869E-9 1.17086E-5 6.04530E-9 1.21071E-5 6.46383E-9 10027504 - 1.28912E-5 7.32813E-9 1.36187E-5 8.17867E-9 1.42890E-5 9.00350E-9 10027504 - 1.49024E-5 9.79317E-9 1.54608E-5 1.05407E-8 1.59664E-5 1.12415E-8 10027504 - 1.68914E-5 1.25817E-8 1.76201E-5 1.36907E-8 1.81872E-5 1.45861E-8 10027504 - 1.90721E-5 1.60401E-8 2.00000E-5 1.76388E-8 2.08856E-5 1.92354E-8 10027504 - 2.17514E-5 2.08632E-8 2.25956E-5 2.25142E-8 2.34168E-5 2.41805E-8 10027504 - 2.42138E-5 2.58544E-8 2.57818E-5 2.93114E-8 2.72369E-5 3.27134E-8 10027504 - 2.85774E-5 3.60126E-8 2.98043E-5 3.91711E-8 3.09209E-5 4.21613E-8 10027504 - 3.19322E-5 4.49643E-8 3.37822E-5 5.03251E-8 3.52397E-5 5.47612E-8 10027504 - 3.63739E-5 5.83430E-8 3.81439E-5 6.41594E-8 4.00000E-5 7.05552E-8 10027504 - 4.17710E-5 7.69413E-8 4.35025E-5 8.34523E-8 4.51909E-5 9.00558E-8 10027504 - 4.68333E-5 9.67205E-8 4.84272E-5 1.03416E-7 5.15632E-5 1.17243E-7 10027504 - 5.44734E-5 1.30851E-7 5.71542E-5 1.44047E-7 5.96079E-5 1.56681E-7 10027504 - 6.18412E-5 1.68642E-7 6.38638E-5 1.79853E-7 6.75638E-5 2.01297E-7 10027504 - 7.04788E-5 2.19041E-7 7.27473E-5 2.33369E-7 7.62876E-5 2.56635E-7 10027504 - 8.00000E-5 2.82221E-7 8.45898E-5 3.15533E-7 8.82041E-5 3.43073E-7 10027504 - 9.39171E-5 3.88954E-7 1.00000E-4 4.40970E-7 1.04428E-4 4.80889E-7 10027504 - 1.08758E-4 5.21590E-7 1.12979E-4 5.62869E-7 1.17086E-4 6.04530E-7 10027504 - 1.21071E-4 6.46383E-7 1.28912E-4 7.32813E-7 1.36187E-4 8.17867E-7 10027504 - 1.42890E-4 9.00350E-7 1.49024E-4 9.79317E-7 1.54608E-4 1.05407E-6 10027504 - 1.59664E-4 1.12415E-6 1.68914E-4 1.25817E-6 1.76201E-4 1.36907E-6 10027504 - 1.81872E-4 1.45861E-6 1.90721E-4 1.60401E-6 2.00000E-4 1.76388E-6 10027504 - 2.08856E-4 1.92354E-6 2.17514E-4 2.08632E-6 2.25956E-4 2.25142E-6 10027504 - 2.34168E-4 2.41805E-6 2.42138E-4 2.58544E-6 2.57818E-4 2.93114E-6 10027504 - 2.72369E-4 3.27134E-6 2.85774E-4 3.60126E-6 2.98043E-4 3.91711E-6 10027504 - 3.09209E-4 4.21613E-6 3.19322E-4 4.49643E-6 3.37822E-4 5.03251E-6 10027504 - 3.52397E-4 5.47612E-6 3.63739E-4 5.83430E-6 3.81439E-4 6.41594E-6 10027504 - 4.00000E-4 7.05552E-6 4.17710E-4 7.69413E-6 4.35025E-4 8.34523E-6 10027504 - 4.51909E-4 9.00558E-6 4.68333E-4 9.67205E-6 4.84272E-4 1.03416E-5 10027504 - 5.15632E-4 1.17243E-5 5.44734E-4 1.30851E-5 5.71542E-4 1.44047E-5 10027504 - 5.96079E-4 1.56681E-5 6.18412E-4 1.68642E-5 6.38638E-4 1.79853E-5 10027504 - 6.75638E-4 2.01297E-5 7.04788E-4 2.19041E-5 7.27473E-4 2.33369E-5 10027504 - 7.62876E-4 2.56635E-5 8.00000E-4 2.82221E-5 8.45898E-4 3.15533E-5 10027504 - 8.82041E-4 3.43073E-5 9.39171E-4 3.88954E-5 .001000000 4.40970E-5 10027504 - .001044275 4.80882E-5 .001087561 5.21574E-5 .001129770 5.62845E-5 10027504 - .001170827 6.04498E-5 .001210672 6.46342E-5 .001289073 7.32763E-5 10027504 - .001361826 8.17810E-5 .001428846 9.00285E-5 .001490189 9.79246E-5 10027504 - .001546020 1.05400E-4 .001596586 1.12407E-4 .001689086 1.25809E-4 10027504 - .001761962 1.36900E-4 .001818675 1.45854E-4 .001907184 1.60396E-4 10027504 - .002000000 1.76388E-4 .002088548 1.92353E-4 .002175120 2.08629E-4 10027504 - .002259537 2.25138E-4 .002341651 2.41798E-4 .002421341 2.58536E-4 10027504 - .002578140 2.93104E-4 .002723647 3.27123E-4 .002857687 3.60113E-4 10027504 - .002980372 3.91697E-4 .003092034 4.21597E-4 .003193165 4.49626E-4 10027504 - .003378167 5.03235E-4 .003523919 5.47597E-4 .003637345 5.83416E-4 10027504 - .003814366 6.41584E-4 .004000000 7.05552E-4 .004229486 7.88831E-4 10027504 - .004410200 8.57681E-4 .004695850 9.72383E-4 .005000000 .001102425 10027504 - .005221370 .001202203 .005437797 .001303932 .005648838 .001407108 10027504 - .005854122 .001511237 .006053345 .001615846 .006445344 .001831898 10027504 - .006809110 .002044513 .007144209 .002250698 .007450920 .002448098 10027504 - .007730075 .002634975 .007982902 .002810157 .008445408 .003145215 10027504 - .008809789 .003422473 .009093356 .003646342 .009535909 .004009897 10027504 - .010000000 .004409700 .010519896 .004878029 .010996930 .005328442 10027504 - .011432046 .005756541 .011826872 .006159250 .012550912 .006932959 10027504 - .013122884 .007576380 .013568905 .008097838 .014266520 .008948083 10027504 - .015000000 .009887600 .015549221 .010618562 .016559186 .012030166 10027504 - .017359482 .013210706 .017984985 .014171533 .018965751 .015745375 10027504 - .020000000 .017494000 .021147426 .019528698 .022050993 .021208572 10027504 - .023479243 .024003169 .025000000 .027166000 .025300000 .027808212 10027504 - .026401021 .030228075 .028143039 .034258361 .030000000 .038826000 10027504 - .031721139 .043259741 .033076489 .046914259 .035218864 .052982965 10027504 - .037500000 .059836700 .040000000 .067729000 .041755953 .073481206 10027504 - .044535467 .083038343 .047500000 .093838500 .050000000 .103310000 10027504 - .052057041 .111285896 .055302362 .124419015 .058750000 .139102000 10027504 - .062387399 .154961414 .066250000 .172629000 .070000000 .190230000 10027504 - .074246213 .210512711 .078750000 .232958000 .080000000 .239232000 10027504 - .086250000 .271006000 .090000000 .290380000 .097500000 .329464000 10027504 - .100000000 .342560000 .106250000 .375239000 .115630000 .423831000 10027504 - .125000000 .471300000 .135940000 .524541000 .145310000 .567881000 10027504 - .150000000 .588730000 .160940000 .634723000 .170310000 .671228000 10027504 - .175000000 .688500000 .187500000 .731072000 .200000000 .768840000 10027504 - .212500000 .801952000 .221880000 .824026000 .228910000 .839201000 10027504 - .235940000 .853084000 .242970000 .865878000 .250000000 .877680000 10027504 - .262500000 .896161000 .271880000 .908231000 .278910000 .916385000 10027504 - .290630000 .928398000 .292970000 .930591000 .300000000 .936860000 10027504 - .317970000 .950277000 .325000000 .954651000 .333010000 .959228000 10027504 - .349760000 .967338000 .362500000 .972328000 .367700000 .974182000 10027504 - .389230000 .980408000 .400000000 .982980000 .425000000 .987565000 10027504 - .443750000 .990110000 .450000000 .990858000 .471880000 .993007000 10027504 - .500000000 .995020000 .525000000 .996274000 .562500000 .997558000 10027504 - .600000000 .998370000 .650000000 .998966000 .700000000 .999410000 10027504 - .750000000 .999591000 .800000000 .999760000 .875000000 .999867000 10027504 - .900000000 .999900000 1.00000000 .999950000 1.12500000 .999971000 10027504 - 1.25000000 .999990000 1.43750000 .999998000 1.50000000 1.00000000 10027504 - 1.75000000 1.00000000 2.00000000 1.00000000 2.50000000 1.00000000 10027504 - 3.00000000 1.00000000 3.50000000 1.00000000 4.00000000 1.00000000 10027504 - 5.00000000 1.00000000 6.00000000 1.00000000 7.00000000 1.00000000 10027504 - 8.00000000 1.00000000 10.0000000 1.00000000 15.0000000 1.00000000 10027504 - 20.0000000 1.00000000 40.0000000 1.00000000 50.0000000 1.00000000 10027504 - 80.0000000 1.00000000 100.000000 1.00000000 200.000000 1.00000000 10027504 - 400.000000 1.00000000 800.000000 1.00000000 1000.00000 1.00000000 10027504 - 2000.00000 1.00000000 4000.00000 1.00000000 8000.00000 1.00000000 10027504 - 16000.0000 1.00000000 32000.0000 1.00000000 64000.0000 1.00000000 10027504 - 128000.000 1.00000000 256000.000 1.00000000 512000.000 1.00000000 10027504 - 1000000.00 1.00000000 2000000.00 1.00000000 4000000.00 1.00000000 10027504 - 8000000.00 1.00000000 16000000.0 1.00000000 32000000.0 1.00000000 10027504 - 64000000.0 1.00000000 128000000. 1.00000000 256000000. 1.00000000 10027504 - 512000000. 1.00000000 1.00000E+9 1.00000000 10027504 - 10027 0 - 1000.00000 .999242000 0 0 0 0 10027505 - 0.0 1.00000000 0 0 1 297 10027505 - 297 2 10027505 - 1.00000000 0.0 2.00000000 0.0 2.25000000 0.0 10027505 - 2.53125000 0.0 2.84765625 0.0 3.20361328 0.0 10027505 - 3.60406494 0.0 4.05457306 0.0 4.56139469 0.0 10027505 - 5.13156903 0.0 5.77301516 0.0 6.49464205 0.0 10027505 - 7.30647231 0.0 8.02516327 0.0 8.65401786 0.0 10027505 - 9.20426563 0.0 9.68573242 0.0 10.1070159 0.0 10027505 - 10.4756389 0.0 11.1207292 0.0 11.6045469 0.0 10027505 - 11.9674102 0.0 12.2395576 0.0 12.4436682 0.0 10027505 - 12.7498341 0.0 12.9029171 0.0 13.0560000 0.0 10027505 - 13.0565313 1.26320E-6 13.0607688 1.55060E-6 13.0670633 2.09398E-6 10027505 - 13.0732843 2.80530E-6 13.0794326 3.73007E-6 13.0855092 4.92423E-6 10027505 - 13.0915149 6.45618E-6 13.0974505 8.40891E-6 13.1033167 1.08825E-5 10027505 - 13.1091145 1.39969E-5 13.1148447 1.78949E-5 13.1205079 2.27455E-5 10027505 - 13.1261050 2.87475E-5 13.1316368 3.61336E-5 13.1371040 4.51744E-5 10027505 - 13.1443085 6.03840E-5 13.1514009 7.99906E-5 13.1583829 1.05045E-4 10027505 - 13.1652562 1.36791E-4 13.1720225 1.76689E-4 13.1786836 2.26436E-4 10027505 - 13.1852409 2.87990E-4 13.1916962 3.63595E-4 13.1980510 4.55793E-4 10027505 - 13.2043070 5.67453E-4 13.2104655 7.01781E-4 13.2165282 8.62337E-4 10027505 - 13.2254458 .001161032 13.2341560 .001542472 13.2426637 .002023365 10027505 - 13.2509735 .002622289 13.2590900 .003359597 13.2670179 .004257290 10027505 - 13.2722004 .004956385 13.2823641 .006636270 13.2922127 .008736011 10027505 - 13.3017559 .011318669 13.3110032 .014447842 13.3199638 .018186119 10027505 - 13.3286465 .022593529 13.3411685 .030580265 13.3531127 .040362041 10027505 - 13.3645056 .052067897 13.3754294 .065863778 13.3892458 .087550276 10027505 - 13.4022121 .112915481 13.4143807 .141796961 13.4312444 .191077349 10027505 - 13.4467356 .246964255 13.4652950 .328691680 13.4890065 .458146439 10027505 - 13.5150206 .632851370 13.5442323 .866052418 13.5990191 1.36742233 10027505 - 13.6538059 1.87280378 13.7097724 2.27815046 13.7568469 2.50035689 10027505 - 13.8307204 2.66187954 13.9012361 2.67281108 13.9717518 2.68371585 10027505 - 14.0535435 2.66334798 14.2069030 2.62402631 14.3410925 2.58840874 10027505 - 14.4585084 2.55631610 14.6639861 2.49807153 14.8180944 2.45264876 10027505 - 14.9336756 2.41760331 15.1070475 2.36346275 15.1937334 2.33568490 10027505 - 15.2804193 2.30743532 15.5855954 2.24419584 15.6102141 2.23909428 10027505 - 15.7338872 2.21217941 15.9503150 2.16338921 16.1126359 2.12538572 10027505 - 16.3561173 2.06611306 16.4778579 2.03545640 17.3244961 1.87710873 10027505 - 17.6869448 1.80687102 18.8105584 1.62518830 19.5717233 1.50366391 10027505 - 21.3085588 1.29214465 23.2195517 1.10788356 25.2875942 .948059759 10027505 - 27.2969679 .824089976 29.6889627 .704800923 32.1306229 .607776736 10027505 - 35.0992922 .514210653 37.7473621 .447384773 40.7780241 .385774182 10027505 - 44.3231035 .327828117 48.0404849 .280068867 51.9156495 .240384962 10027505 - 55.8324364 .208008520 60.3151197 .178321252 65.2344043 .152169342 10027505 - 70.2523057 .130948848 75.9770513 .111676528 82.3331226 .094627326 10027505 - 88.4616560 .081620954 95.4695014 .069670410 103.101244 .059308943 10027505 - 111.473255 .050365999 120.394998 .042808436 129.359636 .036746037 10027505 - 138.904444 .031579832 150.162813 .026736578 161.616998 .022815006 10027505 - 173.232473 .019640557 186.480931 .016745827 200.766437 .014245982 10027505 - 216.262484 .012103687 233.218252 .010258329 252.403767 .008615462 10027505 - 270.212944 .007406485 290.150417 .006321905 312.446551 .005364928 10027505 - 336.746353 .004532214 361.096238 .003873983 387.845901 .003298680 10027505 - 416.869400 .002803662 448.196508 .002376754 483.153264 .002003316 10027505 - 518.076340 .001708942 555.904300 .001455223 595.083792 .001243741 10027505 - 634.310495 .001073919 679.796841 9.15220E-4 728.502511 7.80420E-4 10027505 - 779.745923 6.66594E-4 837.393698 5.64451E-4 901.647218 4.75239E-4 10027505 - 965.765962 4.04992E-4 1035.14200 3.44535E-4 1109.89862 2.92398E-4 10027505 - 1189.84952 2.48216E-4 1272.82577 2.11855E-4 1363.75832 1.80123E-4 10027505 - 1462.17700 1.52882E-4 1575.08299 1.28125E-4 1684.04628 1.09285E-4 10027505 - 1803.70104 9.28715E-5 1925.97182 7.94655E-5 2052.36138 6.83339E-5 10027505 - 2192.29452 5.83783E-5 2360.59127 4.89016E-5 2522.94747 4.16907E-5 10027505 - 2701.16633 3.54116E-5 2883.21261 3.02855E-5 3071.32220 2.60310E-5 10027505 - 3292.57884 2.20164E-5 3537.70007 1.85121E-5 3782.72572 1.57562E-5 10027505 - 4060.86219 1.32738E-5 4356.87920 1.11990E-5 4686.49485 9.39353E-6 10027505 - 5015.10075 7.97703E-6 5370.31800 6.76159E-6 5736.01252 5.76133E-6 10027505 - 6144.48005 4.87563E-6 6608.22110 4.08610E-6 7105.66197 3.42508E-6 10027505 - 7618.91013 2.89211E-6 8137.49576 2.46504E-6 8726.83957 2.07970E-6 10027505 - 9341.96523 1.76099E-6 10018.3853 1.48429E-6 10730.8180 1.25478E-6 10027505 - 11528.8537 1.05295E-6 12313.9546 8.96641E-7 13213.5345 7.54551E-7 10027505 - 14036.4906 6.51025E-7 15003.2914 5.53166E-7 16046.2805 4.69455E-7 10027505 - 17154.3788 3.98744E-7 18404.6094 3.35550E-7 19767.0269 2.81629E-7 10027505 - 21205.4907 2.37056E-7 22677.3707 2.01081E-7 24274.2134 1.70249E-7 10027505 - 25909.6644 1.45069E-7 27811.5003 1.21926E-7 29803.6009 1.02918E-7 10027505 - 32054.6799 8.60901E-8 34441.2045 7.22121E-8 36867.5292 6.11240E-8 10027505 - 39420.8671 5.18804E-8 42270.6896 4.37346E-8 45299.5144 3.69285E-8 10027505 - 48464.3996 3.12971E-8 51631.3150 2.68145E-8 55301.5854 2.26592E-8 10027505 - 59229.3022 1.91594E-8 63358.8677 1.62543E-8 67806.1702 1.37911E-8 10027505 - 72322.9707 1.17906E-8 77590.9962 9.93986E-9 83419.8568 8.33736E-9 10027505 - 89785.5840 6.97472E-9 96098.1075 5.91825E-9 102953.902 5.01714E-9 10027505 - 109875.445 4.29228E-9 117735.091 3.63577E-9 125931.240 3.09979E-9 10027505 - 134740.930 2.64115E-9 144556.092 2.23722E-9 155383.984 1.88886E-9 10027505 - 166514.229 1.60737E-9 179112.166 1.35700E-9 192757.121 1.14714E-9 10027505 - 206101.673 9.8480E-10 222036.149 8.3366E-10 239029.310 7.0709E-10 10027505 - 258365.874 5.9661E-10 276515.058 5.1523E-10 298297.837 4.3876E-10 10027505 - 322461.406 3.7328E-10 347196.076 3.2121E-10 375837.400 2.7443E-10 10027505 - 406828.538 2.3573E-10 440301.297 2.0356E-10 476608.095 1.7670E-10 10027505 - 548239.098 1.4072E-10 629462.706 1.1003E-10 690192.132 9.2226E-11 10027505 - 756780.624 7.6528E-11 829793.454 6.2868E-11 909850.429 5.1130E-11 10027505 - 1000000.00 4.0934E-11 1096478.20 3.2686E-11 1202264.44 2.6054E-11 10027505 - 1318256.74 2.0729E-11 1445439.77 1.6458E-11 1584893.19 1.3037E-11 10027505 - 1737800.83 1.0302E-11 1905460.72 8.1175E-12 2089296.13 6.3767E-12 10027505 - 2290867.65 4.9919E-12 2398832.92 4.4104E-12 2511886.43 3.8926E-12 10027505 - 2630267.99 3.4318E-12 2754228.70 3.0219E-12 2884031.50 2.6576E-12 10027505 - 3019951.72 2.3340E-12 3162277.66 2.0467E-12 3311311.22 1.7920E-12 10027505 - 3467368.51 1.5662E-12 3630780.55 1.3663E-12 3801893.96 1.1894E-12 10027505 - 3981071.71 1.0331E-12 4168693.84 8.9510E-13 4365158.32 7.7338E-13 10027505 - 4570881.90 6.6614E-13 4786300.92 5.7179E-13 5011872.34 4.8889E-13 10027505 - 5248074.60 4.1615E-13 5495408.74 3.5242E-13 5754399.37 2.9669E-13 10027505 - 6025595.86 2.4803E-13 6309573.45 2.0565E-13 6606934.48 1.6880E-13 10027505 - 6918309.71 1.3684E-13 7244359.60 1.0920E-13 7585775.75 8.5363E-14 10027505 - 7943282.35 6.4877E-14 8317637.71 4.7335E-14 8709635.90 3.2377E-14 10027505 - 9120108.39 1.9686E-14 9549925.86 8.9767E-15 10000000.0 0.0 10027505 - 10027 0 - 1000.00000 .999242000 0 0 0 0 10027506 - 0.0 1.00000000 0 0 1 297 10027506 - 297 2 10027506 - 1.00000000-1.00260813 2.00000000-1.01054501 2.25000000-1.01339730 10027506 - 2.53125000-1.01703889 2.84765625-1.02169937 3.20361328-1.02768226 10027506 - 3.60406494-1.03539347 4.05457306-1.04538388 4.56139469-1.05841527 10027506 - 5.13156903-1.07556656 5.77301516-1.09841358 6.49464205-1.12935233 10027506 - 7.30647231-1.17222497 8.02516327-1.21917531 8.65401786-1.26919904 10027506 - 9.20426563-1.32181255 9.68573242-1.37657637 10.1070159-1.43307788 10027506 - 10.4756389-1.49092065 11.1207292-1.61828663 11.6045469-1.74633807 10027506 - 11.9674102-1.87150374 12.2395576-1.99053646 12.4436682-2.10070884 10027506 - 12.7498341-2.31930092 12.9029171-2.46747445 13.0560000-2.66110741 10027506 - 13.0565313-2.66189164 13.0607688-2.66817997 13.0670633-2.67763623 10027506 - 13.0732843-2.68711991 13.0794326-2.69663144 13.0855092-2.70617135 10027506 - 13.0915149-2.71574022 13.0974505-2.72533864 13.1033167-2.73496728 10027506 - 13.1091145-2.74462681 13.1148447-2.75431796 13.1205079-2.76404150 10027506 - 13.1261050-2.77379824 13.1316368-2.78358902 13.1371040-2.79341482 10027506 - 13.1443085-2.80659748 13.1514009-2.81984654 13.1583829-2.83316439 10027506 - 13.1652562-2.84655362 13.1720225-2.86001693 13.1786836-2.87355711 10027506 - 13.1852409-2.88717708 13.1916962-2.90087981 13.1980510-2.91466833 10027506 - 13.2043070-2.92854576 13.2104655-2.94251530 13.2165282-2.95658167 10027506 - 13.2254458-2.97785851 13.2341560-2.99936625 13.2426637-3.02111183 10027506 - 13.2509735-3.04310260 13.2590900-3.06534463 13.2670179-3.08783877 10027506 - 13.2722004-3.10300385 13.2823641-3.13373197 13.2922127-3.16492967 10027506 - 13.3017559-3.19657215 13.3110032-3.22863785 13.3199638-3.26109994 10027506 - 13.3286465-3.29396106 13.3411685-3.34361563 13.3531127-3.39379716 10027506 - 13.3645056-3.44424361 13.3754294-3.49505154 13.3892458-3.56217080 10027506 - 13.4022121-3.62830254 13.4143807-3.69298331 13.4312444-3.78459112 10027506 - 13.4467356-3.87121167 13.4652950-3.97468627 13.4890065-4.10088152 10027506 - 13.5150206-4.22467698 13.5442323-4.33262955 13.5990191-4.39967124 10027506 - 13.6538059-4.28608434 13.7097724-4.01778380 13.7568469-3.72574617 10027506 - 13.8307204-3.30523504 13.9012361-2.98895727 13.9717518-2.75324531 10027506 - 14.0535435-2.52963276 14.2069030-2.21870800 14.3410925-2.00678268 10027506 - 14.4585084-1.85031085 14.6639861-1.62134335 14.8180944-1.47741251 10027506 - 14.9336756-1.38193310 15.1070475-1.25647732 15.1937334-1.20183697 10027506 - 15.2804193-1.15546946 15.5855954-1.00000000 15.6102141-.987458202 10027506 - 15.7338872-.927789904 15.9503150-.830773025 16.1126359-.764372772 10027506 - 16.3561173-.675699129 16.4778579-.637198821 17.3244961-.421505276 10027506 - 17.6869448-.341214639 18.8105584-.171466610 19.5717233-.083982355 10027506 - 21.3085588 .053259615 23.2195517 .142074254 25.2875942 .197404516 10027506 - 27.2969679 .224754090 29.6889627 .242265905 32.1306229 .246420513 10027506 - 35.0992922 .245235967 37.7473621 .237215718 40.7780241 .226774249 10027506 - 44.3231035 .213779629 48.0404849 .199333661 51.9156495 .184962380 10027506 - 55.8324364 .171155279 60.3151197 .157104465 65.2344043 .143346494 10027506 - 70.2523057 .130631424 75.9770513 .118203924 82.3331226 .106376480 10027506 - 88.4616560 .096282881 95.4695014 .086564220 103.101244 .077522339 10027506 - 111.473255 .069160406 120.394998 .061684739 129.359636 .055284627 10027506 - 138.904444 .049508309 150.162813 .043880159 161.616998 .039063675 10027506 - 173.232473 .034930466 186.480931 .031017317 200.766437 .027497075 10027506 - 216.262484 .024316087 233.218252 .021441444 252.403767 .018791565 10027506 - 270.212944 .016728135 290.150417 .014811297 312.446551 .013045309 10027506 - 336.746353 .011465747 361.096238 .010148263 387.845901 .008953663 10027506 - 416.869400 .007886304 448.196508 .006937270 483.153264 .006070515 10027506 - 518.076340 .005356547 555.904300 .004720401 595.083792 .004174837 10027506 - 634.310495 .003717245 679.796841 .003277675 728.502511 .002888832 10027506 - 779.745923 .002550577 837.393698 .002237338 901.647218 .001952491 10027506 - 965.765962 .001719075 1035.14200 .001511539 1109.89862 .001327733 10027506 - 1189.84952 .001166046 1272.82577 .001027642 1363.75832 9.02847E-4 10027506 - 1462.17700 7.91990E-4 1575.08299 6.88669E-4 1684.04628 6.06758E-4 10027506 - 1803.70104 5.32816E-4 1925.97182 4.70435E-4 2052.36138 4.16852E-4 10027506 - 2192.29452 3.67642E-4 2360.59127 3.19376E-4 2522.94747 2.81196E-4 10027506 - 2701.16633 2.46757E-4 2883.21261 2.17736E-4 3071.32220 1.92825E-4 10027506 - 3292.57884 1.68704E-4 3537.70007 1.46933E-4 3782.72572 1.29111E-4 10027506 - 4060.86219 1.12586E-4 4356.87920 9.82583E-5 4686.49485 8.53266E-5 10027506 - 5015.10075 7.48172E-5 5370.31800 6.55171E-5 5736.01252 5.76439E-5 10027506 - 6144.48005 5.04254E-5 6608.22110 4.37693E-5 7105.66197 3.79984E-5 10027506 - 7618.91013 3.31651E-5 8137.49576 2.91621E-5 8726.83957 2.54408E-5 10027506 - 9341.96523 2.22684E-5 10018.3853 1.94218E-5 10730.8180 1.69761E-5 10027506 - 11528.8537 1.47503E-5 12313.9546 1.29610E-5 13213.5345 1.12870E-5 10027506 - 14036.4906 1.00225E-5 15003.2914 8.79298E-6 16046.2805 7.70445E-6 10027506 - 17154.3788 6.75581E-6 18404.6094 5.88235E-6 19767.0269 5.11060E-6 10027506 - 21205.4907 4.44990E-6 22677.3707 3.89818E-6 24274.2134 3.40850E-6 10027506 - 25909.6644 2.99676E-6 27811.5003 2.60568E-6 29803.6009 2.27276E-6 10027506 - 32054.6799 1.96819E-6 34441.2045 1.70768E-6 36867.5292 1.49250E-6 10027506 - 39420.8671 1.30724E-6 42270.6896 1.13855E-6 45299.5144 9.92757E-7 10027506 - 48464.3996 8.68450E-7 51631.3150 7.66037E-7 55301.5854 6.68560E-7 10027506 - 59229.3022 5.83511E-7 63358.8677 5.10479E-7 67806.1702 4.46192E-7 10027506 - 72322.9707 3.92577E-7 77590.9962 3.41441E-7 83419.8568 2.95703E-7 10027506 - 89785.5840 2.55520E-7 96098.1075 2.23243E-7 102953.902 1.94669E-7 10027506 - 109875.445 1.71045E-7 117735.091 1.49089E-7 125931.240 1.30408E-7 10027506 - 134740.930 1.13993E-7 144556.092 9.91098E-8 155383.984 8.58377E-8 10027506 - 166514.229 7.47925E-8 179112.166 6.46809E-8 192757.121 5.58801E-8 10027506 - 206101.673 4.89012E-8 222036.149 4.21564E-8 239029.310 3.63910E-8 10027506 - 258365.874 3.11640E-8 276515.058 2.72139E-8 298297.837 2.33909E-8 10027506 - 322461.406 2.00247E-8 347196.076 1.72764E-8 375837.400 1.47463E-8 10027506 - 406828.538 1.25877E-8 440301.297 1.07473E-8 476608.095 9.17127E-9 10027506 - 548239.098 6.92944E-9 629462.706 5.26106E-9 690192.132 4.37674E-9 10027506 - 756780.624 3.63610E-9 829793.454 3.02033E-9 909850.429 2.50968E-9 10027506 - 1000000.00 2.06690E-9 1096478.20 1.71917E-9 1202264.44 1.42667E-9 10027506 - 1318256.74 1.17565E-9 1445439.77 9.6825E-10 1584893.19 7.9946E-10 10027506 - 1737800.83 6.6151E-10 1905460.72 5.3396E-10 2089296.13 4.4613E-10 10027506 - 2290867.65 3.6435E-10 2398832.92 3.3683E-10 2511886.43 2.9380E-10 10027506 - 2630267.99 2.6286E-10 2754228.70 2.4722E-10 2884031.50 2.2118E-10 10027506 - 3019951.72 2.0054E-10 3162277.66 1.7137E-10 3311311.22 1.4884E-10 10027506 - 3467368.51 1.3558E-10 3630780.55 1.3179E-10 3801893.96 1.0308E-10 10027506 - 3981071.71 9.3667E-11 4168693.84 1.0111E-10 4365158.32 6.9919E-11 10027506 - 4570881.90 8.3478E-11 4786300.92 6.5789E-11 5011872.34 5.4421E-11 10027506 - 5248074.60 6.4366E-11 5495408.74 3.2493E-11 5754399.37 3.9340E-11 10027506 - 6025595.86 3.5518E-11 6309573.45 2.5070E-11 6606934.48-1.8963E-11 10027506 - 6918309.71 1.2958E-11 7244359.60 1.6964E-11 7585775.75 9.3572E-12 10027506 - 7943282.35 2.4332E-11 8317637.71 1.8368E-11 8709635.90 5.4132E-12 10027506 - 9120108.39 3.5691E-12 9549925.86 2.8024E-11 10000000.0 0.0 10027506 - 10027 0 - 100 0 0 - 0 0 0 - -1 0 0 diff --git a/tests/photoat-001_H_000.endf.xz b/tests/photoat-001_H_000.endf.xz new file mode 100644 index 0000000..2c91311 Binary files /dev/null and b/tests/photoat-001_H_000.endf.xz differ diff --git a/tests/synthetic-denormal.ace.xz b/tests/synthetic-denormal.ace.xz new file mode 100644 index 0000000..604458d Binary files /dev/null and b/tests/synthetic-denormal.ace.xz differ diff --git a/tests/synthetic-laws.ace.xz b/tests/synthetic-laws.ace.xz new file mode 100644 index 0000000..73fcb05 Binary files /dev/null and b/tests/synthetic-laws.ace.xz differ diff --git a/tests/synthetic-nfy.endf.xz b/tests/synthetic-nfy.endf.xz new file mode 100644 index 0000000..37fd8b0 Binary files /dev/null and b/tests/synthetic-nfy.endf.xz differ diff --git a/tests/synthetic-shapes.endf.xz b/tests/synthetic-shapes.endf.xz new file mode 100644 index 0000000..35a7c14 Binary files /dev/null and b/tests/synthetic-shapes.endf.xz differ diff --git a/tests/synthetic-urr-cases.endf.xz b/tests/synthetic-urr-cases.endf.xz new file mode 100644 index 0000000..9abb5ab Binary files /dev/null and b/tests/synthetic-urr-cases.endf.xz differ diff --git a/tests/synthetic-urr.ace.xz b/tests/synthetic-urr.ace.xz new file mode 100644 index 0000000..0673542 Binary files /dev/null and b/tests/synthetic-urr.ace.xz differ diff --git a/tests/test_chain.py b/tests/test_chain.py index 6cbed80..d4ca078 100644 --- a/tests/test_chain.py +++ b/tests/test_chain.py @@ -108,7 +108,7 @@ def test_returns_the_same_list_it_was_given(): def xe136(): # Trimmed to MF=1 and MF=3, which is all the chain builder reads from a # neutron evaluation. - return endf.Material(TESTS / 'n-054_Xe_136_trimmed.endf') + return endf.Material(TESTS / 'n-054_Xe_136_trimmed.endf.xz') @pytest.mark.parametrize('mt,q', [(103, -6096700.0), (104, -7672500.0), @@ -138,7 +138,7 @@ def test_reaction_q_is_taken_from_qi(xe136): def test_qm_equals_qi_for_the_transmutation_channels_of_a_normal_evaluation(): """For the channels a chain is built from, the two normally agree, which is why reading the wrong one goes unnoticed.""" - material = endf.Material(TESTS / 'n-095_Am_244.endf') + material = endf.Material(TESTS / 'n-095_Am_244.endf.xz') for mt in (16, 17, 102): data = material.section_data[3, mt] assert data['QM'] == data['QI'], mt @@ -149,7 +149,7 @@ def test_qm_is_zero_for_inelastic_levels(): discrete level there is no mass change, so QM is zero while QI carries the level excitation energy. Those channels do not transmute and so never reach a depletion chain, but it shows the two quantities are not interchangeable.""" - material = endf.Material(TESTS / 'n-095_Am_244.endf') + material = endf.Material(TESTS / 'n-095_Am_244.endf.xz') for mt in (51, 52, 53): data = material.section_data[3, mt] assert data['QM'] == 0.0 diff --git a/tests/test_incident_photon.py b/tests/test_incident_photon.py index 630d518..8754452 100644 --- a/tests/test_incident_photon.py +++ b/tests/test_incident_photon.py @@ -13,13 +13,13 @@ @pytest.fixture def h_photoatomic(): - filename = Path(__file__).with_name('photoat-001_H_000.endf') + filename = Path(__file__).with_name('photoat-001_H_000.endf.xz') return endf.Material(filename) @pytest.fixture def h_relaxation(): - filename = Path(__file__).with_name('atom-001_H_000.endf') + filename = Path(__file__).with_name('atom-001_H_000.endf.xz') return endf.Material(filename) @@ -129,7 +129,7 @@ def test_from_endf_without_relaxation(h_photoatomic): def test_from_endf_file_path(): - filename = Path(__file__).with_name('photoat-001_H_000.endf') + filename = Path(__file__).with_name('photoat-001_H_000.endf.xz') ip = endf.IncidentPhoton.from_endf(filename) assert ip.atomic_number == 1 assert len(ip.reactions) == 8 diff --git a/tests/test_material.py b/tests/test_material.py index 89a01b7..97aa916 100644 --- a/tests/test_material.py +++ b/tests/test_material.py @@ -9,13 +9,16 @@ @pytest.fixture def am244(): - filename = Path(__file__).with_name('n-095_Am_244.endf') + filename = Path(__file__).with_name('n-095_Am_244.endf.xz') return endf.Material(filename) def test_init_file(): - filename = Path(__file__).with_name('n-095_Am_244.endf') - with open(filename) as fh: + # Material accepts an open file object as well as a path. open_text is + # what gives one for a compressed fixture; the point of the test is the + # file-object branch, not how the file was opened. + filename = Path(__file__).with_name('n-095_Am_244.endf.xz') + with endf.fileutils.open_text(filename) as fh: am244 = endf.Material(fh) assert am244.MAT == 9552 diff --git a/tests/test_metastable_identity.py b/tests/test_metastable_identity.py index 65dd87e..9797f03 100644 --- a/tests/test_metastable_identity.py +++ b/tests/test_metastable_identity.py @@ -26,7 +26,7 @@ from endf.ace import get_metadata from endf.fission_energy import FissionEnergyRelease -AM242_GROUND = Path(__file__).with_name("n-095_Am_242_trimmed.endf") +AM242_GROUND = Path(__file__).with_name("n-095_Am_242_trimmed.endf.xz") @pytest.mark.parametrize("zaid, scheme, name, metastable", [ diff --git a/tests/test_njoy.py b/tests/test_njoy.py index 00b6019..b443d44 100644 --- a/tests/test_njoy.py +++ b/tests/test_njoy.py @@ -46,14 +46,14 @@ def test_heatr_asks_for_the_partial_kermas(): def test_output_dir_must_be_a_directory(tmp_path): missing = tmp_path / "nope" with pytest.raises(IOError, match="not a directory"): - make_ace(TESTS / 'n-095_Am_244.endf', output_dir=missing) + make_ace(TESTS / 'n-095_Am_244.endf.xz', output_dir=missing) def test_library_name_comes_from_the_evaluation(): """The library string appears in NJOY's comment cards and so in the ACE file, and is built from NLIB, NVER and LREL.""" from endf.material import _LIBRARY - mat = endf.Material(TESTS / 'n-095_Am_244.endf') + mat = endf.Material(TESTS / 'n-095_Am_244.endf.xz') metadata = mat.section_data[1, 451] library = '{}-{}.{}'.format(_LIBRARY.get(metadata['NLIB'], 'Unknown'), metadata['NVER'], metadata['LREL']) @@ -66,7 +66,7 @@ def test_library_name_comes_from_the_evaluation(): def test_make_ace_writes_a_readable_table(tmp_path): """A full run, checked by reading the ACE back.""" ace_path = tmp_path / "ace" - make_ace(TESTS / 'n-095_Am_244.endf', temperatures=[293.6], + make_ace(TESTS / 'n-095_Am_244.endf.xz', temperatures=[293.6], acer=str(ace_path), output_dir=str(tmp_path)) assert ace_path.is_file() @@ -85,7 +85,7 @@ def test_make_ace_writes_a_readable_table(tmp_path): @pytest.mark.skipif(not HAVE_NJOY, reason="njoy executable not found") def test_from_njoy_multiple_temperatures(tmp_path): data = endf.IncidentNeutron.from_njoy( - TESTS / 'n-095_Am_244.endf', temperatures=[293.6, 900.0], + TESTS / 'n-095_Am_244.endf.xz', temperatures=[293.6, 900.0], output_dir=str(tmp_path)) assert data.temperatures == ['294K', '900K'] diff --git a/tests/test_parser_regressions.py b/tests/test_parser_regressions.py new file mode 100644 index 0000000..09da5ca --- /dev/null +++ b/tests/test_parser_regressions.py @@ -0,0 +1,218 @@ +"""Regression tests for parser bugs found while porting the reader to Rust. + +Each test names the issue it closes and asserts the *corrected* behaviour, so +a revert fails here rather than in a golden file where the cause is harder to +read off. The behaviour was checked against OpenMC, ENDFtk and endf-parserpy +before being changed; see the issue threads. +""" + +from pathlib import Path + +import pytest + +import endf + +TESTS = Path(__file__).parent + + +def fixture(name): + return str(TESTS / name) + + +# --------------------------------------------------------------------------- +# Issue #15 -- unresolved ranges with LRF=1 were dropped, and desynced the read +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def urr_cases(): + return endf.Material(fixture("synthetic-urr-cases.endf.xz")) + + +def test_unresolved_case_a_is_read(urr_cases): + """LRU=2 with LRF=1 and LFW=0. Previously matched no branch at all.""" + rrange = urr_cases.section_data[2, 151]["isotopes"][0]["ranges"][0] + assert rrange["LRU"] == 2 + assert rrange["LRF"] == 1 + + # Before the fix the range carried only its six header fields. + assert rrange["SPI"] == pytest.approx(0.5) + assert rrange["AP"] == pytest.approx(0.94) + assert rrange["LSSF"] == 0 + assert rrange["NLS"] == 2 + + # Two L values with different J counts, so reusing NJS would be caught. + by_l = rrange["ranges"] + assert [r["L"] for r in by_l] == [0, 1] + assert [r["NJS"] for r in by_l] == [2, 3] + # Case A gives energy-independent parameters directly, not a 'parameters' + # list -- that is the shape Cases B and C use. + assert list(by_l[0]["D"]) == pytest.approx([8.9, 4.4]) + assert list(by_l[1]["GNO"]) == pytest.approx([0.003, 0.004, 0.005]) + + +def test_unresolved_case_b_is_read(urr_cases): + """LRU=2 with LRF=1 and LFW=1: only the fission widths vary with energy.""" + rrange = urr_cases.section_data[2, 151]["isotopes"][1]["ranges"][0] + assert rrange["LRU"] == 2 and rrange["LRF"] == 1 + + # NE and ES exist only in Case B. + assert rrange["NE"] == 3 + assert list(rrange["ES"]) == pytest.approx([1.0e3, 1.0e4, 3.0e4]) + + parameters = rrange["ranges"][0]["parameters"] + assert [p["MUF"] for p in parameters] == [1, 2] + assert list(parameters[0]["GF"]) == pytest.approx([0.010, 0.012, 0.015]) + + +def test_the_range_after_an_unresolved_one_is_still_aligned(urr_cases): + """The dangerous half of #15: a skipped range left its records unread. + + The second range is resolved multi-level Breit-Wigner. Before the fix it + came back as LRU=0 with EL and EH holding the *first* range's SPI and AP, + because parsing resumed in the middle of the range that was skipped. + """ + rrange = urr_cases.section_data[2, 151]["isotopes"][0]["ranges"][1] + assert rrange["LRU"] == 1 + assert rrange["LRF"] == 2 + assert rrange["EL"] == pytest.approx(3.0e4) + assert rrange["EH"] == pytest.approx(1.0e5) + assert list(rrange["sections"][0]["ER"]) == pytest.approx([5.5e4]) + + +def test_case_c_still_works(urr_cases): + """LRU=2 with LRF=2 worked before only because the two flags coincided.""" + u235 = endf.Material(fixture("n-092_U_235_trimmed.endf.xz")) + ranges = u235.section_data[2, 151]["isotopes"][0]["ranges"] + unresolved = [r for r in ranges if r["LRU"] == 2] + assert unresolved, "U235 should still have an unresolved range" + assert unresolved[0]["LRF"] == 2 + assert unresolved[0]["ranges"][0]["parameters"][0]["INT"] == 2 + + +# --------------------------------------------------------------------------- +# Issue #23 -- a zero half-life divided by zero +# --------------------------------------------------------------------------- + + +def test_zero_half_life_has_no_decay_constant(): + """Xe136 is flagged unstable and evaluated with T1/2 = 0. + + Zero means "not evaluated", not "decays instantly", so there is no decay + constant to report. This used to raise ZeroDivisionError. + """ + decay = endf.Decay(fixture("dec-054_Xe_136.endf.xz")) + assert not decay.nuclide["stable"] + assert decay.half_life.nominal_value == 0.0 + assert decay.decay_constant is None + + +def test_zero_half_life_gives_no_sources(): + """`sources` scales every rate by the decay constant, so it follows.""" + decay = endf.Decay(fixture("dec-054_Xe_136.endf.xz")) + assert decay.sources == {} + + +def test_an_ordinary_nuclide_still_has_a_decay_constant(): + from math import log + + decay = endf.Decay(fixture("dec-055_Cs_137.endf.xz")) + assert decay.half_life.nominal_value > 0.0 + expected = log(2.0) / decay.half_life.nominal_value + assert decay.decay_constant.nominal_value == pytest.approx(expected, rel=1e-12) + + +def test_a_whole_decay_sublibrary_can_be_iterated(): + """The point of #23: one nuclide with a zero half-life broke the lot.""" + constants = {} + for path in sorted(TESTS.glob("dec-*.endf.xz")): + decay = endf.Decay(str(path)) + constants[decay.nuclide["name"]] = decay.decay_constant + assert len(constants) >= 10 + assert constants["Xe136"] is None + assert any(c is not None for c in constants.values()) + + +# --------------------------------------------------------------------------- +# Issue #12 -- MF=33 NC subsections with LTY=0 were appended twice +# --------------------------------------------------------------------------- + + +def test_mf33_nc_subsections_appear_once(): + """One entry per subsection, and NC says how many there should be.""" + from io import StringIO + + from endf.mf33 import parse_mf33_subsection + + def line(fields): + return f"{''.join(f'{v:>11}' for v in fields):<66}9228331\n" + + # NC=2, NI=0: one LTY=0 subsection and one LTY=3, so both branches run. + text = ( + line([0.0, 0.0, 0, 2, 2, 0]) + + line([0.0, 0.0, 0, 0, 0, 0]) # LTY=0 + + line([1.0, 2.0e7, 0, 0, 2, 1]) + + line([1.0, 2.0, 0.0, 0.0, 0.0, 0.0]) + + line([0.0, 0.0, 0, 3, 0, 0]) # LTY=3 + + line([1.0, 2.0e7, 9228, 102, 4, 1]) + + line([3.0, 0.0, 1.0, 0.5, 0.0, 0.0]) + ) + sub = parse_mf33_subsection(StringIO(text)) + + assert sub["NC"] == 2 + assert len(sub["nc_subsections"]) == 2, "one entry per subsection" + assert [s["LTY"] for s in sub["nc_subsections"]] == [0, 3] + + +# --------------------------------------------------------------------------- +# Issue #18 -- MF=34 discarded its subsections, and LB was filled with LS +# --------------------------------------------------------------------------- + + +def test_mf34_keeps_its_subsections(): + """U235 has a real MF=34 section; it used to come back empty.""" + u235 = endf.Material(fixture("n-092_U_235_trimmed.endf.xz")) + section = u235.section_data[34, 51] + + assert section["NMT1"] == 1 + assert len(section["subsections"]) == section["NMT1"] + + subsection = section["subsections"][0] + assert subsection["MT1"] == 51 + assert subsection["NSS"] == 3 + assert len(subsection["subsubsections"]) == subsection["NSS"] + + +def test_mf34_reads_lb_rather_than_copying_ls(): + u235 = endf.Material(fixture("n-092_U_235_trimmed.endf.xz")) + subsection = u235.section_data[34, 51]["subsections"][0] + + # Every block in this section is LB=5, a covariance matrix, while LS -- + # the symmetry flag -- varies. That is what makes the section good + # evidence: copying LS into LB reported the blocks as LB = 1, 0, 1, i.e. + # two of them as an absolute covariance in (E, F) pairs and one as + # something else again, when all three are matrices. A consumer switching + # on LB to unpack `Data` would have unpacked all three the wrong way. + lb = [list(ss["LB"]) for ss in subsection["subsubsections"]] + ls = [list(ss["LS"]) for ss in subsection["subsubsections"]] + assert lb == [[5.0], [5.0], [5.0]] + assert ls == [[1.0], [0.0], [1.0]] + assert lb != ls, "the two fields must not track each other" + + +# --------------------------------------------------------------------------- +# Issue #19 -- ACE law 5 died with AttributeError instead of saying it is a gap +# --------------------------------------------------------------------------- + + +def test_ace_law_5_raises_not_implemented(): + """Neither this reader, OpenMC nor the Rust port implements law 5. + + What matters is that it says so: the dispatch used to reach a `from_ace` + that did not exist and fail with AttributeError, which reads like an + internal error rather than an unsupported format. + """ + from endf.mf5 import GeneralEvaporation + + with pytest.raises(NotImplementedError, match="law 5"): + GeneralEvaporation.from_ace(None, 0) diff --git a/tests/test_photon_auxiliary_data.py b/tests/test_photon_auxiliary_data.py index e440015..1b7e485 100644 --- a/tests/test_photon_auxiliary_data.py +++ b/tests/test_photon_auxiliary_data.py @@ -21,7 +21,7 @@ @pytest.fixture(scope='module') def hydrogen(): return endf.IncidentPhoton.from_endf( - TESTS / 'photoat-001_H_000.endf', TESTS / 'atom-001_H_000.endf') + TESTS / 'photoat-001_H_000.endf.xz', TESTS / 'atom-001_H_000.endf.xz') def test_compton_profiles_attached(hydrogen): diff --git a/tests/test_radionuclide_production.py b/tests/test_radionuclide_production.py index 497c9c0..72b1a43 100644 --- a/tests/test_radionuclide_production.py +++ b/tests/test_radionuclide_production.py @@ -9,7 +9,7 @@ def in115(): # ENDF/B-VIII.1 In115 evaluation trimmed to MF=1/451, the MF=3 # sections for MT=4/16/102, and the corresponding MF=8/9/10 sections - filename = Path(__file__).with_name('n-049_In-115_trimmed.endf') + filename = Path(__file__).with_name('n-049_In-115_trimmed.endf.xz') return endf.Material(filename) @@ -58,6 +58,6 @@ def test_excitation_energy_fallback(): def test_material_without_data(): - filename = Path(__file__).with_name('n-095_Am_244.endf') + filename = Path(__file__).with_name('n-095_Am_244.endf.xz') material = endf.Material(filename) assert radionuclide_production(material) == {} diff --git a/tests/test_removal_xs.py b/tests/test_removal_xs.py index bc8b339..8ebab11 100644 --- a/tests/test_removal_xs.py +++ b/tests/test_removal_xs.py @@ -81,7 +81,7 @@ def test_empty_isotropic(self): @pytest.fixture def am244(): - return endf.IncidentNeutron.from_endf('tests/n-095_Am_244.endf') + return endf.IncidentNeutron.from_endf('tests/n-095_Am_244.endf.xz') class TestRemovalXS: diff --git a/tests/test_rust_bindings.py b/tests/test_rust_bindings.py new file mode 100644 index 0000000..163d017 --- /dev/null +++ b/tests/test_rust_bindings.py @@ -0,0 +1,628 @@ +"""The Rust bindings, held to the pure-Python reader. + +Every assertion here compares `_endf` against `endf` on the same fixture rather +than against a value written down by hand, so the two cannot drift apart +without a failure. The Rust crate's own test suite already compares 37,000 +values; what is checked here is the *binding* — that the conversion at the +Python boundary keeps what the Rust side computed. + +Skipped whole when the extension module is not built, since it is optional: + + maturin develop -m crates/endf-py/Cargo.toml +""" + +from pathlib import Path + +import pytest + +import endf + +_endf = pytest.importorskip( + "_endf", reason="the Rust extension module is not built; see the module docstring" +) + +TESTS = Path(__file__).parent + + +def fixture(name): + return str(TESTS / name) + + +@pytest.fixture(scope="module") +def am244(): + return endf.Material(fixture("n-095_Am_244.endf.xz")) + + +@pytest.fixture(scope="module") +def rust_am244(): + return _endf.Material(fixture("n-095_Am_244.endf.xz")) + + +# --------------------------------------------------------------------------- +# Records and functions +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + "text", + [ + " 1.234567+8", + "-1.23481+10", + " 3.14159 ", + "1.234567-120", + " ", + " 0.0000000", + ], +) +def test_float_endf_matches(text): + assert _endf.float_endf(text) == endf.records.float_endf(text) + + +@pytest.mark.parametrize("text", [" 9552", " -1", " ", " 12345"]) +def test_int_endf_matches(text): + assert _endf.int_endf(text) == endf.records.int_endf(text) + + +def test_tabulated1d_evaluates_the_same(am244): + reference = am244.section_data[3, 1]["sigma"] + tabulated = _endf.Tabulated1D( + list(reference.x), + list(reference.y), + list(reference.breakpoints), + list(reference.interpolation), + ) + assert len(tabulated) == len(reference) + assert tabulated.breakpoints == list(reference.breakpoints) + for energy in (1.0e-5, 0.0253, 1.0e3, 1.0e6, 1.9e7): + assert tabulated(energy) == pytest.approx(reference(energy), rel=1e-12) + # Called on a sequence it comes back as a list of the same length. + grid = [1.0, 10.0, 100.0] + assert tabulated(grid) == pytest.approx([reference(e) for e in grid], rel=1e-12) + + +# --------------------------------------------------------------------------- +# Materials +# --------------------------------------------------------------------------- + + +def test_material_sees_the_same_sections(am244, rust_am244): + assert rust_am244.MAT == am244.MAT + assert rust_am244.sections == sorted(am244.sections) + assert rust_am244.section_text == am244.section_text + assert (3, 1) in rust_am244 + assert (3, 999) not in rust_am244 + + +def test_material_reads_an_uncompressed_file(tmp_path, am244): + # The binding decompresses `.xz` the way `endf.fileutils` does, and leaves + # anything else alone. + plain = tmp_path / "am244.endf" + with endf.fileutils.open_text(fixture("n-095_Am_244.endf.xz")) as fh: + plain.write_text(fh.read()) + assert _endf.Material(str(plain)).MAT == am244.MAT + + +def test_cross_section_fields_match(am244, rust_am244): + for mt in (1, 2, 18, 102): + reference = am244.section_data[3, mt] + section = rust_am244.mf3(mt) + assert section.ZA == reference["ZA"] + assert section.AWR == reference["AWR"] + assert section.QM == reference["QM"] + assert section.QI == reference["QI"] + assert section.LR == reference["LR"] + assert list(section.sigma.x) == list(reference["sigma"].x) + assert list(section.sigma.y) == list(reference["sigma"].y) + assert rust_am244.mf3(999) is None + + +def test_get_materials_matches(): + path = fixture("n-095_Am_244.endf.xz") + assert [m.MAT for m in _endf.get_materials(path)] == [ + m.MAT for m in endf.get_materials(path) + ] + + +# --------------------------------------------------------------------------- +# Reactions and nuclides +# --------------------------------------------------------------------------- + + +def test_reaction_names_match(): + for mt in range(1, 900): + assert _endf.reaction_name(mt) == endf.reaction.REACTION_NAME.get(mt) + for name, mt in endf.reaction.REACTION_MT.items(): + assert _endf.reaction_mt(name) == mt + + +def test_gnds_names_match(): + for z, a, m in [(1, 1, 0), (95, 242, 1), (49, 116, 2), (26, 56, 0)]: + assert _endf.gnds_name(z, a, m) == endf.data.gnds_name(z, a, m) + + +def test_zam_matches(): + for name in ["H1", "Am242_m1", "In116_m2", "Fe56", "n1"]: + assert _endf.zam(name) == endf.data.zam(name) + + +def test_temperature_str_matches(): + for t in [0.0, 293.6, 250.0, 900.0, 1200.4, 2500.0]: + assert _endf.temperature_str(t) == endf.data.temperature_str(t) + + +def test_photon_reaction_names_match(): + for mt in range(500, 600): + assert _endf.photon_reaction_name( + mt + ) == endf.incident_photon.PHOTON_REACTION_NAME.get(mt) + for name, mt in endf.incident_photon.PHOTON_REACTION_MT.items(): + assert _endf.photon_reaction_mt(name) == mt + + +def test_decay_modes_match(): + # RTYP packs a chain of modes as the digits of a decimal. + for rtyp in [0.0, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 7.0, 1.4, 2.4, 1.55]: + assert _endf.decay_modes(rtyp) == endf.decay.get_decay_modes(rtyp) + + +def test_normalise_branch_ratios_matches(): + for ratios in [[1.0], [0.5, 0.5], [2.0, 3.0, 5.0], [0.0, 0.0]]: + reference = list(ratios) + endf.chain.normalise_branch_ratios(reference) + assert _endf.normalise_branch_ratios(ratios) == pytest.approx(reference) + + +def test_module_tables_match(): + assert _endf.ATOMIC_SYMBOL == { + z: s for z, s in endf.data.ATOMIC_SYMBOL.items() if isinstance(z, int) + } + assert _endf.SUM_RULES == endf.data.SUM_RULES + assert _endf.INTERPOLATION_SCHEME == endf.function.INTERPOLATION_SCHEME + assert tuple(_endf.FISSION_MTS) == tuple(endf.reaction.FISSION_MTS) + assert _endf.EV_PER_MEV == endf.data.EV_PER_MEV + assert _endf.K_BOLTZMANN == endf.data.K_BOLTZMANN + + +#: The metastable decay evaluations the fixtures carry, which is what an isomer +#: table is built from — ground states are implicit. +METASTABLE_DECAY = [ + "dec-049_In_116m1.endf.xz", + "dec-049_In_116m2.endf.xz", +] + + +def test_fission_product_yields_match(): + name = "synthetic-nfy.endf.xz" + reference = endf.FissionProductYields(endf.Material(fixture(name))) + got = _endf.FissionProductYields(fixture(name)) + + assert got.nuclide == reference.nuclide + assert list(got.energies) == list(reference.energies) + for have, want in [ + (got.independent, reference.independent), + (got.cumulative, reference.cumulative), + ]: + assert len(have) == len(want) + for at_energy, want_at_energy in zip(have, want): + assert sorted(at_energy) == sorted(want_at_energy) + for product, (value, uncertainty) in at_energy.items(): + ufloat = want_at_energy[product] + assert value == pytest.approx(ufloat.nominal_value, rel=1e-15) + assert uncertainty == pytest.approx(ufloat.std_dev, rel=1e-15) + + # Reading from an already-parsed material gives the same thing. + from_material = _endf.FissionProductYields.from_material( + _endf.Material(fixture(name)) + ) + assert from_material.nuclide == got.nuclide + assert from_material.independent == got.independent + + +def test_fission_product_yields_of_an_evaluation_without_them(am244, rust_am244): + reference = endf.FissionProductYields(am244) + got = _endf.FissionProductYields.from_material(rust_am244) + assert got.energies is reference.energies is None + assert got.independent == reference.independent == [] + assert got.cumulative == reference.cumulative == [] + assert got.nuclide == reference.nuclide + + +def test_radionuclide_production_matches(): + # In-115 is the fixture with MF=9 and MF=10 production data. + name = "n-049_In-115_trimmed.endf.xz" + reference = endf.radionuclide_production(endf.Material(fixture(name))) + got = _endf.radionuclide_production(_endf.Material(fixture(name))) + + assert sorted(got) == sorted(reference) + for mt, states in reference.items(): + assert len(got[mt]) == len(states) + for have, want in zip(got[mt], states): + assert have.ZAP == want.ZAP + assert have.LFS == want.LFS + assert have.QM == pytest.approx(want.QM, rel=1e-15) + assert have.QI == pytest.approx(want.QI, rel=1e-15) + assert have.ELFS == want.ELFS + assert have.excitation_energy == pytest.approx( + want.excitation_energy, rel=1e-15 + ) + for got_tab, want_tab in [ + (have.yields, want.yields), + (have.cross_section, want.cross_section), + ]: + assert (got_tab is None) == (want_tab is None) + if want_tab is not None: + assert list(got_tab.x) == list(want_tab.x) + assert list(got_tab.y) == list(want_tab.y) + + +def test_isomer_table_matches(): + files = [fixture(name) for name in METASTABLE_DECAY] + assert _endf.isomer_table(files) == endf.isomer_table(files) + + +def test_level_to_isomeric_state_matches(): + table = endf.isomer_table([fixture(name) for name in METASTABLE_DECAY]) + cases = [ + (49, 116, 0, 0.0, 3000.0), + (49, 116, 1, 0.0, 3000.0), + (49, 116, 1, 127300.0, 3000.0), + (49, 116, 4, 162393.0, 3000.0), + (49, 116, 4, 9.0e5, 10.0), + # A nuclide with no isomers in the table maps to ground. + (26, 56, 1, 1.0e5, 3000.0), + ] + for z, a, lfs, energy, tol in cases: + assert _endf.level_to_isomeric_state( + z, a, lfs, energy, table, tol_eV=tol + ) == endf.level_to_isomeric_state(z, a, lfs, energy, table, tol_eV=tol) + + +def test_interpret_picks_the_class_by_sublibrary(am244, rust_am244): + # NSUB=10, an incident-neutron evaluation. + assert isinstance(am244.interpret(), endf.IncidentNeutron) + assert isinstance(rust_am244.interpret(), _endf.IncidentNeutron) + assert rust_am244.interpret().name == am244.interpret().name + + # NSUB=3, photoatomic. + reference = endf.Material(fixture("photoat-001_H_000.endf.xz")) + material = _endf.Material(fixture("photoat-001_H_000.endf.xz")) + assert isinstance(reference.interpret(), endf.IncidentPhoton) + assert isinstance(material.interpret(), _endf.IncidentPhoton) + assert material.interpret().atomic_number == reference.interpret().atomic_number + + # NSUB=12, thermal scattering, which neither reader has a class for. + tsl = _endf.Material(fixture("tsl-s-CH4.endf.xz")) + with pytest.raises(ValueError): + tsl.interpret() + with pytest.raises(NotImplementedError): + endf.Material(fixture("tsl-s-CH4.endf.xz")).interpret() + + +def test_incident_neutron_from_endf(am244, rust_am244): + reference = endf.IncidentNeutron.from_endf(am244) + nuclide = _endf.IncidentNeutron.from_endf(rust_am244) + + assert nuclide.name == reference.name + assert nuclide.atomic_number == reference.atomic_number + assert nuclide.mass_number == reference.mass_number + assert nuclide.metastable == reference.metastable + assert nuclide.atomic_symbol == reference.atomic_symbol + assert sorted(nuclide.reactions) == sorted(reference.reactions) + + +def test_reaction_matches_the_python_one(am244, rust_am244): + reference = endf.IncidentNeutron.from_endf(am244) + nuclide = _endf.IncidentNeutron.from_endf(rust_am244) + + for mt in sorted(reference.reactions): + want = reference[mt] + got = nuclide[mt] + assert got.MT == want.MT + assert got.q_reaction == want.q_reaction + assert got.q_massdiff == want.q_massdiff + assert sorted(got.xs) == sorted(want.xs) + assert list(got.xs["0K"].x) == list(want.xs["0K"].x) + assert list(got.xs["0K"].y) == list(want.xs["0K"].y) + assert [p.name for p in got.products] == [p.name for p in want.products] + + +def test_reactions_are_reachable_by_name(rust_am244): + nuclide = _endf.IncidentNeutron.from_endf(rust_am244) + assert nuclide["elastic"].MT == 2 + assert nuclide["(n,gamma)"].MT == 102 + assert 2 in nuclide + assert 999 not in nuclide + with pytest.raises(ValueError): + nuclide[999] + + +def test_fission_products_carry_their_emission_modes(rust_am244): + nuclide = _endf.IncidentNeutron.from_endf(rust_am244) + modes = [p.emission_mode for p in nuclide[18].products] + assert modes[0] == "prompt" + precursors = endf.Material(fixture("n-095_Am_244.endf.xz")) + assert modes.count("delayed") == len(precursors.section_data[1, 455]["lambda"]) + # The total neutron is derived, not a product. + assert [p.emission_mode for p in nuclide[18].derived_products] == ["total"] + + +def test_distributions_come_across_tagged(rust_am244): + nuclide = _endf.IncidentNeutron.from_endf(rust_am244) + # Level inelastic scattering: an angle from MF=4, an energy from the + # kinematics. + distribution = nuclide[51].products[0].distribution[0] + assert distribution["kind"] == "uncorrelated" + assert distribution["energy"]["kind"] == "level-inelastic" + assert distribution["energy"]["threshold"] > 0.0 + assert {mu["kind"] for mu in distribution["angle"]["mu"]} == {"legendre"} + + # The fission spectrum is a Maxwellian in this evaluation. + fission = nuclide[18].products[0].distribution[0] + assert fission["energy"]["kind"] == "maxwell" + assert set(fission["energy"]["theta"]) == {"x", "y", "breakpoints", "interpolation"} + + +def test_removal_xs_matches(am244, rust_am244): + reference = endf.IncidentNeutron.from_endf(am244).removal_xs("0K", 0.0) + got = _endf.IncidentNeutron.from_endf(rust_am244).removal_xs("0K", 0.0) + assert list(got.x) == list(reference.x) + assert got.y == pytest.approx(list(reference.y), rel=1e-9) + + +# --------------------------------------------------------------------------- +# ACE +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def li6_ace(): + return endf.ace.get_tables(fixture("Li6.ace.xz"))[0] + + +@pytest.fixture(scope="module") +def rust_li6_ace(): + return _endf.get_tables(fixture("Li6.ace.xz"))[0] + + +def test_ace_table_header_matches(li6_ace, rust_li6_ace): + assert rust_li6_ace.name == li6_ace.name + assert rust_li6_ace.atomic_weight_ratio == li6_ace.atomic_weight_ratio + assert rust_li6_ace.kT == li6_ace.kT + assert rust_li6_ace.temperature == li6_ace.temperature + assert rust_li6_ace.zaid == li6_ace.zaid + assert rust_li6_ace.data_type == li6_ace.data_type.value + assert rust_li6_ace.nxs == list(li6_ace.nxs) + assert rust_li6_ace.jxs == list(li6_ace.jxs) + assert len(rust_li6_ace.xss) == len(li6_ace.xss) + + +def test_incident_neutron_from_ace_matches(li6_ace, rust_li6_ace): + reference = endf.IncidentNeutron.from_ace(li6_ace) + nuclide = _endf.IncidentNeutron.from_ace(rust_li6_ace) + + assert nuclide.name == reference.name + assert nuclide.temperatures == reference.temperatures + assert nuclide.kTs == list(reference.kTs) + assert sorted(nuclide.reactions) == sorted(reference.reactions) + for mt in sorted(reference.reactions): + assert nuclide[mt].redundant == reference[mt].redundant + assert nuclide.reaction_components(mt) == reference.get_reaction_components(mt) + + temperature = nuclide.temperatures[0] + assert nuclide.energy[temperature] == pytest.approx( + list(reference.energy[temperature]), rel=1e-15 + ) + + +def test_an_unknown_metastable_scheme_is_refused(rust_li6_ace): + with pytest.raises(ValueError, match="mcnp"): + _endf.IncidentNeutron.from_ace(rust_li6_ace, "nonsense") + + +# --------------------------------------------------------------------------- +# Photons, decay and chains +# --------------------------------------------------------------------------- + + +def test_incident_photon_matches(): + photoatomic = fixture("photoat-001_H_000.endf.xz") + relaxation = fixture("atom-001_H_000.endf.xz") + reference = endf.IncidentPhoton.from_endf( + endf.Material(photoatomic), endf.Material(relaxation) + ) + element = _endf.IncidentPhoton.from_endf( + _endf.Material(photoatomic), _endf.Material(relaxation) + ) + + assert element.atomic_number == reference.atomic_number + assert element.name == reference.name + assert sorted(element.reactions) == sorted(reference.reactions) + relaxation = reference.atomic_relaxation + assert element.atomic_relaxation["subshells"] == relaxation.subshells + assert element.atomic_relaxation["binding_energy"] == pytest.approx( + {k: float(v) for k, v in relaxation.binding_energy.items()} + ) + coherent = element.reactions[502] + assert coherent["name"] == "coherent" + assert "scattering_factor" in coherent + assert "anomalous_real" in coherent + + +def test_decay_matches(): + path = fixture("dec-049_In_116m1.endf.xz") + reference = endf.decay.Decay(path) + decay = _endf.Decay.from_endf(_endf.Material(path)) + + assert decay.nuclide["name"] == reference.nuclide["name"] + assert decay.nuclide["stable"] == reference.nuclide["stable"] + assert decay.half_life[0] == reference.half_life.nominal_value + assert decay.decay_constant[0] == pytest.approx( + reference.decay_constant.nominal_value, rel=1e-12 + ) + assert decay.decay_energy[0] == pytest.approx( + reference.decay_energy.nominal_value, rel=1e-12 + ) + assert [m["modes"] for m in decay.modes] == [m.modes for m in reference.modes] + assert [m["daughter"] for m in decay.modes] == [m.daughter for m in reference.modes] + + # Gammas and x-rays are both photons, so their lines merge into one source. + sources = decay.sources + assert sorted(sources) == sorted(reference.sources) + for particle, dist in sources.items(): + assert dist["x"] == pytest.approx( + list(reference.sources[particle].x), rel=1e-12 + ) + assert dist["p"] == pytest.approx( + list(reference.sources[particle].p), rel=1e-12 + ) + + +def test_a_material_with_no_decay_section_is_refused(rust_am244): + with pytest.raises(ValueError): + _endf.Decay.from_endf(rust_am244) + + +DECAY_FILES = [ + "dec-048_Cd_116.endf.xz", + "dec-049_In_115.endf.xz", + "dec-049_In_116.endf.xz", + "dec-049_In_116m1.endf.xz", + "dec-049_In_116m2.endf.xz", + "dec-050_Sn_115.endf.xz", + "dec-050_Sn_116.endf.xz", + "dec-054_Xe_136.endf.xz", + "dec-054_Xe_137.endf.xz", + "dec-055_Cs_137.endf.xz", +] + +NEUTRON_FILES = [ + "n-049_In-115_trimmed.endf.xz", + "n-054_Xe_136_trimmed.endf.xz", +] + + +def test_chain_matches(): + reference = endf.chain.Chain.from_endf( + [endf.Material(fixture(n)) for n in DECAY_FILES], + [], + [endf.Material(fixture(n)) for n in NEUTRON_FILES], + reactions=("(n,gamma)",), + progress=False, + ) + chain = _endf.Chain.from_endf( + [_endf.Material(fixture(n)) for n in DECAY_FILES], + [], + [_endf.Material(fixture(n)) for n in NEUTRON_FILES], + ["(n,gamma)"], + ) + + assert len(chain) == len(reference) + assert [n["name"] for n in chain.nuclides] == [n.name for n in reference.nuclides] + for got, want in zip(chain.nuclides, reference.nuclides): + assert got["half_life"] == want.half_life + assert got["decay_energy"] == pytest.approx(want.decay_energy, rel=1e-12) + assert [m["type"] for m in got["decay_modes"]] == [ + m.type for m in want.decay_modes + ] + assert [m["target"] for m in got["decay_modes"]] == [ + m.target for m in want.decay_modes + ] + assert [r["Q"] for r in got["reactions"]] == [r.Q for r in want.reactions] + + assert "In116_m1" in chain + assert chain["In116_m1"]["name"] == "In116_m1" + # One step from In115 reaches both its beta- daughter and its capture + # product, so three nuclides in all. + assert sorted(n["name"] for n in chain.reduce(["In115"], 1).nuclides) == [ + "In115", + "In116", + "Sn115", + ] + # The evaluated branching ratios are consistent. + assert chain.validate(1e-4) == [] + + +# --------------------------------------------------------------------------- +# section_data +# +# The dictionaries are compared whole and recursively against the Python +# reader's, on every fixture, so a renamed or missing key fails rather than +# going unnoticed. +# --------------------------------------------------------------------------- + + +def compare_values(got, want, where): + """Assert two section-dictionary values are the same thing.""" + import numpy as np + + from endf.function import Tabulated1D, Tabulated2D + + if isinstance(want, Tabulated2D): + assert list(got.breakpoints) == list(want.breakpoints), f"{where}.breakpoints" + assert list(got.interpolation) == list(want.interpolation), f"{where}.int" + elif isinstance(want, Tabulated1D): + assert list(got.x) == list(want.x), f"{where}.x" + assert list(got.y) == list(want.y), f"{where}.y" + assert list(got.breakpoints) == list(want.breakpoints), f"{where}.breakpoints" + assert list(got.interpolation) == list(want.interpolation), f"{where}.int" + elif isinstance(want, dict): + assert sorted(got) == sorted(want), f"{where}: keys" + for key in want: + compare_values(got[key], want[key], f"{where}[{key!r}]") + elif isinstance(want, (list, tuple, np.ndarray)): + want = list(want) + got = list(got) + assert len(got) == len(want), f"{where}: length" + for i, (g, w) in enumerate(zip(got, want)): + compare_values(g, w, f"{where}[{i}]") + elif isinstance(want, (float, np.floating)): + assert got == pytest.approx(float(want), rel=1e-15, abs=0.0), where + else: + assert got == want, where + + +ENDF_FIXTURES = sorted(p.name for p in TESTS.glob("*.endf.xz")) + + +@pytest.mark.parametrize("name", ENDF_FIXTURES) +def test_section_data_matches(name): + reference = endf.Material(fixture(name)) + material = _endf.Material(fixture(name)) + + section_data = material.section_data + assert section_data, f"{name}: no section has a dictionary form" + + for key, got in section_data.items(): + compare_values(got, reference.section_data[key], f"{name} {key}") + + # And the same through the item lookup. + for key in section_data: + compare_values(material[key], reference.section_data[key], f"{name} {key}") + + +def test_asking_for_a_section_that_is_not_there(rust_am244): + with pytest.raises(ValueError, match="no section"): + rust_am244[3, 999] + + +#: The files whose sections have no dictionary form in the extension. +#: +#: Empty: every section the fixtures contain has one. Kept, and asserted +#: against, so a projection that stops being built shows up as a failure here +#: rather than as a section quietly missing from `section_data`. +SECTIONS_WITHOUT_A_DICT = set() + + +def test_the_uncovered_section_list_is_accurate(): + missing = set() + for name in ENDF_FIXTURES: + reference = endf.Material(fixture(name)) + material = _endf.Material(fixture(name)) + have = set(material.section_data) + missing |= {key for key in reference.section_data if key not in have} + + assert missing == SECTIONS_WITHOUT_A_DICT, ( + "the set of sections with no dictionary form has changed. If one now " + "has one, delete it from SECTIONS_WITHOUT_A_DICT; if a projection " + "broke, that is the bug." + ) diff --git a/tests/test_rust_stub.py b/tests/test_rust_stub.py new file mode 100644 index 0000000..9cdf374 --- /dev/null +++ b/tests/test_rust_stub.py @@ -0,0 +1,121 @@ +"""The type stub, held to what the extension module actually exports. + +A hand-written `.pyi` for a compiled module rots the moment someone adds a +method and forgets it — and it rots silently, because nothing imports it. This +parses the stub and compares the names it declares against the built module, +in both directions. + +It checks names, not types: a type checker would have to run to verify those, +and the value here is catching the method that was added to `lib.rs` and never +written down. Skipped whole when the extension is not built. +""" + +import ast +from pathlib import Path + +import pytest + +_endf = pytest.importorskip( + "_endf", reason="the Rust extension module is not built; see test_rust_bindings.py" +) + +STUB = Path(__file__).parent.parent / "crates" / "endf-py" / "_endf.pyi" + + +def parse_stub(): + """The stub's declared names: module-level, and per class.""" + tree = ast.parse(STUB.read_text()) + module_level = set() + classes = {} + for node in tree.body: + if isinstance(node, ast.ClassDef): + members = set() + for item in node.body: + if isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)): + members.add(item.name) + elif isinstance(item, ast.AnnAssign) and isinstance( + item.target, ast.Name + ): + members.add(item.target.id) + classes[node.name] = members + module_level.add(node.name) + elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): + module_level.add(node.name) + elif isinstance(node, ast.AnnAssign) and isinstance(node.target, ast.Name): + module_level.add(node.target.id) + return module_level, classes + + +def public(names): + return {n for n in names if not n.startswith("_")} + + +def test_the_stub_file_is_there(): + assert STUB.is_file(), f"{STUB} is missing" + + +def test_module_level_names_match(): + declared, _ = parse_stub() + actual = public(dir(_endf)) + + missing = actual - declared + assert not missing, ( + f"the extension exports {sorted(missing)}, which the stub does not " + f"declare. Add them to {STUB.name}." + ) + + extra = public(declared) - actual + assert not extra, ( + f"the stub declares {sorted(extra)}, which the extension does not " + f"export. Delete them from {STUB.name}." + ) + + +def test_class_members_match(): + _, classes = parse_stub() + + for name in sorted(public(dir(_endf))): + obj = getattr(_endf, name) + if not isinstance(obj, type): + continue + assert name in classes, f"{name} is a class but the stub has no ClassDef" + + actual = public(dir(obj)) + declared = public(classes[name]) + + missing = actual - declared + assert not missing, ( + f"{name} has {sorted(missing)}, which the stub does not declare" + ) + + extra = declared - actual + assert not extra, ( + f"the stub declares {name}.{sorted(extra)}, which does not exist" + ) + + +def test_the_stub_is_installed_beside_the_module(): + # Finding `_endf.pyi` in the source tree is not the same as a consumer + # getting it. maturin turns that file into a PEP 561 package — the + # extension, `__init__.pyi` and a `py.typed` marker together — but only + # because the file is there, which is exactly the kind of implicit + # behaviour worth pinning. A wheel built without it works perfectly and + # silently carries no types at all. + installed = Path(_endf.__file__).parent + + assert (installed / "__init__.pyi").is_file(), ( + f"no stub installed at {installed}: the wheel was built without one, " + "so nothing using this module gets types" + ) + assert (installed / "py.typed").is_file(), ( + f"no py.typed marker at {installed}: type checkers ignore the stub without it" + ) + + +def test_the_installed_stub_is_the_one_in_the_tree(): + # Otherwise the tests above check a stub nobody ships. + installed = Path(_endf.__file__).parent / "__init__.pyi" + assert installed.read_text() == STUB.read_text(), ( + "the installed stub differs from crates/endf-py/_endf.pyi; the wheel " + "is stale, so rebuild it before trusting the checks above" + ) diff --git a/tests/tsl-s-CH4.endf.xz b/tests/tsl-s-CH4.endf.xz new file mode 100644 index 0000000..2caf4f1 Binary files /dev/null and b/tests/tsl-s-CH4.endf.xz differ diff --git a/tools/dump_chain_golden.py b/tools/dump_chain_golden.py new file mode 100644 index 0000000..ee3836e --- /dev/null +++ b/tools/dump_chain_golden.py @@ -0,0 +1,134 @@ +# SPDX-License-Identifier: MIT +"""Dump a golden reference for a depletion chain built from several files. + +`dump_golden.py` writes one dump per fixture, which suits a reader that takes +one file. A chain is the join of three sub-libraries, so it needs its own +golden naming all of them. + + python tools/dump_chain_golden.py +""" + +from __future__ import annotations + +import difflib +import io +import lzma +import sys +from pathlib import Path + +import endf +from endf.chain import Chain + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from dump_golden import Dump # noqa: E402 + +ROOT = Path(__file__).resolve().parent.parent +GOLDEN_DIR = ROOT / "crates" / "endf" / "tests" / "golden" + +#: The decay evaluations of the chain. Between them these close every path the +#: chain follows, so no product needs a stand-in except Cs137's, which is +#: deliberate: barium is absent, so the stand-in walk runs. +DECAY = [ + "dec-048_Cd_116.endf.xz", + "dec-049_In_115.endf.xz", + "dec-049_In_116.endf.xz", + "dec-049_In_116m1.endf.xz", + "dec-049_In_116m2.endf.xz", + "dec-050_Sn_115.endf.xz", + "dec-050_Sn_116.endf.xz", + "dec-054_Xe_136.endf.xz", + "dec-054_Xe_137.endf.xz", + "dec-055_Cs_137.endf.xz", +] + +#: The neutron evaluations, which supply the transmutation Q values. +NEUTRON = [ + "n-049_In-115_trimmed.endf.xz", + "n-054_Xe_136_trimmed.endf.xz", +] + +#: Capture only. The fixtures do not close the (n,2n) and charged-particle +#: paths, and an unclosed path exercises the stand-in walk rather than the +#: chain, which is what the decay fixtures are already for. +REACTIONS = ["(n,gamma)"] + + +def dump_chain(d: Dump, path: str, chain) -> None: + d.int(f"{path}/n", len(chain.nuclides)) + for i, nuclide in enumerate(chain.nuclides): + np_ = f"{path}/{i}" + d.text(f"{np_}/name", nuclide.name) + if nuclide.half_life is not None: + d.float(f"{np_}/half_life", nuclide.half_life) + d.float(f"{np_}/decay_energy", nuclide.decay_energy) + for j, mode in enumerate(nuclide.decay_modes): + mp = f"{np_}/decay/{j}" + d.text(f"{mp}/type", mode.type) + if mode.target is not None: + d.text(f"{mp}/target", mode.target) + d.float(f"{mp}/branching_ratio", mode.branching_ratio) + for j, rx in enumerate(nuclide.reactions): + rp = f"{np_}/reaction/{j}" + d.text(f"{rp}/type", rx.type) + if rx.target is not None: + d.text(f"{rp}/target", rx.target) + d.float(f"{rp}/Q", rx.Q) + d.float(f"{rp}/branching_ratio", rx.branching_ratio) + + +def generate(out) -> None: + """Write the whole dump to an open text stream.""" + decay = [endf.Material(ROOT / "tests" / n) for n in DECAY] + neutron = [endf.Material(ROOT / "tests" / n) for n in NEUTRON] + chain = Chain.from_endf( + decay, [], neutron, reactions=tuple(REACTIONS), progress=False + ) + + out.write("# golden reference for a depletion chain, by the Python reader\n") + out.write("# regenerate with: python tools/dump_chain_golden.py\n") + out.write("KIND chain\n") + for name in DECAY: + out.write(f"DECAY tests/{name}\n") + for name in NEUTRON: + out.write(f"NEUTRON tests/{name}\n") + for name in REACTIONS: + out.write(f"REACTION {name}\n") + dump_chain(Dump(out), "chain", chain) + + +def main() -> None: + target = GOLDEN_DIR / "chain.txt.xz" + + # As in dump_golden.py, the check compares text rather than compressed + # bytes, which are not portable between liblzma versions. + if "--check" in sys.argv[1:]: + fresh = io.StringIO() + generate(fresh) + with lzma.open(target, "rt") as fh: + stored = fh.read() + if fresh.getvalue() == stored: + print(f"{target.relative_to(ROOT)} matches", file=sys.stderr) + return + print(f"{target.relative_to(ROOT)}: drifted", file=sys.stderr) + diff = difflib.unified_diff( + stored.splitlines(), + fresh.getvalue().splitlines(), + fromfile="stored", + tofile="regenerated", + lineterm="", + n=1, + ) + for i, line in enumerate(diff): + if i >= 40: + print(" ...", file=sys.stderr) + break + print(f" {line}", file=sys.stderr) + sys.exit("the chain golden no longer matches the reader") + + with lzma.open(target, "wt", preset=9) as out: + generate(out) + print(f"{target.relative_to(ROOT)}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/tools/dump_golden.py b/tools/dump_golden.py new file mode 100644 index 0000000..b4dd288 --- /dev/null +++ b/tools/dump_golden.py @@ -0,0 +1,1672 @@ +# SPDX-License-Identifier: MIT +"""Dump golden files from the Python reader for the Rust port to check against. + +The Rust crate is being ported file by file, and the only thing that makes that +safe is holding it to what the Python reader already produces. This writes that +reference out in a format the Rust test reads without pulling in a JSON +dependency. + +Every value is emitted as one line:: + + V + +where the path names the value — ``0/3/1/sigma/x`` is the MF=3 MT=1 cross +section abscissae of the first material — and the tag says how to read the rest: +``F`` floats, ``I`` integers, ``T`` a hex-encoded string. Strings are hex +because ENDF text fields are fixed-width and carry significant spaces, which a +whitespace-separated format would eat. + +The Rust test builds the same map from its own parse and compares the two whole. +A path present on one side and not the other fails, so a field that is renamed, +dropped or added is caught as loudly as one whose value is wrong. + +Floats are written with ``repr``, the shortest string that round-trips to the +same double. Rust's float parser is correctly rounded, so it recovers +bit-identical values and the comparison is exact rather than approximate. + +Regenerate every golden file:: + + python tools/dump_golden.py + +Add a fixture and regenerate only it:: + + python tools/dump_golden.py tests/data/n-092_U_235.endf + +Check that the stored goldens still match what the reader produces, without +writing anything:: + + python tools/dump_golden.py --check + +The check compares the *text*, not the compressed bytes: two xz encoders can +write the same content differently, so a byte comparison fails on a machine +whose liblzma differs from the one that wrote the file. A real difference is +reported as a diff of the offending lines. +""" + +from __future__ import annotations + +import difflib +import io +import lzma +import sys +from pathlib import Path + +import endf + +ROOT = Path(__file__).resolve().parent.parent +GOLDEN_DIR = ROOT / "crates" / "endf" / "tests" / "golden" + +#: Where ENDF fixtures are looked for when no argument is given. `tests/` holds +#: the original fixture; `tests/data/` is where wider library and format +#: coverage goes. +FIXTURE_DIRS = [ROOT / "tests", ROOT / "tests" / "data"] + +#: Fixtures are stored xz-compressed — an evaluation is highly repetitive and +#: compresses about six to one — so the suffix to match on is the one before +#: the `.xz`. +FIXTURE_SUFFIXES = {".endf", ".dat", ".ace"} + + +def fixture_kind(path: Path) -> str: + """The format suffix of a fixture, ignoring any `.xz`.""" + if path.suffix == ".xz": + path = path.with_suffix("") + return path.suffix.lower() + + +#: How many interior sample points to record per tabulated function, on top of +#: the ones the region boundaries force. Enough to exercise each interpolation +#: law without the golden file growing to the size of the evaluation. +MAX_SAMPLES = 24 + + +class Dump: + """Collects `path -> value` lines.""" + + def __init__(self, out): + self.out = out + + def floats(self, path: str, values) -> None: + self.out.write(f"V {path} F " + " ".join(repr(float(v)) for v in values) + "\n") + + def float(self, path: str, value) -> None: + self.floats(path, [value]) + + def ints(self, path: str, values) -> None: + self.out.write(f"V {path} I " + " ".join(str(int(v)) for v in values) + "\n") + + def int(self, path: str, value) -> None: + self.ints(path, [value]) + + def text(self, path: str, value: str) -> None: + self.out.write(f"V {path} T {value.encode().hex()}\n") + + def tab1(self, path: str, table) -> None: + """A TAB1: its tabulation, and the interpolation sampled.""" + self.floats(f"{path}/x", table.x) + self.floats(f"{path}/y", table.y) + self.ints(f"{path}/bp", table.breakpoints) + self.ints(f"{path}/int", table.interpolation) + points = sample_points(table) + if points: + self.floats(f"{path}/evalx", points) + self.floats(f"{path}/evaly", [table(p) for p in points]) + + def tab2(self, path: str, table) -> None: + self.ints(f"{path}/bp", table.breakpoints) + self.ints(f"{path}/int", table.interpolation) + + +def sample_points(table) -> list[float]: + """Points at which to pin the interpolation. + + Bin midpoints, because a tabulated point returns its own value whatever the + interpolation law is and so proves nothing. The bins on either side of a + region boundary are always included: picking the scheme for the bin a point + falls in is the part of the evaluation most likely to be got wrong. + """ + x = table.x + if len(x) < 2: + return [float(v) for v in x] + + def midpoint(i: int) -> float: + return float(0.5 * (x[i] + x[i + 1])) + + wanted = set() + for b in table.breakpoints: + for i in (int(b) - 2, int(b) - 1): + if 0 <= i < len(x) - 1: + wanted.add(i) + n_bins = len(x) - 1 + step = max(1, n_bins // MAX_SAMPLES) + wanted.update(range(0, n_bins, step)) + + points = [midpoint(i) for i in sorted(wanted)] + # Both ends, and outside them, to pin the clamping behaviour. + return [float(x[0]) * 0.5, float(x[0]), *points, float(x[-1]), float(x[-1]) * 2.0] + + +# -------------------------------------------------------------------------- +# One dumper per ENDF file the Rust crate can parse. Extend as the port goes. +# -------------------------------------------------------------------------- + + +def dump_nu(d: Dump, path: str, section: dict) -> None: + """A nu-bar, in whichever of the two forms the evaluation uses.""" + if "C" in section: + d.floats(f"{path}/poly", section["C"]) + if "nu" in section: + d.tab1(f"{path}/tab", section["nu"]) + + +def dump_mf1(d: Dump, path: str, mt: int, section: dict) -> None: + if mt == 451: + for key in ( + "ZA", + "LRP", + "LFI", + "NLIB", + "NMOD", + "LIS", + "LISO", + "NFOR", + "LREL", + "NSUB", + "NVER", + "LDRV", + "NWD", + "NXC", + ): + d.int(f"{path}/{key}", section[key]) + for key in ("AWR", "ELIS", "STA", "AWI", "EMAX", "TEMP"): + d.float(f"{path}/{key}", section[key]) + if section.get("ZSYMAM") is not None: + for key in ( + "ZSYMAM", + "ALAB", + "EDATE", + "AUTH", + "REF", + "DDATE", + "RDATE", + "ENDATE", + ): + d.text(f"{path}/{key}", section[key]) + for i, line in enumerate(section["HSUB"]): + d.text(f"{path}/HSUB/{i}", line) + for i, line in enumerate(section["description"]): + d.text(f"{path}/description/{i}", line) + for i, entry in enumerate(section["section_list"]): + d.ints(f"{path}/section_list/{i}", entry) + + elif mt in (452, 456): + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LNU", section["LNU"]) + dump_nu(d, path, section) + + elif mt == 455: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LDG", section["LDG"]) + d.int(f"{path}/LNU", section["LNU"]) + if "lambda" in section: + d.floats(f"{path}/lambda", section["lambda"]) + if "E_int" in section: + d.tab2(f"{path}/E_int", section["E_int"]) + for i, c in enumerate(section.get("constants", [])): + d.float(f"{path}/constants/{i}/E", c["E"]) + d.floats(f"{path}/constants/{i}/lambda", c["lambda"]) + d.floats(f"{path}/constants/{i}/alpha", c["alpha"]) + dump_nu(d, path, section) + + elif mt == 458: + # ZA comes from a CONT rather than a HEAD record here, so it is a float + # in this section and an int everywhere else. See issue #14. + d.float(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LFC", section["LFC"]) + d.int(f"{path}/NPLY", section["NPLY"]) + if "NFC" in section: + d.int(f"{path}/NFC", section["NFC"]) + for name in ("EFR", "ENP", "END", "EGP", "EGD", "EB", "ENU", "ER", "ET"): + value = section[name] + if isinstance(value, dict): + d.int(f"{path}/{name}/LDRV", value["LDRV"]) + d.tab1(f"{path}/{name}/EIFC", value["EIFC"]) + else: + # list of (coefficient, uncertainty) pairs + d.floats(f"{path}/{name}/poly", [v for pair in value for v in pair]) + + elif mt == 460: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LO", section["LO"]) + if "NG" in section: + d.int(f"{path}/NG", section["NG"]) + if "E" in section: + d.floats(f"{path}/E", section["E"]) + for i, t in enumerate(section.get("T", [])): + d.tab1(f"{path}/T/{i}", t) + if "lambda" in section: + d.floats(f"{path}/lambda", section["lambda"]) + + +def dump_mf2(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/NIS", section["NIS"]) + for a, iso in enumerate(section["isotopes"]): + ip = f"{path}/isotopes/{a}" + d.float(f"{ip}/ZAI", iso["ZAI"]) + d.float(f"{ip}/ABN", iso["ABN"]) + d.int(f"{ip}/LFW", iso["LFW"]) + d.int(f"{ip}/NER", iso["NER"]) + for b, r in enumerate(iso["ranges"]): + rp = f"{ip}/ranges/{b}" + d.float(f"{rp}/EL", r["EL"]) + d.float(f"{rp}/EH", r["EH"]) + for key in ("LRU", "LRF", "NRO", "NAPS"): + d.int(f"{rp}/{key}", r[key]) + dump_mf2_parameters(d, rp, r) + + +def dump_mf2_parameters(d: Dump, rp: str, r: dict) -> None: + """Whatever representation the range turned out to use. + + Driven by which keys are present rather than by LRU/LRF, so that a range + the dispatch skips (issue #15) emits nothing and the Rust side, which + reproduces the same skip, emits nothing either. + """ + if "APE" in r: + d.tab1(f"{rp}/APE", r["APE"]) + for key in ("SPI", "AP"): + if key in r: + d.float(f"{rp}/{key}", r[key]) + for key in ("NLS", "LAD", "NLSC", "LSSF", "IFG", "KRM", "NJS", "KRL", "NPP", "NE"): + if key in r: + d.int(f"{rp}/{key}", r[key]) + if "ES" in r: + d.floats(f"{rp}/ES", r["ES"]) + + # Resolved: Breit-Wigner and Reich-Moore both key off 'sections'. + for i, s in enumerate(r.get("sections", [])): + sp = f"{rp}/sections/{i}" + for key in ("AWRI", "QX", "APL"): + if key in s: + d.float(f"{sp}/{key}", s[key]) + for key in ("L", "LRX", "NRS"): + if key in s: + d.int(f"{sp}/{key}", s[key]) + for key in ("ER", "AJ", "GT", "GN", "GG", "GF", "GFA", "GFB"): + if key in s: + d.floats(f"{sp}/{key}", s[key]) + + # R-matrix limited. + if "particle_pairs" in r: + for key, values in r["particle_pairs"].items(): + d.floats(f"{rp}/particle_pairs/{key}", values) + for i, g in enumerate(r.get("spin_groups", [])): + gp = f"{rp}/spin_groups/{i}" + for key in ("AJ", "PJ"): + d.float(f"{gp}/{key}", g[key]) + for key in ("KBK", "KPS", "NCH", "NRS", "NX", "LCH", "LBK", "LPS"): + if key in g: + d.int(f"{gp}/{key}", g[key]) + for key, values in g["channels"].items(): + d.floats(f"{gp}/channels/{key}", values) + d.floats(f"{gp}/ER", g["ER"]) + for c, row in enumerate(g["GAM"]): + d.floats(f"{gp}/GAM/{c}", row) + for key in ("ED", "EU"): + if key in g: + d.float(f"{gp}/{key}", g[key]) + for key in ("RBR", "RBI", "PSR", "PSI"): + if key in g: + d.tab1(f"{gp}/{key}", g[key]) + + # Unresolved. + for i, u in enumerate(r.get("ranges", [])): + up = f"{rp}/ranges/{i}" + d.float(f"{up}/AWRI", u["AWRI"]) + d.int(f"{up}/L", u["L"]) + d.int(f"{up}/NJS", u["NJS"]) + for key in ("D", "AJ", "AMUN", "GNO", "GG"): + if key in u: + d.floats(f"{up}/{key}", u[key]) + for j, p in enumerate(u.get("parameters", [])): + pp = f"{up}/parameters/{j}" + for key in ("MUF", "INT", "NE"): + if key in p: + d.int(f"{pp}/{key}", p[key]) + for key in ("D", "AJ", "AMUN", "AMUX", "AMUF", "GN0", "GG"): + if key in p: + value = p[key] + if hasattr(value, "__len__"): + d.floats(f"{pp}/{key}", value) + else: + d.float(f"{pp}/{key}", value) + for key in ("E", "GX", "GF"): + if key in p: + d.floats(f"{pp}/{key}", p[key]) + + +def dump_mf3(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.float(f"{path}/QM", section["QM"]) + d.float(f"{path}/QI", section["QI"]) + d.int(f"{path}/LR", section["LR"]) + d.tab1(f"{path}/sigma", section["sigma"]) + + +def dump_mf4(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + for key in ("LTT", "LI", "LCT"): + d.int(f"{path}/{key}", section[key]) + for kind in ("legendre", "tabulated"): + if kind not in section: + continue + sub = section[kind] + sp = f"{path}/{kind}" + d.tab2(f"{sp}/E_int", sub["E_int"]) + d.float(f"{sp}/T", sub["T"]) + d.int(f"{sp}/LT", sub["LT"]) + d.floats(f"{sp}/E", sub["E"]) + for i, a in enumerate(sub.get("a_l", [])): + d.floats(f"{sp}/a_l/{i}", a) + for i, mu in enumerate(sub.get("mu", [])): + d.tab1(f"{sp}/mu/{i}", mu) + + # The interpreted form, which is what a consumer actually uses. + from endf.mf4 import AngleDistribution + + dist = AngleDistribution.from_dict(section) + dump_angle_distribution(d, f"{path}/angle", dist) + if len(dist.energy) > 0: + for cutoff in (-1.0, -0.5, 0.0, 0.5): + name = f"{cutoff:+.1f}" + d.floats( + f"{path}/angle/forward_fraction/{name}", dist.forward_fraction(cutoff) + ) + + +def dump_angle_distribution(d: Dump, path: str, dist) -> None: + """An :class:`endf.mf4.AngleDistribution`, whichever shapes it holds.""" + from numpy.polynomial import Legendre + + from endf.function import Tabulated1D + + d.floats(f"{path}/energy", dist.energy) + d.int(f"{path}/n_mu", len(dist.mu)) + for i, mu in enumerate(dist.mu): + p = f"{path}/mu/{i}" + if isinstance(mu, Legendre): + d.text(f"{p}/kind", "legendre") + d.floats(f"{p}/coef", mu.coef) + elif isinstance(mu, Tabulated1D): + d.text(f"{p}/kind", "tabulated") + d.tab1(f"{p}/f", mu) + else: + dump_univariate(d, p, mu) + + +def dump_univariate(d: Dump, p: str, u) -> None: + """One :class:`endf.univariate.Univariate`, whichever shape it is.""" + from endf.univariate import Discrete, Mixture, Tabular, Uniform + + if isinstance(u, Discrete): + d.text(f"{p}/kind", "discrete") + d.floats(f"{p}/x", u.x) + d.floats(f"{p}/p", u.p) + d.floats(f"{p}/cdf", u.cdf()) + elif isinstance(u, Tabular): + d.text(f"{p}/kind", "tabular") + d.text(f"{p}/interpolation", u.interpolation) + d.floats(f"{p}/x", u.x) + d.floats(f"{p}/p", u.p) + d.floats(f"{p}/cdf", u.cdf()) + elif isinstance(u, Uniform): + d.text(f"{p}/kind", "uniform") + d.float(f"{p}/a", u.a) + d.float(f"{p}/b", u.b) + elif isinstance(u, Mixture): + d.text(f"{p}/kind", "mixture") + d.floats(f"{p}/probability", u.probability) + for j, sub in enumerate(u.distribution): + dump_univariate(d, f"{p}/distribution/{j}", sub) + else: + raise TypeError(f"unexpected distribution {type(u)}") + + # The CDF as the file gave it, where there was one. + if getattr(u, "c", None) is not None: + d.floats(f"{p}/c", u.c) + + +def dump_energy_distribution(d: Dump, p: str, dist) -> None: + """One energy distribution object, of whichever law.""" + from endf.mf5 import ( + ArbitraryTabulated, + ContinuousTabular, + DiscretePhoton, + Evaporation, + GeneralEvaporation, + LevelInelastic, + MadlandNix, + MaxwellEnergy, + WattEnergy, + ) + + if isinstance(dist, ArbitraryTabulated): + d.text(f"{p}/kind", "arbitrary-tabulated") + d.floats(f"{p}/E", dist.energy) + for j, g in enumerate(dist.pdf): + d.tab1(f"{p}/g/{j}", g) + elif isinstance(dist, GeneralEvaporation): + d.text(f"{p}/kind", "general-evaporation") + d.float(f"{p}/U", dist.u) + d.tab1(f"{p}/theta", dist.theta) + d.tab1(f"{p}/g", dist.g) + elif isinstance(dist, MaxwellEnergy): + d.text(f"{p}/kind", "maxwell") + d.float(f"{p}/U", dist.u) + d.tab1(f"{p}/theta", dist.theta) + elif isinstance(dist, Evaporation): + d.text(f"{p}/kind", "evaporation") + d.float(f"{p}/U", dist.u) + d.tab1(f"{p}/theta", dist.theta) + elif isinstance(dist, WattEnergy): + d.text(f"{p}/kind", "watt") + d.float(f"{p}/U", dist.u) + d.tab1(f"{p}/a", dist.a) + d.tab1(f"{p}/b", dist.b) + elif isinstance(dist, MadlandNix): + d.text(f"{p}/kind", "madland-nix") + d.float(f"{p}/EFL", dist.efl) + d.float(f"{p}/EFH", dist.efh) + # The attribute is `tm`, though the format calls the field T_M. + d.tab1(f"{p}/T_M", dist.tm) + elif isinstance(dist, LevelInelastic): + d.text(f"{p}/kind", "level-inelastic") + d.float(f"{p}/threshold", dist.threshold) + d.float(f"{p}/mass_ratio", dist.mass_ratio) + elif isinstance(dist, DiscretePhoton): + d.text(f"{p}/kind", "discrete-photon") + d.int(f"{p}/primary_flag", dist.primary_flag) + d.float(f"{p}/energy", dist.energy) + d.float(f"{p}/atomic_weight_ratio", dist.atomic_weight_ratio) + elif isinstance(dist, ContinuousTabular): + d.text(f"{p}/kind", "continuous-tabular") + d.ints(f"{p}/bp", dist.breakpoints) + d.ints(f"{p}/int", dist.interpolation) + d.floats(f"{p}/E", dist.energy) + for j, eout in enumerate(dist.energy_out): + dump_univariate(d, f"{p}/energy_out/{j}", eout) + else: + raise TypeError(f"unexpected energy distribution {type(dist)}") + + +def dump_angle_energy(d: Dump, p: str, ae) -> None: + """One joint angle-energy distribution, of whichever shape.""" + from endf.angle_energy import ( + CorrelatedAngleEnergy, + KalbachMann, + NBodyPhaseSpace, + UncorrelatedAngleEnergy, + ) + + if isinstance(ae, UncorrelatedAngleEnergy): + d.text(f"{p}/kind", "uncorrelated") + if ae.angle is not None: + dump_angle_distribution(d, f"{p}/angle", ae.angle) + if ae.energy is not None: + dump_energy_distribution(d, f"{p}/energy", ae.energy) + elif isinstance(ae, KalbachMann): + d.text(f"{p}/kind", "kalbach-mann") + d.ints(f"{p}/bp", ae.breakpoints) + d.ints(f"{p}/int", ae.interpolation) + d.floats(f"{p}/E", ae.energy) + for j, eout in enumerate(ae.energy_out): + dump_univariate(d, f"{p}/energy_out/{j}", eout) + for j, r in enumerate(ae.precompound): + d.tab1(f"{p}/precompound/{j}", r) + for j, a in enumerate(ae.slope): + d.tab1(f"{p}/slope/{j}", a) + elif isinstance(ae, CorrelatedAngleEnergy): + d.text(f"{p}/kind", "correlated") + d.ints(f"{p}/bp", ae.breakpoints) + d.ints(f"{p}/int", ae.interpolation) + d.floats(f"{p}/E", ae.energy) + for j, eout in enumerate(ae.energy_out): + dump_univariate(d, f"{p}/energy_out/{j}", eout) + for j, mu_j in enumerate(ae.mu): + for k, mu_jk in enumerate(mu_j): + dump_univariate(d, f"{p}/mu/{j}/{k}", mu_jk) + elif isinstance(ae, NBodyPhaseSpace): + d.text(f"{p}/kind", "nbody") + d.float(f"{p}/total_mass", ae.total_mass) + d.int(f"{p}/n_particles", ae.n_particles) + d.float(f"{p}/atomic_weight_ratio", ae.atomic_weight_ratio) + d.float(f"{p}/q_value", ae.q_value) + else: + raise TypeError(f"unexpected angle-energy distribution {type(ae)}") + + +def dump_mf5(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/NK", section["NK"]) + for i, sub in enumerate(section["subsections"]): + sp = f"{path}/subsections/{i}" + d.int(f"{sp}/LF", sub["LF"]) + d.tab1(f"{sp}/p", sub["p"]) + dist = sub["distribution"] + dp = f"{sp}/distribution" + for key in ("U", "EFL", "EFH"): + if key in dist: + d.float(f"{dp}/{key}", dist[key]) + if "E_int" in dist: + d.tab2(f"{dp}/E_int", dist["E_int"]) + if "E" in dist: + d.floats(f"{dp}/E", dist["E"]) + # LF=1 stores a list under 'g'; LF=5 stores a single table there. + if isinstance(dist.get("g"), list): + for j, g in enumerate(dist["g"]): + d.tab1(f"{dp}/g/{j}", g) + elif "g" in dist: + d.tab1(f"{dp}/g", dist["g"]) + for key in ("theta", "a", "b", "T_M"): + if key in dist: + d.tab1(f"{dp}/{key}", dist[key]) + + +def dump_mf6(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + for key in ("JP", "LCT", "NK"): + d.int(f"{path}/{key}", section[key]) + for i, p in enumerate(section["products"]): + pp = f"{path}/products/{i}" + d.int(f"{pp}/ZAP", p["ZAP"]) + d.float(f"{pp}/AWP", p["AWP"]) + d.int(f"{pp}/LIP", p["LIP"]) + d.int(f"{pp}/LAW", p["LAW"]) + d.tab1(f"{pp}/y_i", p["y_i"]) + if "distribution" not in p: + continue + dump_mf6_distribution(d, f"{pp}/distribution", p["distribution"]) + + +def dump_mf6_distribution(d: Dump, dp: str, dist: dict) -> None: + """One MF=6 distribution. Shared with MF=26, which reuses LAW=1 and LAW=2.""" + for key in ("LANG", "LEP", "NR", "NE", "LIDP", "NPSX"): + if key in dist: + d.int(f"{dp}/{key}", dist[key]) + for key in ("SPI", "APSX"): + if key in dist: + d.float(f"{dp}/{key}", dist[key]) + if "E_int" in dist: + d.tab2(f"{dp}/E_int", dist["E_int"]) + if "E" in dist: + d.floats(f"{dp}/E", dist["E"]) + for j, s in enumerate(dist.get("distribution", [])): + sp = f"{dp}/distribution/{j}" + for key in ("ND", "NA", "NW", "NEP", "LANG", "NL", "LTP", "NRM", "NMU"): + if key in s: + d.int(f"{sp}/{key}", s[key]) + if "E" in s: + d.float(f"{sp}/E", s["E"]) + if "E'" in s: + d.floats(f"{sp}/Eout", s["E'"]) + for key in ("A_l", "A"): + if key in s: + d.floats(f"{sp}/{key}", s[key]) + if "b" in s: + for r, row in enumerate(s["b"]): + d.floats(f"{sp}/b/{r}", row) + if "mu_int" in s: + d.tab2(f"{sp}/mu_int", s["mu_int"]) + for k, entry in enumerate(s.get("mu", [])): + d.float(f"{sp}/mu/{k}/mu", entry["mu"]) + d.tab1(f"{sp}/mu/{k}/f", entry["f"]) + + +def _pairs(d: Dump, path: str, values) -> None: + """A list of (value, uncertainty) pairs, flattened.""" + d.floats(path, [v for pair in values for v in pair]) + + +def dump_mf7(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + if mt == 2: + d.int(f"{path}/LTHR", section["LTHR"]) + for i, t in enumerate(section.get("coherent", [])): + tp = f"{path}/coherent/{i}" + d.float(f"{tp}/T", t["T"]) + if "LT" in t: + d.int(f"{tp}/LT", t["LT"]) + d.tab1(f"{tp}/S", t["S"]) + else: + d.int(f"{tp}/LI", t["LI"]) + d.floats(f"{tp}/S", t["S"]) + if "incoherent" in section: + d.float(f"{path}/incoherent/SB", section["incoherent"]["SB"]) + d.tab1(f"{path}/incoherent/W", section["incoherent"]["W"]) + elif mt == 4: + for key in ("LAT", "LASYM", "LLN", "NI", "NS"): + d.int(f"{path}/{key}", section[key]) + d.floats(f"{path}/B", section["B"]) + if "beta_int" in section: + d.tab2(f"{path}/beta_int", section["beta_int"]) + d.int(f"{path}/NB", section["NB"]) + for i, block in enumerate(section.get("beta_data", [])): + for j, t in enumerate(block): + tp = f"{path}/beta_data/{i}/{j}" + d.float(f"{tp}/T", t["T"]) + d.float(f"{tp}/beta", t["beta"]) + d.int(f"{tp}/LT", t["LT"]) + if j == 0: + d.tab1(f"{tp}/S", t["S"]) + else: + d.floats(f"{tp}/S", t["S"]) + for i, t in enumerate(section.get("Teff", [])): + d.tab1(f"{path}/Teff/{i}", t) + elif mt == 451: + d.int(f"{path}/NA", section["NA"]) + for i, e in enumerate(section["elements"]): + ep = f"{path}/elements/{i}" + d.int(f"{ep}/NAS", e["NAS"]) + d.int(f"{ep}/NI", e["NI"]) + for key in ("ZAI", "LISI", "AFI", "AWRI", "SFI"): + d.floats(f"{ep}/{key}", e[key]) + + +def dump_mf8(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + + if mt in (454, 459): + d.int(f"{path}/LE", section["LE"]) + for i, y in enumerate(section["yields"]): + yp = f"{path}/yields/{i}" + d.float(f"{yp}/E", y["E"]) + d.int(f"{yp}/NN", y["NN"]) + d.int(f"{yp}/NFP", y["NFP"]) + # The format overloads this field; the reader keys it LE on the + # first energy and I on the rest. + d.int(f"{yp}/LE_or_I", y["LE"] if i == 0 else y["I"]) + for j, p in enumerate(y["products"]): + pp = f"{yp}/products/{j}" + d.float(f"{pp}/ZAFP", p["ZAFP"]) + d.float(f"{pp}/FPS", p["FPS"]) + d.floats(f"{pp}/Y", list(p["Y"])) + return + + if mt == 457: + for key in ("LIS", "LISO", "NST", "NSP"): + d.int(f"{path}/{key}", section[key]) + d.float(f"{path}/SPI", section["SPI"]) + d.float(f"{path}/PAR", section["PAR"]) + if section["NST"] == 1: + return + d.floats(f"{path}/T1_2", list(section["T1/2"])) + d.int(f"{path}/NC", section["NC"]) + _pairs(d, f"{path}/Ex", section["Ex"]) + d.int(f"{path}/NDK", section["NDK"]) + for i, m in enumerate(section["modes"]): + mp = f"{path}/modes/{i}" + d.float(f"{mp}/RTYP", m["RTYP"]) + d.float(f"{mp}/RFS", m["RFS"]) + d.floats(f"{mp}/Q", list(m["Q"])) + d.floats(f"{mp}/BR", list(m["BR"])) + for i, s in enumerate(section["spectra"]): + sp = f"{path}/spectra/{i}" + d.float(f"{sp}/STYP", s["STYP"]) + for key in ("LCON", "LCOV", "NER"): + d.int(f"{sp}/{key}", s[key]) + for key in ("FD", "ER_AV", "FC"): + d.floats(f"{sp}/{key}", list(s[key])) + for j, r in enumerate(s.get("discrete", [])): + rp = f"{sp}/discrete/{j}" + d.floats(f"{rp}/ER", list(r["ER"])) + d.float(f"{rp}/RTYP", r["RTYP"]) + d.float(f"{rp}/TYPE", r["TYPE"]) + # A discrete record is written with NT = 6 or NT = 12 + # depending on whether the internal conversion coefficients + # were evaluated, and both lengths appear within one spectrum. + # The Python reader slices, so an absent coefficient is an + # empty tuple; the Rust reader makes it None. Same fact, so + # the empty ones are skipped here rather than compared. + for key in ("RI", "RIS", "RICC", "RICK", "RICL"): + if r.get(key): + d.floats(f"{rp}/{key}", list(r[key])) + if "continuous" in s: + d.float(f"{sp}/continuous/RTYP", s["continuous"]["RTYP"]) + d.tab1(f"{sp}/continuous/RP", s["continuous"]["RP"]) + if "continuous_covariance" in s: + c = s["continuous_covariance"] + d.int(f"{sp}/cont_cov/LB", c["LB"]) + d.floats(f"{sp}/cont_cov/Ek", c["Ek"]) + d.floats(f"{sp}/cont_cov/Fk", c["Fk"]) + if "discrete_covariance" in s: + c = s["discrete_covariance"] + for key in ("LS", "LB", "NE", "NERP"): + d.int(f"{sp}/disc_cov/{key}", c[key]) + d.floats(f"{sp}/disc_cov/Ek", c["Ek"]) + d.floats(f"{sp}/disc_cov/Fkk", c["Fkk"]) + return + + for key in ("LIS", "LISO", "NS", "NO"): + d.int(f"{path}/{key}", section[key]) + for i, s in enumerate(section["subsections"]): + sp = f"{path}/subsections/{i}" + d.float(f"{sp}/ZAP", s["ZAP"]) + d.float(f"{sp}/ELFS", s["ELFS"]) + d.int(f"{sp}/LMF", s["LMF"]) + d.int(f"{sp}/LFS", s["LFS"]) + if "ND" in s: + d.int(f"{sp}/ND", s["ND"]) + for key in ("HL", "RTYP", "ZAN", "BR", "END", "CT"): + d.floats(f"{sp}/{key}", s[key]) + + +def dump_mf9_mf10(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LIS", section["LIS"]) + d.int(f"{path}/NS", section["NS"]) + for i, level in enumerate(section["levels"]): + lp = f"{path}/levels/{i}" + d.float(f"{lp}/QM", level["QM"]) + d.float(f"{lp}/QI", level["QI"]) + d.int(f"{lp}/IZAP", level["IZAP"]) + d.int(f"{lp}/LFS", level["LFS"]) + d.tab1(f"{lp}/func", level["Y"] if "Y" in level else level["sigma"]) + + +def dump_mf12(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LO", section["LO"]) + d.int(f"{path}/NK", section["NK"]) + if "Y" in section: + d.tab1(f"{path}/Y", section["Y"]) + for i, k in enumerate(section.get("multiplicities", [])): + kp = f"{path}/multiplicities/{i}" + d.float(f"{kp}/Eg", k["Eg"]) + d.float(f"{kp}/ES", k["ES"]) + d.int(f"{kp}/LP", k["LP"]) + d.int(f"{kp}/LF", k["LF"]) + d.tab1(f"{kp}/y", k["y"]) + if "LG" in section: + d.int(f"{path}/LG", section["LG"]) + d.float(f"{path}/ES_NS", section["ES_NS"]) + d.int(f"{path}/LP", section["LP"]) + d.int(f"{path}/NT", section["NT"]) + for i, t in enumerate(section["transitions"]): + tp = f"{path}/transitions/{i}" + d.float(f"{tp}/ES", t["ES"]) + d.float(f"{tp}/TP", t["TP"]) + if "GP" in t: + d.float(f"{tp}/GP", t["GP"]) + + +def dump_mf13(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/NK", section["NK"]) + if "sigma_total" in section: + d.tab1(f"{path}/sigma_total", section["sigma_total"]) + for i, p in enumerate(section["photons"]): + pp = f"{path}/photons/{i}" + d.float(f"{pp}/EG", p["EG"]) + d.float(f"{pp}/ES", p["ES"]) + d.int(f"{pp}/LP", p["LP"]) + d.int(f"{pp}/LF", p["LF"]) + d.tab1(f"{pp}/sigma", p["sigma"]) + + +def dump_mf14(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LI", section["LI"]) + d.int(f"{path}/NK", section["NK"]) + if "LTT" in section: + d.int(f"{path}/LTT", section["LTT"]) + d.int(f"{path}/NI", section["NI"]) + for i, s in enumerate(section.get("subsections", [])): + sp = f"{path}/subsections/{i}" + d.float(f"{sp}/EG", s["EG"]) + d.float(f"{sp}/ES", s["ES"]) + if "E_int" in s: + d.tab2(f"{sp}/E_int", s["E_int"]) + d.int(f"{sp}/NE", s["NE"]) + d.floats(f"{sp}/E", s["E"]) + if "NL" in s: + d.floats(f"{sp}/NL", s["NL"]) + for j, a in enumerate(s.get("a_lk", [])): + d.floats(f"{sp}/a_lk/{j}", a) + for j, p in enumerate(s.get("p_k", [])): + d.tab1(f"{sp}/p_k/{j}", p) + + +def dump_mf15(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/NC", section["NC"]) + for i, s in enumerate(section["subsections"]): + sp = f"{path}/subsections/{i}" + d.int(f"{sp}/LF", s["LF"]) + d.tab1(f"{sp}/p", s["p"]) + d.tab2(f"{sp}/E_int", s["E_int"]) + d.int(f"{sp}/NE", s["NE"]) + d.floats(f"{sp}/E", s["E"]) + for j, g in enumerate(s["g"]): + d.tab1(f"{sp}/g/{j}", g) + + +def dump_mf23(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.float(f"{path}/EPE", section["EPE"]) + d.float(f"{path}/EFL", section["EFL"]) + d.tab1(f"{path}/sigma", section["sigma"]) + + +def dump_mf26(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/NK", section["NK"]) + for i, p in enumerate(section["products"]): + pp = f"{path}/products/{i}" + d.int(f"{pp}/ZAP", p["ZAP"]) + d.float(f"{pp}/AWI", p["AWI"]) + d.int(f"{pp}/LAW", p["LAW"]) + d.tab1(f"{pp}/y", p["y"]) + if "distribution" not in p: + continue + dist = p["distribution"] + dp = f"{pp}/distribution" + if "ET" in dist: + d.tab1(f"{dp}/ET", dist["ET"]) + else: + # LAW=1 and LAW=2 are shared with MF=6. + dump_mf6_distribution(d, dp, dist) + + +def dump_mf27(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.float(f"{path}/Z", section["Z"]) + d.tab1(f"{path}/H", section["H"]) + + +def dump_mf28(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/NSS", section["NSS"]) + for i, s in enumerate(section["shells"]): + sp = f"{path}/shells/{i}" + d.float(f"{sp}/SUBI", s["SUBI"]) + d.int(f"{sp}/NTR", s["NTR"]) + d.float(f"{sp}/EBI", s["EBI"]) + d.float(f"{sp}/ELN", s["ELN"]) + for key in ("SUBJ", "SUBK", "ETR", "FTR"): + d.floats(f"{sp}/{key}", s[key]) + + +def dump_mf33_subsection(d: Dump, sp: str, sub: dict) -> None: + """One MF=33 subsection. Shared with MF=40, which reuses the format.""" + d.float(f"{sp}/XMF1", sub["XMF1"]) + d.float(f"{sp}/XLFS1", sub["XLFS1"]) + for key in ("MAT1", "MT1", "NC", "NI"): + d.int(f"{sp}/{key}", sub[key]) + for i, nc in enumerate(sub["nc_subsections"]): + np_ = f"{sp}/nc/{i}" + d.int(f"{np_}/LTY", nc["LTY"]) + d.float(f"{np_}/E1", nc["E1"]) + d.float(f"{np_}/E2", nc["E2"]) + for key in ("NCI", "MATS", "MTS", "NEI"): + if key in nc: + d.int(f"{np_}/{key}", nc[key]) + for key in ("XMFS", "XLFSS"): + if key in nc: + d.float(f"{np_}/{key}", nc[key]) + for key in ("CI", "XMTI", "EI", "WEI"): + if key in nc: + d.floats(f"{np_}/{key}", nc[key]) + for i, ni in enumerate(sub["ni_subsections"]): + ip = f"{sp}/ni/{i}" + for key in ("LT", "LS", "LB", "NT", "NP", "NE", "NER", "NEC"): + if key in ni: + d.int(f"{ip}/{key}", ni[key]) + for key in ("Ek", "Fk", "El", "Fl", "Fkk", "ER", "EC", "Fkl"): + if key in ni: + d.floats(f"{ip}/{key}", ni[key]) + + +def dump_mf33(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/MTL", section["MTL"]) + d.int(f"{path}/NL", section["NL"]) + for i, sub in enumerate(section["subsections"]): + dump_mf33_subsection(d, f"{path}/subsections/{i}", sub) + + +def dump_mf34(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LTT", section["LTT"]) + d.int(f"{path}/NMT1", section["NMT1"]) + # 'subsections' is always empty upstream; see issue #18. Emitting nothing + # for it keeps the Rust side, which reproduces that, in agreement. + for i, sub in enumerate(section["subsections"]): + sp = f"{path}/subsections/{i}" + for key in ("MAT1", "MT1", "NL", "NSS", "LCT"): + d.int(f"{sp}/{key}", sub[key]) + for key in ("L", "L1", "NI"): + d.floats(f"{sp}/{key}", sub[key]) + for j, ss in enumerate(sub["subsubsections"]): + ssp = f"{sp}/subsubsections/{j}" + for key in ("LS", "LB", "NT", "NE"): + d.floats(f"{ssp}/{key}", ss[key]) + for k, values in enumerate(ss["Data"]): + d.floats(f"{ssp}/Data/{k}", values) + + +def dump_mf40(d: Dump, path: str, mt: int, section: dict) -> None: + d.int(f"{path}/ZA", section["ZA"]) + d.float(f"{path}/AWR", section["AWR"]) + d.int(f"{path}/LIS", section["LIS"]) + d.int(f"{path}/NS", section["NS"]) + for i, sub in enumerate(section["subsections"]): + sp = f"{path}/subsections/{i}" + d.float(f"{sp}/QM", sub["QM"]) + d.float(f"{sp}/QI", sub["QI"]) + d.int(f"{sp}/IZAP", sub["IZAP"]) + d.int(f"{sp}/LFS", sub["LFS"]) + d.int(f"{sp}/NL", sub["NL"]) + for j, ss in enumerate(sub["subsubsections"]): + dump_mf33_subsection(d, f"{sp}/subsubsections/{j}", ss) + + +#: How many XSS values to record per ACE table. The array runs to hundreds of +#: thousands of numbers; a spread across it, plus both ends and every JXS entry +#: point, pins the parse without a golden file the size of the library. +ACE_XSS_SAMPLES = 2000 + + +def ace_xss_indices(n: int, jxs) -> list[int]: + """Which XSS indices to record. Mirrored exactly on the Rust side.""" + idx = set(range(0, n, max(1, n // ACE_XSS_SAMPLES))) + idx.update(range(0, min(50, n))) + idx.update(range(max(0, n - 50), n)) + # The JXS values are offsets into XSS: where a consumer actually looks. + for j in jxs: + if 0 <= int(j) < n: + idx.add(int(j)) + return sorted(idx) + + +def dump_ace_angle(d: Dump, path: str, table) -> None: + """Every angular distribution an ACE neutron table holds. + + LAND (JXS(8)) locates one array per reaction that emits a neutron, elastic + scattering first; the arrays themselves sit in AND (JXS(9)). A locator of + -1 means the angle is bound up with the energy in the DLW block instead, + and 0 means isotropic — neither has an array to read here. + """ + from endf.ace import TableType + from endf.mf4 import AngleDistribution + + if table.data_type != TableType.NEUTRON_CONTINUOUS: + return + land, and_ = table.jxs[8], table.jxs[9] + if land <= 0: + return + + # NXS(5) reactions besides elastic scattering. + n = int(table.nxs[5]) + 1 + d.int(f"{path}/n", n) + locators = [int(table.xss[land + i]) for i in range(n)] + d.ints(f"{path}/locators", locators) + for i, locator in enumerate(locators): + if locator <= 0: + continue + dist = AngleDistribution.from_ace(table, and_, locator) + dump_angle_distribution(d, f"{path}/{i}", dist) + + +def dump_ace_dlw(d: Dump, path: str, table) -> None: + """Every angle-energy distribution an ACE neutron table holds. + + LDLW (JXS(10)) gives one locator per reaction that emits a neutron, and + the DLW block (JXS(11)) holds the distributions. A reaction may have + several, chained: each entry's first word points at the next one, and the + fourth begins the applicability of the one it introduces. + """ + from types import SimpleNamespace + + from endf.ace import TableType + from endf.angle_energy import AngleEnergy + from endf.function import Tabulated1D + + if table.data_type != TableType.NEUTRON_CONTINUOUS: + return + ldlw, dlw = int(table.jxs[10]), int(table.jxs[11]) + if ldlw <= 0: + return + + # Law 66 wants the reaction's Q value. Reactions are not read here, so a + # fixed value stands in; both readers are given the same one, which leaves + # every other field of the law under test. + rx = SimpleNamespace(q_reaction=0.0) + + n = int(table.nxs[5]) + d.int(f"{path}/n", n) + for i_reaction in range(1, n + 1): + rp = f"{path}/{i_reaction}" + lnw = int(table.xss[ldlw + i_reaction - 1]) + chain = [] + while lnw > 0: + k = len(chain) + chain.append(lnw) + d.tab1( + f"{rp}/{k}/applicability", Tabulated1D.from_ace(table, dlw + lnw + 2) + ) + dump_angle_energy(d, f"{rp}/{k}", AngleEnergy.from_ace(table, dlw, lnw, rx)) + lnw = int(table.xss[dlw + lnw - 1]) + d.ints(f"{rp}/chain", chain) + + +def dump_ace_reactions(d: Dump, path: str, table) -> None: + """Every reaction an ACE neutron table holds, index 0 being elastic.""" + from endf.ace import TableType + from endf.reaction import Reaction + + # MTR (JXS(3)) lists the reactions; without it there are none to read. + if table.data_type != TableType.NEUTRON_CONTINUOUS or table.jxs[3] <= 0: + return + n = int(table.nxs[4]) + d.int(f"{path}/n", n) + for i_reaction in range(n + 1): + rx = Reaction.from_ace(table, i_reaction) + dump_reaction(d, f"{path}/{i_reaction}", rx, rx.derived_products) + + +def dump_incident_neutron_ace(d: Dump, path: str, table) -> None: + """The nuclide an ACE table describes, above the reactions themselves.""" + from endf.ace import TableType + from endf.incident_neutron import IncidentNeutron + + # ESZ (JXS(1)) is the energy grid and MTR (JXS(3)) the reaction list; + # without them there is no nuclide to build. + if table.data_type != TableType.NEUTRON_CONTINUOUS: + return + if table.jxs[1] <= 0 or table.jxs[3] <= 0: + return + n = IncidentNeutron.from_ace(table) + + d.text(f"{path}/name", n.name) + d.int(f"{path}/atomic_number", n.atomic_number) + d.int(f"{path}/mass_number", n.mass_number) + d.int(f"{path}/metastable", n.metastable) + d.float(f"{path}/atomic_weight_ratio", n.atomic_weight_ratio) + d.floats(f"{path}/kTs", n.kTs) + for i, temperature in enumerate(n.temperatures): + d.text(f"{path}/temperatures/{i}", temperature) + d.floats(f"{path}/energy/{temperature}", n.energy[temperature]) + if temperature in n.urr: + d.floats(f"{path}/urr/{temperature}/energy", n.urr[temperature].energy) + + d.ints(f"{path}/mts", sorted(n.reactions)) + d.ints( + f"{path}/redundant", + [int(n.reactions[mt].redundant) for mt in sorted(n.reactions)], + ) + for mt in sorted(n.reactions): + d.ints(f"{path}/components/{mt}", n.get_reaction_components(mt)) + + # The removal cross section is deliberately not dumped here. It folds the + # elastic angular distribution into the total, and for ACE data the Python + # `forward_fraction` returns uninitialized memory — see issue #21 — so + # there is nothing stable to compare against. It is dumped on the ENDF + # path, where the answer is well defined. + + # The reactions `Reaction.from_ace` builds are dumped in full elsewhere. + # What is new here are the ones this class synthesises: the total, the + # absorption and the heating from the main energy block, and the sums it + # builds where the table gives only the levels. + from_ace_mts = {2} + from_ace_mts.update( + int(table.xss[table.jxs[3] + i - 1]) for i in range(1, int(table.nxs[4]) + 1) + ) + for mt in sorted(set(n.reactions) - from_ace_mts): + dump_reaction( + d, + f"{path}/synthesised/{mt}", + n.reactions[mt], + n.reactions[mt].derived_products, + ) + + +def dump_ace(d: Dump, path: str, table) -> None: + d.text(f"{path}/name", table.name) + d.float(f"{path}/atomic_weight_ratio", table.atomic_weight_ratio) + d.float(f"{path}/kT", table.kT) + d.float(f"{path}/temperature", table.temperature) + d.int(f"{path}/zaid", table.zaid) + # The suffix letter, which both sides spell the same way. + d.text(f"{path}/data_type", table.data_type.value) + d.ints(f"{path}/pairs_iz", [iz for iz, _ in table.pairs]) + d.floats(f"{path}/pairs_aw", [aw for _, aw in table.pairs]) + d.ints(f"{path}/nxs", table.nxs) + d.ints(f"{path}/jxs", table.jxs) + d.int(f"{path}/xss_len", len(table.xss)) + idx = ace_xss_indices(len(table.xss), table.jxs) + d.ints(f"{path}/xss_idx", idx) + d.floats(f"{path}/xss_val", [table.xss[i] for i in idx]) + + dump_ace_angle(d, f"{path}/and", table) + dump_ace_dlw(d, f"{path}/dlw", table) + dump_ace_reactions(d, f"{path}/reaction", table) + dump_incident_neutron_ace(d, f"{path}/nuclide", table) + + # The unresolved resonance block, when the table has one. + from endf.urr import ProbabilityTables + + urr = ProbabilityTables.from_ace(table) + if urr is not None: + d.floats(f"{path}/urr/energy", urr.energy) + d.ints(f"{path}/urr/shape", urr.table.shape) + d.floats(f"{path}/urr/table", urr.table.ravel()) + d.int(f"{path}/urr/interpolation", urr.interpolation) + d.int(f"{path}/urr/inelastic_flag", urr.inelastic_flag) + d.int(f"{path}/urr/absorption_flag", urr.absorption_flag) + d.int(f"{path}/urr/multiply_smooth", int(urr.multiply_smooth)) + + +DUMPERS = { + 1: dump_mf1, + 2: dump_mf2, + 3: dump_mf3, + 4: dump_mf4, + 5: dump_mf5, + 6: dump_mf6, + 12: dump_mf12, + 13: dump_mf13, + 14: dump_mf14, + 15: dump_mf15, + 23: dump_mf23, + 26: dump_mf26, + 27: dump_mf27, + 28: dump_mf28, + 33: dump_mf33, + 34: dump_mf34, + 40: dump_mf40, + 7: dump_mf7, + 8: dump_mf8, + 9: dump_mf9_mf10, + 10: dump_mf9_mf10, +} + + +def dump(path: Path, out) -> None: + if fixture_kind(path) == ".ace": + dump_ace_file(path, out) + return + materials = endf.get_materials(path) + source = path.relative_to(ROOT).as_posix() + d = Dump(out) + + out.write(f"# golden reference generated from {source} by the Python reader\n") + out.write("# regenerate with: python tools/dump_golden.py\n") + out.write(f"SOURCE {source}\n") + out.write(f"MATERIALS {len(materials)}\n") + + for m, material in enumerate(materials): + out.write(f"MAT {m} {material.MAT}\n") + + # Every (MF, MT) with the number of lines its body occupies. This holds + # the section splitter to the Python reader across the whole file, + # including the files nothing parses yet. + for mf, mt in sorted(material.sections): + n_lines = len(material.section_text[mf, mt].splitlines()) + out.write(f"SECTION {m} {mf} {mt} {n_lines}\n") + + for mf, mt in sorted(material.sections): + dumper = DUMPERS.get(mf) + if dumper is not None: + dumper(d, f"{m}/{mf}/{mt}", mt, material[mf, mt]) + + dump_radionuclide_production(d, f"{m}/production", material) + dump_reactions(d, f"{m}/reaction", material) + dump_incident_neutron_endf(d, f"{m}/nuclide", material) + dump_decay(d, f"{m}/decay", material) + dump_incident_photon(d, f"{m}/photon", material) + + +def dump_incident_photon(d: Dump, path: str, material) -> None: + """The element a photoatomic or atomic-relaxation evaluation describes. + + The Compton profiles and bremsstrahlung the Python class attaches come from + an HDF5 file shipped with the package rather than from the evaluation, so + they are not dumped: the Rust reader deliberately leaves that auxiliary + data to the consumer. + """ + from endf.incident_photon import ( + PHOTON_REACTION_NAME, + AtomicRelaxation, + IncidentPhoton, + ) + + has_photoatomic = any(mf == 23 for mf, _ in material.sections) + if has_photoatomic: + n = IncidentPhoton.from_endf(material) + d.int(f"{path}/atomic_number", n.atomic_number) + d.text(f"{path}/name", n.name) + d.ints(f"{path}/mts", sorted(n.reactions)) + for mt in sorted(n.reactions): + rx = n.reactions[mt] + rp = f"{path}/{mt}" + name = PHOTON_REACTION_NAME.get(mt) + if name is not None: + d.text(f"{rp}/name", name) + for key in ("xs", "scattering_factor", "anomalous_real", "anomalous_imag"): + value = getattr(rx, key) + if value is not None: + d.tab1(f"{rp}/{key}", value) + if rx.subshell_binding_energy is not None: + d.float(f"{rp}/subshell_binding_energy", rx.subshell_binding_energy) + if rx.fluorescence_yield is not None: + d.float(f"{rp}/fluorescence_yield", rx.fluorescence_yield) + d.ints(f"{rp}/components", n._get_reaction_components(mt)) + + if (28, 533) in material.section_data: + dump_atomic_relaxation( + d, f"{path}/relaxation", AtomicRelaxation.from_endf(material) + ) + + +def dump_atomic_relaxation(d: Dump, path: str, relaxation) -> None: + for i, shell in enumerate(relaxation.subshells): + d.text(f"{path}/subshells/{i}", shell) + for shell, value in sorted(relaxation.binding_energy.items()): + d.float(f"{path}/binding_energy/{shell}", value) + for shell, value in sorted(relaxation.num_electrons.items()): + d.float(f"{path}/num_electrons/{shell}", value) + for shell, t in sorted(relaxation.transitions.items()): + tp = f"{path}/transitions/{shell}" + for i, s in enumerate(t["secondary_subshell"]): + d.text(f"{tp}/secondary/{i}", s) + for i, s in enumerate(t["tertiary_subshell"]): + d.text(f"{tp}/tertiary/{i}", s) + d.floats(f"{tp}/energy", t["energy"]) + d.floats(f"{tp}/probability", t["probability"]) + + +def dump_decay(d: Dump, path: str, material) -> None: + """Radioactive decay data, and the fission product yields beside it.""" + from endf.decay import Decay, FissionProductYields + + if (8, 457) in material.section_text: + dump_decay_section(d, path, Decay(material)) + if (8, 454) in material.section_text or (8, 459) in material.section_text: + fpy = FissionProductYields(material) + d.floats(f"{path}/fpy/energies", fpy.energies) + for kind in ("independent", "cumulative"): + for i, yields in enumerate(getattr(fpy, kind)): + for j, (name, value) in enumerate(sorted(yields.items())): + yp = f"{path}/fpy/{kind}/{i}/{j}" + d.text(f"{yp}/name", name) + d.floats(f"{yp}/yield", [value.n, value.s]) + + +def dump_decay_section(d: Dump, path: str, decay) -> None: + n = decay.nuclide + d.text(f"{path}/name", n["name"]) + for key in ("atomic_number", "mass_number", "isomeric_state", "excited_state"): + d.int(f"{path}/{key}", n[key]) + d.float(f"{path}/mass", n["mass"]) + d.int(f"{path}/stable", int(n["stable"])) + if n["spin"] is not None: + d.float(f"{path}/spin", n["spin"]) + d.float(f"{path}/parity", n["parity"]) + + if not n["stable"]: + d.floats(f"{path}/half_life", [decay.half_life.n, decay.half_life.s]) + # A half-life of zero means it was not evaluated, and both readers now + # return nothing rather than dividing by it (issue #23). Dumped as an + # empty list rather than skipped, so the two are held to agreeing that + # there is no decay constant, instead of the path simply being absent + # on both sides. + c = decay.decay_constant + d.floats(f"{path}/decay_constant", [] if c is None else [c.n, c.s]) + e = decay.decay_energy + d.floats(f"{path}/decay_energy", [e.n, e.s]) + for key, value in sorted(decay.average_energies.items()): + d.floats(f"{path}/average_energies/{key}", [value.n, value.s]) + + for i, mode in enumerate(decay.modes): + mp = f"{path}/modes/{i}" + d.text(f"{mp}/parent", mode.parent) + d.text(f"{mp}/modes", ",".join(mode.modes)) + d.text(f"{mp}/daughter", mode.daughter) + d.floats(f"{mp}/energy", [mode.energy.n, mode.energy.s]) + d.floats( + f"{mp}/branching_ratio", [mode.branching_ratio.n, mode.branching_ratio.s] + ) + + for radiation, spectrum in sorted(decay.spectra.items()): + sp = f"{path}/spectra/{radiation}" + d.text(f"{sp}/continuous_flag", spectrum["continuous_flag"]) + for key in ( + "discrete_normalization", + "energy_average", + "continuous_normalization", + ): + d.floats(f"{sp}/{key}", [spectrum[key].n, spectrum[key].s]) + for j, line in enumerate(spectrum.get("discrete", [])): + lp = f"{sp}/discrete/{j}" + d.floats(f"{lp}/energy", [line["energy"].n, line["energy"].s]) + d.text(f"{lp}/from_mode", ",".join(line["from_mode"])) + if line["type"] is not None: + d.text(f"{lp}/type", line["type"]) + d.floats(f"{lp}/intensity", [line["intensity"].n, line["intensity"].s]) + for key in ( + "positron_intensity", + "internal_pair", + "total_internal_conversion", + "k_shell_conversion", + "l_shell_conversion", + ): + if key in line: + d.floats(f"{lp}/{key}", [line[key].n, line[key].s]) + if "continuous" in spectrum: + d.text( + f"{sp}/continuous_from_mode", ",".join(spectrum["continuous"]["type"]) + ) + d.tab1(f"{sp}/continuous", spectrum["continuous"]["probability"]) + + if n["stable"] or decay.half_life.n != 0.0: + for particle, dist in sorted(decay.sources.items()): + dump_univariate(d, f"{path}/sources/{particle}", dist) + + +def dump_incident_neutron_endf(d: Dump, path: str, material) -> None: + """The nuclide an ENDF evaluation describes. + + The reactions themselves are dumped by `dump_reactions`; what is checked + here is the identity the class derives and which reactions it collects. + """ + from endf.incident_neutron import IncidentNeutron + + if (1, 451) not in material: + return + n = IncidentNeutron.from_endf(material) + d.text(f"{path}/name", n.name) + d.int(f"{path}/atomic_number", n.atomic_number) + d.int(f"{path}/mass_number", n.mass_number) + d.int(f"{path}/metastable", n.metastable) + d.text(f"{path}/atomic_symbol", n.atomic_symbol) + d.ints(f"{path}/mts", sorted(n.reactions)) + for mt in sorted(n.reactions): + d.ints(f"{path}/components/{mt}", n.get_reaction_components(mt)) + + # The removal cross section, which folds the elastic angular distribution + # into the total. Several cutoffs, since each picks a different slice of + # the forward cone. + if 1 in n.reactions and 2 in n.reactions: + for cutoff in (-1.0, 0.0, 0.5): + name = f"{cutoff:+.1f}" + d.tab1(f"{path}/removal_xs/{name}", n.removal_xs("0K", cutoff)) + + +def dump_reactions(d: Dump, path: str, material) -> None: + """Every reaction the material evaluates, gathered from its files.""" + from endf.reaction import FISSION_MTS, Reaction, _get_fission_products_endf + + mts = sorted(mt for mf, mt in material.sections if mf == 3) + d.ints(f"{path}/mts", mts) + for mt in mts: + rx = Reaction.from_endf(mt, material) + # `Reaction.from_endf` computes the derived products and then drops + # them — there is a TODO in the source saying as much. The Rust + # reaction keeps them, so they are taken from the helper here and + # compared rather than left out of the check. + derived = [] + if mt in FISSION_MTS: + derived = _get_fission_products_endf(material, mt)[1] + dump_reaction(d, f"{path}/{mt}", rx, derived) + + +def dump_reaction(d: Dump, path: str, rx, derived_products) -> None: + d.int(f"{path}/MT", rx.MT) + d.float(f"{path}/q_reaction", rx.q_reaction) + d.float(f"{path}/q_massdiff", rx.q_massdiff) + d.int(f"{path}/redundant", int(rx.redundant)) + d.int(f"{path}/center_of_mass", int(rx.center_of_mass)) + for temperature, xs in sorted(rx.xs.items()): + d.tab1(f"{path}/xs/{temperature}", xs) + for kind, products in ( + ("products", rx.products), + ("derived_products", derived_products), + ): + d.int(f"{path}/n_{kind}", len(products)) + for i, product in enumerate(products): + dump_product(d, f"{path}/{kind}/{i}", product) + + +def dump_product(d: Dump, path: str, product) -> None: + from numpy.polynomial import Polynomial + + from endf.function import Tabulated1D + + d.text(f"{path}/name", product.name) + d.text(f"{path}/emission_mode", product.emission_mode) + d.float(f"{path}/decay_rate", product.decay_rate) + if isinstance(product.yield_, Tabulated1D): + d.text(f"{path}/yield/kind", "tabulated") + d.tab1(f"{path}/yield/f", product.yield_) + elif isinstance(product.yield_, Polynomial): + d.text(f"{path}/yield/kind", "polynomial") + d.floats(f"{path}/yield/coef", product.yield_.coef) + else: + raise TypeError(f"unexpected yield {type(product.yield_)}") + for i, applicability in enumerate(product.applicability): + d.tab1(f"{path}/applicability/{i}", applicability) + d.int(f"{path}/n_distribution", len(product.distribution)) + for i, dist in enumerate(product.distribution): + dump_angle_energy(d, f"{path}/distribution/{i}", dist) + + +def dump_radionuclide_production(d: Dump, path: str, material) -> None: + """The MF=8/9/10 join, which is a derived view rather than a section.""" + from endf.radionuclide_production import radionuclide_production + + production = radionuclide_production(material) + d.ints(f"{path}/mts", sorted(production)) + for mt, states in sorted(production.items()): + for i, state in enumerate(states): + sp = f"{path}/{mt}/{i}" + d.int(f"{sp}/ZAP", state.ZAP) + d.int(f"{sp}/LFS", state.LFS) + d.float(f"{sp}/QM", state.QM) + d.float(f"{sp}/QI", state.QI) + if state.ELFS is not None: + d.float(f"{sp}/ELFS", state.ELFS) + d.float(f"{sp}/excitation_energy", state.excitation_energy) + if state.yields is not None: + d.tab1(f"{sp}/yields", state.yields) + if state.cross_section is not None: + d.tab1(f"{sp}/cross_section", state.cross_section) + + +def dump_ace_file(path: Path, out) -> None: + """An ACE fixture, which has tables rather than materials.""" + import endf.ace + + tables = endf.ace.get_tables(path) + source = path.relative_to(ROOT).as_posix() + d = Dump(out) + + out.write(f"# golden reference generated from {source} by the Python reader\n") + out.write("# regenerate with: python tools/dump_golden.py\n") + out.write("KIND ace\n") + out.write(f"SOURCE {source}\n") + out.write(f"TABLES {len(tables)}\n") + for i, table in enumerate(tables): + dump_ace(d, str(i), table) + + +def fixtures() -> list[Path]: + found = [] + for directory in FIXTURE_DIRS: + if not directory.is_dir(): + continue + for path in sorted(directory.iterdir()): + if fixture_kind(path) in FIXTURE_SUFFIXES: + found.append(path) + return found + + +def golden_for(path: Path) -> Path: + """Where a fixture's dump is stored.""" + # `Path.stem` strips only one suffix, so a fixture named + # `n-095_Am_244.endf.xz` needs both taken off. + stem = Path(path.stem).stem if path.suffix == ".xz" else path.stem + return GOLDEN_DIR / f"{stem}.txt.xz" + + +#: Relative tolerance for the paths below. Everything else is compared as text, +#: which is exact: the dump writes the shortest round-tripping decimal. +TOLERANCE = 1e-12 + + +def is_derived(path: str) -> bool: + """Whether a path holds arithmetic rather than a parsed value. + + These are the same paths `crates/endf/tests/golden.rs` compares with a + tolerance, and for the same reason: they are computed, and the computation + moves in the last bit or two between NumPy releases. The forward-scattered + fraction integrates a Legendre series, whose Clenshaw recurrence NumPy + re-associated between 2.2 and 2.4, and the removal cross section folds that + into the total. + """ + return ( + path.endswith("/evaly") + or ("/reaction/" in path and "/yield/f/" in path) + or path.endswith("/decay_constant") + or path.endswith("/decay_energy") + or "/forward_fraction/" in path + or "/removal_xs/" in path + ) + + +def same_line(stored: str, fresh: str) -> bool: + """Whether two dump lines say the same thing.""" + if stored == fresh: + return True + a, b = stored.split(), fresh.split() + # Only float values are ever compared loosely, and only on derived paths. + if len(a) != len(b) or a[:3] != b[:3] or a[0] != "V" or a[2] != "F": + return False + if not is_derived(a[1]): + return False + for x, y in zip(a[3:], b[3:]): + u, v = float(x), float(y) + if u == v: + continue + if u != u and v != v: # both NaN + continue + if abs(u - v) > TOLERANCE * max(abs(u), abs(v)): + return False + return True + + +def check(paths: list[Path]) -> int: + """Compare the stored dumps against freshly generated ones. + + Text, not bytes: the file is xz-compressed and two encoders can write the + same content differently, so a byte comparison would fail on a machine + whose liblzma is not the one that wrote the file. + """ + drifted = 0 + for path in paths: + target = golden_for(path) + if not target.exists(): + print(f"{target.relative_to(ROOT)}: missing", file=sys.stderr) + drifted += 1 + continue + + fresh = io.StringIO() + dump(path, fresh) + with lzma.open(target, "rt") as fh: + stored = fh.read() + + stored_lines = stored.splitlines() + fresh_lines = fresh.getvalue().splitlines() + if len(stored_lines) == len(fresh_lines) and all( + same_line(a, b) for a, b in zip(stored_lines, fresh_lines) + ): + continue + + drifted += 1 + print(f"{target.relative_to(ROOT)}: drifted", file=sys.stderr) + diff = difflib.unified_diff( + stored_lines, + fresh_lines, + fromfile="stored", + tofile="regenerated", + lineterm="", + n=1, + ) + # Enough context to identify the value, not the whole file. + for i, line in enumerate(diff): + if i >= 40: + print(" ...", file=sys.stderr) + break + print(f" {line[:400]}", file=sys.stderr) + return drifted + + +def main() -> None: + args = sys.argv[1:] + checking = "--check" in args + args = [a for a in args if a != "--check"] + + paths = [Path(a).resolve() for a in args] or fixtures() + if not paths: + sys.exit("no ENDF fixtures found; pass one explicitly") + + if checking: + drifted = check(paths) + if drifted: + sys.exit(f"{drifted} golden file(s) no longer match the reader") + print(f"{len(paths)} golden files match", file=sys.stderr) + return + + GOLDEN_DIR.mkdir(parents=True, exist_ok=True) + for path in paths: + target = golden_for(path) + # Built whole in memory and written only once it is complete. Writing + # straight to the file leaves a truncated golden behind when the dump + # raises part way, and a truncated golden is worse than none: the Rust + # harness compares the two maps whole, so it reports every path after + # the failure as missing and buries the actual error. + buffer = io.StringIO() + dump(path, buffer) + # The dumps are as repetitive as the evaluations they come from and + # compress about seven to one, so they are stored the same way. + with lzma.open(target, "wt", preset=9) as out: + out.write(buffer.getvalue()) + print( + f"{target.relative_to(ROOT)} <- {path.relative_to(ROOT)}", file=sys.stderr + ) + + +if __name__ == "__main__": + main() diff --git a/tools/endf_writer.py b/tools/endf_writer.py new file mode 100644 index 0000000..058d231 --- /dev/null +++ b/tools/endf_writer.py @@ -0,0 +1,174 @@ +# SPDX-License-Identifier: MIT +"""Write ENDF-6 records, for building synthetic fixtures. + +Some shapes the readers handle have no fixture that is small enough to keep in +the repository, and a few have no public evaluation at all. The ACE side solved +that with `make_urr_ace.py` and friends; this is the same idea for ENDF, shared +by the `make_*_endf.py` tools so each of those is only the data it is about. + +Nothing here validates: the point is to write exactly the bytes the format +specifies, including the fields evaluators overload, so both readers are held +to the same interpretation of them. +""" + +from __future__ import annotations + +from pathlib import Path + + +def endf_float(value: float) -> str: + """An 11-character ENDF float, e.g. ``' 9.223500+4'``. + + The format has no room for the ``e``, so the exponent is written bare. Six + decimal places fit a two-digit exponent; a three-digit one costs a place. + """ + if value == 0.0: + return " 0.000000+0" + digits, exponent = f"{value:.6E}".split("E") + power = int(exponent) + sign = "+" if power >= 0 else "-" + text = f"{digits}{sign}{abs(power)}" + if len(text) > 11: + digits = f"{value:.5E}".split("E")[0] + text = f"{digits}{sign}{abs(power)}" + return text.rjust(11) + + +class Section: + """Accumulates the records of one section, numbering them as it goes.""" + + def __init__(self, mat: int, mf: int, mt: int) -> None: + self.mat = mat + self.mf = mf + self.mt = mt + self.lines: list[str] = [] + + def record(self, body: str) -> None: + n = (len(self.lines) + 1) % 100000 + self.lines.append(f"{body:<66}{self.mat:>4}{self.mf:>2}{self.mt:>3}{n:>5}") + + def cont(self, c1: float, c2: float, l1: int, l2: int, n1: int, n2: int) -> None: + """A CONT record, which HEAD, LIST, TAB1 and TAB2 all open with.""" + self.record(f"{endf_float(c1)}{endf_float(c2)}{l1:>11}{l2:>11}{n1:>11}{n2:>11}") + + def floats(self, values: list[float]) -> None: + """Six floats to a line, as every list of values is written.""" + for i in range(0, len(values), 6): + self.record("".join(endf_float(v) for v in values[i : i + 6])) + + def pairs(self, values: list[int]) -> None: + """Six integers to a line, for the interpolation ranges of TAB1/TAB2.""" + for i in range(0, len(values), 6): + self.record("".join(f"{v:>11}" for v in values[i : i + 6])) + + def text(self, body: str) -> None: + self.record(f"{body:<66}") + + def list_record( + self, + c1: float, + c2: float, + l1: int, + l2: int, + n2: int, + values: list[float], + ) -> None: + """A LIST record: a CONT whose N1 is the value count, then the values.""" + self.cont(c1, c2, l1, l2, len(values), n2) + self.floats(values) + + def tab1( + self, + c1: float, + c2: float, + l1: int, + l2: int, + x: list[float], + y: list[float], + interpolation: int = 2, + ) -> None: + """A TAB1 record with a single interpolation range.""" + self.cont(c1, c2, l1, l2, 1, len(x)) + self.pairs([len(x), interpolation]) + interleaved: list[float] = [] + for xi, yi in zip(x, y): + interleaved += [xi, yi] + self.floats(interleaved) + + def tab2( + self, + c1: float, + c2: float, + l1: int, + l2: int, + n2: int, + interpolation: int = 2, + ) -> None: + """A TAB2 record: the interpolation across the outer variable.""" + self.cont(c1, c2, l1, l2, 1, n2) + self.pairs([n2, interpolation]) + + def finish(self) -> list[str]: + """The section's records plus its SEND terminator.""" + send = f"{'':<66}{self.mat:>4}{self.mf:>2}{0:>3}{99999:>5}" + return self.lines + [send] + + +def terminator(mat: int) -> str: + """A FEND, MEND or TEND record — which one is decided by `mat`.""" + return f"{'':<66}{mat:>4}{0:>2}{0:>3}{0:>5}" + + +def descriptive( + mat: int, + za: float, + awr: float, + nsub: int, + directory: list[tuple[int, int, int]], + zsymam: str, + lines: list[str], + *, + author: str = "endf-python tools", + lrp: int = -1, + lfi: int = 0, + emax: float = 2.0e7, + awi: float = 1.0, +) -> list[str]: + """MF=1 MT=451, the section every material must have. + + The first two text records are read by column rather than by whitespace, so + they are laid out here the way a real evaluation lays them out: ZSYMAM, + ALAB, EDATE and AUTH on the first, then REF, DDATE, RDATE and ENDATE. + """ + s = Section(mat, 1, 451) + s.cont(za, awr, lrp, lfi, 0, 0) + s.cont(0.0, 1.0 if lfi else 0.0, 0, 0, 0, 6) + s.cont(awi, emax, 0, 0, nsub, 8) + s.cont(0.0, 0.0, 0, 0, len(lines) + 2, len(directory)) + s.text(f"{zsymam:<11}{'SYNTH':<11}{'EVAL-JAN26':<10} {author:<33}") + s.text(f" {'synthetic, not real':<21}{'DIST-JAN26':<10} {'':<22}{'20260101':<8}") + for line in lines: + s.text(line) + for mf, mt, count in directory: + s.record(f"{'':>22}{mf:>11}{mt:>11}{count:>11}{0:>11}") + return s.finish() + + +def write_material(target: Path, mat: int, sections: list[list[str]]) -> None: + """Wrap sections in the TPID/FEND/MEND/TEND records and write the file. + + Sections must arrive grouped by MF and in ascending order, since one FEND + is written per file. + """ + out = [terminator(1)] # TPID + previous_mf = None + for section in sections: + mf = int(section[0][70:72]) + if previous_mf is not None and mf != previous_mf: + out.append(terminator(mat)) # FEND, closing the previous file + out += section + previous_mf = mf + out.append(terminator(mat)) # FEND, closing the last file + out.append(terminator(0)) # MEND + out.append(terminator(-1)) # TEND + target.write_text("\n".join(out) + "\n") diff --git a/tools/make_denormal_ace.py b/tools/make_denormal_ace.py new file mode 100644 index 0000000..0f3af3d --- /dev/null +++ b/tools/make_denormal_ace.py @@ -0,0 +1,74 @@ +# SPDX-License-Identifier: MIT +"""Write a tiny ACE table carrying the float form NJOY writes for a denormal. + +An exponent below about 1e-100 needs three digits, which overflows the field +NJOY has to write it in, so it drops the ``e``: ``6.10562372605-318`` rather +than ``6.10562372605e-318``. Both readers have to put it back. + +This surfaced converting TENDL-2025, where Db262, Db263, Db264, Sg272 and +Sg273 each failed on two malformed tokens out of 772,031 — see issue #20. No +ACE file small enough to keep as a fixture contains one, so the table is built +here, and the golden then holds both readers to the same values. + +The values around it are ordinary, so a reader that mangles the whole array +rather than the one token is caught too. + + python tools/make_denormal_ace.py tests/synthetic-denormal.ace +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +#: The XSS values, written verbatim rather than formatted, so the malformed +#: tokens survive into the file exactly as NJOY would write them. +XSS_TEXT = [ + " 1.00000000000E+00", + " 6.10562372605-318", + "-6.10562372605-318", + " 1.23456700000-120", + " 2.00000000000E+00", + " 9.99999999999-323", + " 0.00000000000E+00", + " 3.00000000000E+00", +] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit(__doc__) + target = Path(sys.argv[1]) + + n_xss = len(XSS_TEXT) + + nxs = [0] * 16 + nxs[0] = n_xss # NXS(1): length of XSS + nxs[1] = 1001 # NXS(2): ZA + + jxs = [0] * 32 + + def fixed(values, width: int, per_line: int, fmt) -> list[str]: + out = [] + for i in range(0, len(values), per_line): + out.append("".join(fmt(v).rjust(width) for v in values[i : i + per_line])) + return out + + lines = [ + f"{'1001.00c':>10}{'0.999167':>12}{'2.5300E-08':>12} 01/01/26", + f"{'synthetic denormal fixture, tools/make_denormal_ace.py':<70}mat0100", + ] + for _ in range(4): + lines.append("".join(f"{0:>7}{0.0:>11.6f}" for _ in range(4))) + lines += fixed(nxs, 9, 8, lambda v: str(int(v))) + lines += fixed(jxs, 9, 8, lambda v: str(int(v))) + # Four values to a line, as the format writes them. + for i in range(0, len(XSS_TEXT), 4): + lines.append("".join(v.rjust(20) for v in XSS_TEXT[i : i + 4])) + + target.write_text("\n".join(lines) + "\n") + print(f"{target}: {n_xss} XSS values, 4 of them denormal", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/tools/make_laws_ace.py b/tools/make_laws_ace.py new file mode 100644 index 0000000..e7274c6 --- /dev/null +++ b/tools/make_laws_ace.py @@ -0,0 +1,266 @@ +# SPDX-License-Identifier: MIT +"""Write a synthetic ACE table exercising every secondary distribution law. + +Li6 is a real table and covers what a light nuclide's evaluation happens to +use: laws 3, 33 and 44. The remaining laws — a discrete photon, a continuous +tabulation, the Maxwell, evaporation and Watt spectra, a correlated +angle-energy distribution and N-body phase space — need a table of their own, +and no real one small enough to keep as a fixture holds them all. JXS stores +absolute offsets into XSS, so a large table cannot be trimmed down to the +interesting part either. + +So the block is built here. The values are invented; the *layout* is the +format's, which is what the two readers are being held to. Each law is given +its own reaction so the DLW locators, the applicability records and the law +dispatch are all exercised, and the shapes within a law are varied +deliberately: the continuous tabulation carries one purely continuous +distribution, one purely discrete and one mixture, and the correlated law +carries both isotropic and tabulated cosines. + + python tools/make_laws_ace.py tests/synthetic-laws.ace +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +#: Every law this table carries, in the order the reactions are written. +LAWS = [2, 4, 7, 9, 11, 61, 66] + + +class Block: + """A run of XSS values addressed by one-based offsets from its start.""" + + def __init__(self): + self.values: list[float] = [] + + def add(self, values) -> int: + """Append `values`; return the one-based offset of the first.""" + start = len(self.values) + 1 + self.values.extend(float(v) for v in values) + return start + + def __len__(self) -> int: + return len(self.values) + + +def tab1(x, y) -> list[float]: + """A TAB1 as `Tabulated1D.from_ace` reads it, with a single region.""" + return [0.0, float(len(x)), *x, *y] + + +def outgoing(n_discrete: int, intt: int, eout, pdf, cdf, *extra) -> list[float]: + """One outgoing energy distribution, as `_ace_outgoing_energy` reads it. + + `extra` supplies the columns beyond the first three, one list per column: + two for Kalbach-Mann, one for the correlated law. + """ + header = 10 * n_discrete + intt + rows = [eout, pdf, cdf, *extra] + values = [float(header), float(len(eout))] + for row in rows: + values.extend(float(v) for v in row) + return values + + +def law_2(dlw: Block) -> int: + """A discrete photon: a primary flag and an energy in MeV.""" + return dlw.add([1.0, 2.5]) + + +def law_4(dlw: Block) -> int: + """A continuous tabulation at three incident energies. + + The three differ on purpose: the first is a plain continuum, the second is + nothing but discrete lines, and the third mixes the two — the three + branches `_ace_outgoing_energy` can take. + """ + continuum = dlw.add( + outgoing( + 0, + 2, + [0.1, 0.5, 1.0], + [0.4, 0.8, 0.2], + [0.0, 0.55, 1.0], + ) + ) + discrete = dlw.add( + outgoing( + 2, + 2, + [0.25, 0.75], + [0.3, 0.7], + [0.3, 1.0], + ) + ) + mixture = dlw.add( + outgoing( + 1, + 1, + [0.2, 0.6, 1.2], + [0.25, 0.5, 0.25], + [0.25, 0.6, 1.0], + ) + ) + # A single lin-lin region over the whole incident grid. + return dlw.add([0.0, 3.0, 1.0e-6, 1.0, 20.0, continuum, discrete, mixture]) + + +def law_7(dlw: Block) -> int: + """A Maxwell fission spectrum: theta against energy, then U.""" + return dlw.add([*tab1([1.0e-6, 20.0], [0.5, 1.4]), 0.3]) + + +def law_9(dlw: Block) -> int: + """An evaporation spectrum, laid out exactly as law 7.""" + return dlw.add([*tab1([1.0e-6, 10.0, 20.0], [0.4, 0.9, 1.1]), 0.25]) + + +def law_11(dlw: Block) -> int: + """A Watt spectrum: the a and b parameters, then U.""" + return dlw.add( + [ + *tab1([1.0e-6, 20.0], [0.9, 1.1]), + *tab1([1.0e-6, 20.0], [3.0, 3.4]), + 0.4, + ] + ) + + +def law_61(dlw: Block) -> int: + """A correlated angle-energy distribution at two incident energies. + + The cosine locators cover both cases: zero for isotropic, and an offset to + a tabulated cosine distribution. + """ + cosine = dlw.add( + [ + 2.0, # lin-lin + 3.0, # three cosines + -1.0, + 0.0, + 1.0, + 0.25, + 0.5, + 0.25, + 0.0, + 0.5, + 1.0, + ] + ) + first = dlw.add( + outgoing( + 0, + 2, + [0.1, 0.9], + [0.6, 0.4], + [0.0, 1.0], + [0.0, cosine], + ) + ) + second = dlw.add( + outgoing( + 0, + 1, + [0.2, 0.8, 1.6], + [0.5, 0.3, 0.2], + [0.0, 0.5, 1.0], + [cosine, 0.0, cosine], + ) + ) + # Two regions, so the branch that reads breakpoints is taken here. + return dlw.add([2.0, 1.0, 2.0, 1.0, 2.0, 2.0, 1.0e-6, 20.0, first, second]) + + +def law_66(dlw: Block) -> int: + """N-body phase space: the particle count and their total mass.""" + return dlw.add([4.0, 3.98]) + + +LAW_DATA = { + 2: law_2, + 4: law_4, + 7: law_7, + 9: law_9, + 11: law_11, + 61: law_61, + 66: law_66, +} + + +def build_dlw() -> tuple[list[float], list[int]]: + """The DLW block, and the LDLW locators that point into it. + + Each reaction gets an entry of three control words and an applicability + record; the law's own data is appended afterwards and the entry's third + word patched to point at it. + """ + dlw = Block() + locators = [] + entries = [] + for _ in LAWS: + # LNW, LAW and IDAT are filled in below; the applicability follows. + start = dlw.add([0.0, 0.0, 0.0, *tab1([1.0e-6, 20.0], [1.0, 1.0])]) + locators.append(start) + entries.append(start) + + for law, start in zip(LAWS, entries): + idat = LAW_DATA[law](dlw) + dlw.values[start] = float(law) # word 2 of the entry + dlw.values[start + 1] = float(idat) # word 3 + + return dlw.values, locators + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit(__doc__) + target = Path(sys.argv[1]) + + dlw_values, locators = build_dlw() + + # XSS is one-based, so index 0 is padding. LDLW comes first, then DLW. + xss = [0.0] + ldlw_start = len(xss) + xss.extend(float(v) for v in locators) + dlw_start = len(xss) + xss.extend(dlw_values) + n_xss = len(xss) - 1 + + nxs = [0] * 16 + nxs[0] = n_xss # NXS(1): length of XSS + nxs[1] = 1001 # NXS(2): ZA + nxs[3] = len(LAWS) # NXS(4): reactions besides elastic + nxs[4] = len(LAWS) # NXS(5): those with secondary neutrons + + jxs = [0] * 32 + jxs[9] = ldlw_start # JXS(10): LDLW + jxs[10] = dlw_start # JXS(11): DLW + + def fixed(values, width: int, per_line: int, fmt) -> list[str]: + out = [] + for i in range(0, len(values), per_line): + out.append("".join(fmt(v).rjust(width) for v in values[i : i + per_line])) + return out + + lines = [ + f"{'1001.00c':>10}{'0.999167':>12}{'2.5300E-08':>12} 01/01/26", + f"{'synthetic law fixture, generated by tools/make_laws_ace.py':<70}mat0100", + ] + for _ in range(4): + lines.append("".join(f"{0:>7}{0.0:>11.6f}" for _ in range(4))) + lines += fixed(nxs, 9, 8, lambda v: str(int(v))) + lines += fixed(jxs, 9, 8, lambda v: str(int(v))) + # XSS omits the padding element; the reader puts it back. + lines += fixed(xss[1:], 20, 4, lambda v: f"{v:.11E}") + + target.write_text("\n".join(lines) + "\n") + print( + f"{target}: {n_xss} XSS values, {len(LAWS)} laws, DLW at {dlw_start}", + file=sys.stderr, + ) + + +if __name__ == "__main__": + main() diff --git a/tools/make_nfy_endf.py b/tools/make_nfy_endf.py new file mode 100644 index 0000000..bcfc330 --- /dev/null +++ b/tools/make_nfy_endf.py @@ -0,0 +1,122 @@ +# SPDX-License-Identifier: MIT +"""Write a small synthetic ENDF evaluation carrying fission product yields. + +MF=8 MT=454 and MT=459 are the only files with no fixture: a real neutron- +induced fission yield evaluation lists a thousand or so products at each of +several incident energies, which is megabytes, and it cannot be trimmed the way +the other ENDF fixtures were because the yields *are* the file — cutting +products would only test a shorter list of the same thing. + +So a small one is built here instead. The values are invented, but the layout +is the format's, and that is what both readers are held to: a HEAD giving LE+1, +then one LIST per incident energy whose L1 field is overloaded — LE+1 on the +first, the interpolation scheme on the rest — and four values per product. + +The independent (MT=454) and cumulative (MT=459) yields differ, so a reader +that returns one for the other is caught. The products include an isomer +(FPS=1) so the naming path is exercised, and the second energy has a different +product count from the first so a reader that reuses NFP is caught too. + + python tools/make_nfy_endf.py tests/synthetic-nfy.endf +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from endf_writer import Section, descriptive, write_material # noqa: E402 + +#: MAT number of the synthetic evaluation. 9999 is unassigned. +MAT = 9999 + +#: Z*1000 + A of the fissioning nuclide, and its mass in neutron masses. +ZA = 92235 +AWR = 233.0248 + +#: Incident energies in eV, thermal and fast. +ENERGIES = [0.0253, 500000.0] + +#: Interpolation scheme for the energies after the first. 2 is linear-linear. +INTERPOLATION = 2 + +#: (ZAFP, FPS, yield, uncertainty) per energy, for MT=454 and MT=459. The +#: cumulative yields are larger than the independent ones, as they are in a +#: real evaluation, and the second energy carries one more product. +INDEPENDENT = [ + [ + (40095.0, 0.0, 0.0201, 0.0008), # Zr95 + (54135.0, 1.0, 0.0134, 0.0006), # Xe135_m1 + (55137.0, 0.0, 0.0619, 0.0021), # Cs137 + ], + [ + (40095.0, 0.0, 0.0188, 0.0009), + (54135.0, 1.0, 0.0142, 0.0007), + (55137.0, 0.0, 0.0575, 0.0024), + (58144.0, 0.0, 0.0043, 0.0002), # Ce144, fast only + ], +] + +CUMULATIVE = [ + [ + (40095.0, 0.0, 0.0605, 0.0018), + (54135.0, 1.0, 0.0139, 0.0006), + (55137.0, 0.0, 0.0632, 0.0022), + ], + [ + (40095.0, 0.0, 0.0588, 0.0020), + (54135.0, 1.0, 0.0147, 0.0008), + (55137.0, 0.0, 0.0601, 0.0025), + (58144.0, 0.0, 0.0049, 0.0003), + ], +] + + +def yields_section(mt: int, sets: list[list[tuple[float, float, float, float]]]): + """MF=8 MT=454 or MT=459: the yields at each incident energy.""" + s = Section(MAT, 8, mt) + le_plus_one = len(sets) + s.cont(ZA, AWR, le_plus_one, 0, 0, 0) + for i, (energy, products) in enumerate(zip(ENERGIES, sets)): + # L1 is LE+1 on the first energy and the interpolation scheme after, + # which is the overload both readers have to reproduce. + l1 = le_plus_one if i == 0 else INTERPOLATION + flat = [v for product in products for v in product] + s.list_record(energy, 0.0, l1, 0, len(products), flat) + return s.finish() + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit(__doc__) + target = Path(sys.argv[1]) + + sections = [ + descriptive( + MAT, + ZA, + AWR, + # NSUB=11, neutron-induced fission product yields. + 11, + [(1, 451, 9), (8, 454, 5), (8, 459, 5)], + " 92-U -235", + [ + "----SYNTHETIC MATERIAL 9999", + "-----NEUTRON-INDUCED FISSION PRODUCT YIELDS", + "------ENDF-6 FORMAT", + ], + author="tools/make_nfy_endf.py", + lfi=1, + ), + yields_section(454, INDEPENDENT), + yields_section(459, CUMULATIVE), + ] + write_material(target, MAT, sections) + + products = sum(len(s) for s in INDEPENDENT) + sum(len(s) for s in CUMULATIVE) + print(f"{target}: {len(ENERGIES)} energies, {products} yields", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/tools/make_photon_aux.py b/tools/make_photon_aux.py new file mode 100644 index 0000000..a1f45ba --- /dev/null +++ b/tools/make_photon_aux.py @@ -0,0 +1,219 @@ +# SPDX-License-Identifier: MIT +"""Build the auxiliary photon data tabulations both readers use. + +Two sections, from two sources: + +**COMPTON** — Hartree-Fock Compton profiles, taken from the **Geant4 G4EMLOW** +data set, which is the primary distribution of Biggs, Mendelsohn and Mann, +*Atomic Data and Nuclear Data Tables* **16** (1975) 201. The archive is +downloaded and verified against a pinned SHA-256, so the provenance is +first-hand and the build is reproducible rather than a copy of somebody else's +copy. Three files inside it are read: + +* `doppler/p-biggs.dat` — the 31 electron momenta, in atomic units +* `doppler/profile-.dat` — J(pz), one row per subshell +* `doppler/shell-doppler.dat` — occupancy and ionisation potential per + subshell, per Z, each block ended by a `-1` line + +**DENSITY** — mean excitation energies from the NIST ESTAR database and +subshell ionization energies for the density effect correction, after +Sternheimer, Berger and Seltzer, *ADNDT* **30** (1984) 261. No primary +distribution of this in a machine-readable form is known to this project, so it +still comes from `density_effect.h5`, which was copied from OpenMC (MIT). If a +primary source turns up, only `density_section` below has to change. + +The output is plain text and uncompressed: the Rust crate reads it at runtime +and has no dependencies, so xz would mean adding a decompressor. Floats are +written with `repr`, the shortest string that round-trips, so nothing is lost. + + python tools/make_photon_aux.py # downloads G4EMLOW + python tools/make_photon_aux.py --g4emlow DIR # uses an extracted copy + +Writes one file per tabulation into `src/endf/datafiles`: + + compton_profiles_biggs1975.txt fetched from G4EMLOW, verified + density_effect_sternheimer1982.txt vendored from density_effect.h5 + +`BREMX.DAT` keeps its name because `endf.incident_photon` reads it by that name, +and this branch does not change the Python reader. +""" + +from __future__ import annotations + +import argparse +import hashlib +import sys +import tarfile +import urllib.request +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +DATAFILES = ROOT / "src" / "endf" / "datafiles" + +#: The data covers Z = 1 to 100. +MAX_Z = 100 + +#: eV per MeV, matching `endf.data.EV_PER_MEV`. +EV_PER_MEV = 1.0e6 + +#: Compton profiles come from this release. 6.48 is pinned rather than the +#: newest because the whole `doppler` directory is byte-identical in every +#: release from 6.48 to 8.7 — the data has not changed — and 6.48 is 24 MB +#: against 333 MB. Checked file by file, not assumed. +G4EMLOW_VERSION = "6.48" +G4EMLOW_URL = ( + f"https://geant4-data.web.cern.ch/datasets/G4EMLOW.{G4EMLOW_VERSION}.tar.gz" +) +G4EMLOW_SHA256 = "9815be88cbbcc4e8855b20244d586552a8b1819b8bf4e538c342b27c17dff1c7" + + +def floats(values) -> str: + return " ".join(repr(float(v)) for v in values) + + +def download_g4emlow(cache: Path) -> Path: + """Fetch and unpack the `doppler` directory, verifying the archive.""" + archive = cache / f"G4EMLOW.{G4EMLOW_VERSION}.tar.gz" + if not archive.is_file(): + cache.mkdir(parents=True, exist_ok=True) + print(f"downloading {G4EMLOW_URL} ...", file=sys.stderr) + with urllib.request.urlopen(G4EMLOW_URL) as response: + archive.write_bytes(response.read()) + + digest = hashlib.sha256(archive.read_bytes()).hexdigest() + if digest != G4EMLOW_SHA256: + raise SystemExit( + f"{archive} does not match the pinned checksum.\n" + f" expected {G4EMLOW_SHA256}\n got {digest}\n" + "Refusing to build data files from an archive that is not the one " + "this script was written against." + ) + + extracted = cache / f"G4EMLOW{G4EMLOW_VERSION}" + if not extracted.is_dir(): + with tarfile.open(archive) as tar: + members = [m for m in tar.getmembers() if "/doppler/" in m.name] + tar.extractall(cache, members=members) + return extracted + + +def compton_section(doppler: Path) -> list[str]: + """The Compton profiles, straight out of the Geant4 data files.""" + pz = [float(v) for v in (doppler / "p-biggs.dat").read_text().split()] + out = ["COMPTON", f"pz {len(pz)} {floats(pz)}"] + + # One stream for every element in turn, each block ended by a -1 line. + shells = (doppler / "shell-doppler.dat").read_text().splitlines() + line = iter(shells) + + for z in range(1, MAX_Z + 1): + j = [float(v) for v in (doppler / f"profile-{z}.dat").read_text().split()] + nss, remainder = divmod(len(j), len(pz)) + if remainder: + raise SystemExit(f"Z={z}: profile is not a whole number of subshells") + + num_electrons, binding = [], [] + for text in line: + fields = text.split() + if not fields or fields[0].startswith("-1"): + break + num_electrons.append(float(fields[0])) + # Ionisation potentials are in MeV; both readers want eV, and + # converting once here removes a chance for them to disagree. + binding.append(float(fields[1]) * EV_PER_MEV) + + if len(num_electrons) != nss: + raise SystemExit( + f"Z={z}: {nss} subshells in the profile but " + f"{len(num_electrons)} in shell-doppler.dat" + ) + out.append(f"Z {z} {nss} {floats(num_electrons)} {floats(binding)} {floats(j)}") + return out + + +def density_section() -> list[str]: + """The density effect data, still from the vendored HDF5.""" + import h5py + + out = ["DENSITY"] + with h5py.File(DATAFILES / "density_effect.h5", "r") as f: + for z in range(1, MAX_Z + 1): + group = f[f"{z:03}"] + num_electrons = group["num_electrons"][()] + ionization = group["ionization_energy"][()] + nss = len(num_electrons) + if len(ionization) != nss: + raise SystemExit(f"Z={z}: ragged density effect data") + out.append( + f"Z {z} {nss} {float(group.attrs['I'])!r} " + f"{floats(num_electrons)} {floats(ionization)}" + ) + return out + + +def write(target: Path, lines: list[str]) -> None: + target.write_text("\n".join(lines) + "\n") + print( + f"{target.relative_to(ROOT)}: {target.stat().st_size / 1e3:.0f} kB", + file=sys.stderr, + ) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--g4emlow", + type=Path, + help="an already-extracted G4EMLOW directory, instead of downloading", + ) + parser.add_argument( + "--cache", + type=Path, + default=Path.home() / ".cache" / "endf-photon-data", + help="where to keep the downloaded archive", + ) + args = parser.parse_args() + + root = args.g4emlow or download_g4emlow(args.cache) + doppler = root / "doppler" if (root / "doppler").is_dir() else root + if not (doppler / "p-biggs.dat").is_file(): + raise SystemExit(f"no p-biggs.dat under {doppler}") + + # One file per tabulation, not one per format. The Compton profiles and the + # density effect are unrelated measurements that only ever shared a file + # because they shared an HDF5 container, and only one of the two has a + # primary source to fetch. Naming each after what it holds and where it came + # from means a reader can tell them apart without opening them. + write( + DATAFILES / "compton_profiles_biggs1975.txt", + [ + "# Compton profiles J(pz) per subshell, with subshell occupancies and", + "# binding energies in eV. Z = 1 to 100 on a 31-point momentum grid.", + "#", + "# Biggs, Mendelsohn and Mann, At. Data Nucl. Data Tables 16 (1975) 201,", + f"# as distributed in the Geant4 G4EMLOW {G4EMLOW_VERSION} data set,", + "# under doppler/.", + "#", + "# Generated by tools/make_photon_aux.py.", + ] + + compton_section(doppler), + ) + write( + DATAFILES / "density_effect_sternheimer1982.txt", + [ + "# Mean excitation energy I, subshell occupancies and subshell", + "# ionisation energies in eV. Z = 1 to 100.", + "#", + "# NIST ESTAR mean excitation energies, and Sternheimer, Berger and", + "# Seltzer, At. Data Nucl. Data Tables 30 (1984) 261. Vendored from", + "# density_effect.h5: ESTAR publishes through a web form, so there", + "# is no archive to fetch and verify.", + "#", + "# Generated by tools/make_photon_aux.py.", + ] + + density_section(), + ) + + +if __name__ == "__main__": + main() diff --git a/tools/make_shapes_endf.py b/tools/make_shapes_endf.py new file mode 100644 index 0000000..7920bc6 --- /dev/null +++ b/tools/make_shapes_endf.py @@ -0,0 +1,226 @@ +# SPDX-License-Identifier: MIT +"""Write a synthetic evaluation carrying the shapes no fixture reaches. + +Four parsers were structurally complete and entirely unverified, because no +evaluation small enough to keep in the repository writes them: + +* **MF=2 LRF=2**, multi-level Breit-Wigner resonance parameters. Fe56 and U235 + give Reich-Moore; the Breit-Wigner branch had never been read. +* **MF=5 LF=12**, the Madland-Nix fission spectrum. LF=1, 5, 7 and 9 are + covered by Li6, Am244 and U235. +* **MF=6 LANG=2 and LAW=6**, Kalbach-Mann angular parameters and the n-body + phase space. Li6 gives LAW=2 and LAW=4, Fe56 gives LAW=1 with LANG=1. +* **MF=13**, photon production written as a cross section rather than as a + multiplicity on MF=12. + +The numbers are invented; the layout is the format's, and that is what both +readers are held to. What each shape is built to catch: + +* The Breit-Wigner section has two L values with different resonance counts, so + a reader that reuses NRS is caught, and QX and LRX are non-zero in one of + them, since those two fields are easy to drop. +* LF=12 carries EFL and EFH in the C1/C2 fields of the TAB1 that introduces the + subsection, not in the record that follows, which is the trap in that law. +* LAW=1 with LANG=2 has NA=1, so the row stride is 3 rather than the 2 a + Legendre representation of the same law would give. +* LAW=6 is a bare CONT record whose N2 is NPSX — nothing else in MF=6 is + laid out that way. +* MF=13 has NK=2, so the total production cross section record is present; with + NK=1 it is omitted, and that branch is the one a reader gets wrong. + + python tools/make_shapes_endf.py tests/synthetic-shapes.endf +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from endf_writer import Section, descriptive, write_material # noqa: E402 + +#: MAT number of the synthetic evaluation. 9998 is unassigned. +MAT = 9998 + +#: A light-ish fictional target, so the reaction Q values are plausible. +ZA = 26056 +AWR = 55.45414 + +#: The incident energy grid the cross sections are given on, in eV. +GRID = [1.0e-5, 1.0e3, 1.0e6, 2.0e7] + + +def mf1_nu(mt: int, values: list[float]) -> list[str]: + """MF=1 MT=452 or MT=456: neutrons per fission, tabulated (LNU=2). + + A fission spectrum on MF=5 is only reachable through a fission reaction, + and the reader builds that reaction's product from the yield here. + """ + s = Section(MAT, 1, mt) + s.cont(ZA, AWR, 0, 2, 0, 0) + s.tab1(0.0, 0.0, 0, 0, [1.0e-5, 2.0e7], values) + return s.finish() + + +def mf2_breit_wigner() -> list[str]: + """MF=2 MT=151 with LRU=1, LRF=2: multi-level Breit-Wigner.""" + s = Section(MAT, 2, 151) + s.cont(ZA, AWR, 0, 0, 1, 0) # NIS=1 + s.cont(ZA, 1.0, 0, 0, 1, 0) # ZAI, ABN, LFW=0, NER=1 + # EL, EH, LRU=1 resolved, LRF=2 multi-level BW, NRO=0, NAPS=0. + s.cont(1.0e-5, 1.0e5, 1, 2, 0, 0) + # SPI, AP, 0, 0, NLS=2, 0. + s.cont(0.0, 0.54, 0, 0, 2, 0) + + # l = 0: three resonances, no competitive width. One row per resonance, + # as the record lays them out. + # fmt: off + resonances_s = [ + # ER, AJ, GT, GN, GG, GF + 1.1e3, 0.5, 1.34, 1.30, 0.04, 0.0, + 2.7e3, 0.5, 0.91, 0.87, 0.04, 0.0, + 7.6e3, 0.5, 2.15, 2.11, 0.04, 0.0, + ] + # fmt: on + s.list_record(AWR, 0.0, 0, 0, len(resonances_s) // 6, resonances_s) + + # l = 1: two resonances, and a competitive reaction — QX and LRX are the + # two fields a reader is most likely to drop. + # fmt: off + resonances_p = [ + 3.4e4, 1.5, 5.02, 4.90, 0.12, 0.0, + 5.9e4, 0.5, 3.41, 3.30, 0.11, 0.0, + ] + # fmt: on + s.list_record(AWR, 8.62e5, 1, 51, len(resonances_p) // 6, resonances_p) + return s.finish() + + +def mf3(mt: int, qm: float, qi: float, values: list[float]) -> list[str]: + """An MF=3 cross section, so the reactions the other files describe exist. + + A HEAD record and then the TAB1: the Q values are on the TAB1, not the + HEAD, which is where MF=3 differs from the files that open with one record. + """ + s = Section(MAT, 3, mt) + s.cont(ZA, AWR, 0, 0, 0, 0) + s.tab1(qm, qi, 0, 0, GRID, values) + return s.finish() + + +def mf5_madland_nix() -> list[str]: + """MF=5 MT=18 with LF=12: the Madland-Nix fission spectrum.""" + s = Section(MAT, 5, 18) + s.cont(ZA, AWR, 0, 0, 1, 0) # NK=1 + # EFL and EFH ride in C1 and C2 of the record that introduces the + # subsection, which is what makes this law awkward; L2 is LF. + s.tab1(1.029e6, 5.467e5, 0, 12, [1.0e-5, 2.0e7], [1.0, 1.0]) + # T_M against incident energy. + s.tab1(0.0, 0.0, 0, 0, [1.0e-5, 1.0e6, 2.0e7], [1.092e6, 1.108e6, 1.301e6]) + return s.finish() + + +def mf6_kalbach_and_phase_space() -> list[str]: + """MF=6 MT=16 with two products: LAW=1 LANG=2, then LAW=6.""" + s = Section(MAT, 6, 16) + # ZA, AWR, JP=0, LCT=2 centre of mass, NK=2. + s.cont(ZA, AWR, 0, 2, 2, 0) + + # Product 1: a neutron, LAW=1 with Kalbach-Mann angular parameters. + s.tab1(1.0, 1.0, 0, 1, [1.2e7, 2.0e7], [2.0, 2.0]) # ZAP=1, LAW=1 + # LANG=2 Kalbach-Mann, LEP=2 lin-lin in secondary energy, NE=2. + s.tab2(0.0, 0.0, 2, 2, 2) + # At each incident energy: ND=0 discrete lines, NA=1 angular parameter, so + # each outgoing energy carries E', f and a — a stride of three. + # fmt: off + s.list_record(0.0, 1.2e7, 0, 1, 3, [ + # E', f, a + 0.0, 0.0, 0.0, + 5.0e5, 1.4e-6, 0.21, + 1.0e6, 0.0, 0.33, + ]) + s.list_record(0.0, 2.0e7, 0, 1, 3, [ + 0.0, 0.0, 0.0, + 2.0e6, 3.9e-7, 0.48, + 8.0e6, 0.0, 0.94, + ]) + # fmt: on + + # Product 2: the recoil, LAW=6, whose whole body is one CONT record. + s.tab1(float(ZA - 1000), AWR - 1.0, 0, 6, [1.2e7, 2.0e7], [1.0, 1.0]) + # APSX, 0, 0, 0, 0, NPSX — the total mass and the number of particles. + s.cont(AWR + 1.0, 0.0, 0, 0, 0, 3) + return s.finish() + + +def mf13_photon_production() -> list[str]: + """MF=13 MT=102: photon production as a cross section. + + NK=2, so the total production record is written before the two photons. + """ + s = Section(MAT, 13, 102) + s.cont(ZA, AWR, 0, 0, 2, 0) + # The total, present only because NK > 1. + s.tab1(0.0, 0.0, 0, 0, GRID, [4.4e-1, 1.4e-2, 3.1e-4, 8.0e-6]) + # A discrete line: EG is its energy, LP=0, LF=2 discrete. + s.tab1(8.462e5, 0.0, 0, 2, GRID, [3.1e-1, 9.8e-3, 2.2e-4, 5.6e-6]) + # A continuum: EG=0, LF=1 tabulated, with the spectrum on MF=15. + s.tab1(0.0, 0.0, 0, 1, GRID, [1.3e-1, 4.2e-3, 9.0e-5, 2.4e-6]) + return s.finish() + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit(__doc__) + target = Path(sys.argv[1]) + + sections = [ + descriptive( + MAT, + ZA, + AWR, + 10, # NSUB=10, incident neutron + [ + (1, 451, 9), + (1, 452, 4), + (1, 456, 4), + (2, 151, 8), + (3, 1, 4), + (3, 16, 4), + (3, 18, 4), + (3, 102, 4), + (5, 18, 6), + (6, 16, 12), + (13, 102, 10), + ], + " 26-Fe- 56", + [ + "----SYNTHETIC MATERIAL 9998", + "-----THE SHAPES NO REAL FIXTURE REACHES", + "------ENDF-6 FORMAT", + ], + author="tools/make_shapes_endf.py", + # LRP=1, resonance parameters are given; LFI=1, the material fissions. + lrp=1, + lfi=1, + ), + mf1_nu(452, [2.51, 2.98]), + mf1_nu(456, [2.44, 2.79]), + mf2_breit_wigner(), + mf3(1, 0.0, 0.0, [2.1e1, 1.4e1, 3.9e0, 2.5e0]), + mf3(16, 0.0, -1.16e7, [0.0, 0.0, 0.0, 4.6e-1]), + mf3(18, 1.86e8, 1.86e8, [1.2e-3, 4.0e-5, 9.0e-7, 1.1e0]), + mf3(102, 7.646e6, 7.646e6, [2.6e0, 8.3e-2, 1.9e-3, 4.8e-5]), + mf5_madland_nix(), + mf6_kalbach_and_phase_space(), + mf13_photon_production(), + ] + write_material(target, MAT, sections) + print( + f"{target}: MF2 LRF=2, MF5 LF=12, MF6 LANG=2 and LAW=6, MF13", + file=sys.stderr, + ) + + +if __name__ == "__main__": + main() diff --git a/tools/make_urr_ace.py b/tools/make_urr_ace.py new file mode 100644 index 0000000..b30bbc0 --- /dev/null +++ b/tools/make_urr_ace.py @@ -0,0 +1,94 @@ +# SPDX-License-Identifier: MIT +"""Write a small synthetic ACE table carrying an unresolved resonance block. + +No ACE file small enough to keep as a fixture has a URR block — the nuclides +that have one are heavy, and their tables run to tens of megabytes, which +cannot be trimmed because JXS holds absolute offsets into XSS. So the block is +built here instead, at a size that fits in a fixture. + +The values are invented, but the *layout* is the format's, which is what the +reader is being tested against: JXS(23) points at the block, the block opens +with its dimensions and flags, then the energies in MeV, then N*6*M values with +the heating numbers in row 5 that the reader has to convert. + + python tools/make_urr_ace.py tests/synthetic-urr.ace +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +#: Dimensions of the synthetic block: energies and equiprobable bands. +N_ENERGY = 4 +N_BAND = 3 + +#: Where the URR block starts within XSS (one-based, as JXS is). +URR_START = 21 + + +def urr_block() -> list[float]: + """The block itself, laid out as the format specifies.""" + values: list[float] = [ + float(N_ENERGY), + float(N_BAND), + 2.0, # interpolation: lin-lin + -1.0, # inelastic flag: zero across the range + -1.0, # absorption flag: likewise + 1.0, # multiply by the smooth background + ] + # Energies in MeV, which the reader converts to eV. + values += [1.0e-3 * (i + 1) for i in range(N_ENERGY)] + + # N blocks of 6 rows of M bands. Row 5 is the heating number, the one row + # the reader scales; every value is distinct so a misplaced index shows. + for e in range(N_ENERGY): + for q in range(6): + for b in range(N_BAND): + values.append(round(1.0 + e + 0.1 * q + 0.01 * b, 6)) + return values + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit(__doc__) + target = Path(sys.argv[1]) + + block = urr_block() + # XSS runs from index 1; pad up to where the block starts. + xss = [0.0] * (URR_START - 1) + block + n_xss = len(xss) + + nxs = [0] * 16 + nxs[0] = n_xss # NXS(1): length of XSS + nxs[1] = 92000 # NXS(2): ZA + nxs[2] = N_ENERGY # NXS(3): number of energies, unused here + + jxs = [0] * 32 + jxs[22] = URR_START # JXS(23): start of the URR block + + def fixed(values, width: int, per_line: int, fmt) -> list[str]: + out = [] + for i in range(0, len(values), per_line): + out.append("".join(fmt(v).rjust(width) for v in values[i : i + per_line])) + return out + + lines = [ + f"{'92000.00c':>10}{'236.005800':>12}{'2.5300E-08':>12} 01/01/26", + f"{'synthetic URR fixture, generated by tools/make_urr_ace.py':<70}mat9200", + ] + # Four lines of four (IZ, AW) pairs, all empty for a synthetic table. + for _ in range(4): + lines.append("".join(f"{0:>7}{0.0:>11.6f}" for _ in range(4))) + # NXS and JXS, eight to a line. + lines += fixed(nxs, 9, 8, lambda v: str(int(v))) + lines += fixed(jxs, 9, 8, lambda v: str(int(v))) + # XSS, four to a line. + lines += fixed(xss, 20, 4, lambda v: f"{v:.11E}") + + target.write_text("\n".join(lines) + "\n") + print(f"{target}: {n_xss} XSS values, URR block at {URR_START}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/tools/make_urr_endf.py b/tools/make_urr_endf.py new file mode 100644 index 0000000..fb49f74 --- /dev/null +++ b/tools/make_urr_endf.py @@ -0,0 +1,140 @@ +# SPDX-License-Identifier: MIT +"""Write a synthetic evaluation with unresolved resonance Cases A and B. + +These are the two shapes issue #15 made unreachable. Both readers dispatched on +LRF where the format uses LRU, so a range with LRU=2 and LRF=1 matched neither +branch: its records were left on the stream, and the *next* range was then read +from the middle of it. Case C (LRU=2, LRF=2) worked only because the two flags +happen to coincide there. + +No real evaluation small enough to keep here has Case A or Case B, so the +fixture is built: + +* **Isotope 1, LFW=0** — a Case A range (all parameters energy-independent), + followed by a resolved Breit-Wigner range. The second range is the point: if + the first is skipped without consuming its records, the second is parsed from + the wrong offset and comes back with LRU=0 and its EL/EH holding the first + range's SPI and AP. +* **Isotope 2, LFW=1** — a Case B range, where only the fission widths are + energy-dependent, so the parameters arrive one LIST per J value with the + energy grid in a separate record. + +Two L values in Case A with different J counts, so a reader that reuses NJS is +caught as well. + + python tools/make_urr_endf.py tests/synthetic-urr-cases.endf +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from endf_writer import Section, descriptive, write_material # noqa: E402 + +#: MAT number of the synthetic evaluation. 9997 is unassigned. +MAT = 9997 + +ZA = 94239.0 +AWR = 236.9986 + +#: The energies the Case B fission widths are tabulated on, in eV. +CASE_B_ENERGIES = [1.0e3, 1.0e4, 3.0e4] + + +def mf2() -> list[str]: + s = Section(MAT, 2, 151) + s.cont(ZA, AWR, 0, 0, 2, 0) # NIS=2 + + # ---- Isotope 1: LFW=0, so Case A, then a resolved range after it ------- + s.cont(ZA, 0.7, 0, 0, 2, 0) # ZAI, ABN, LFW=0, NER=2 + + # Range 1: LRU=2 unresolved, LRF=1 -> Case A. + s.cont(1.0e3, 3.0e4, 2, 1, 0, 0) + s.cont(0.5, 0.94, 0, 0, 2, 0) # SPI, AP, LSSF=0, NLS=2 + # Six values per J -- D, AJ, AMUN, GNO, GG and a spare the format reserves. + # l=0, two J values. + # fmt: off + s.list_record(AWR, 0.0, 0, 0, 2, [ + 8.9, 0.5, 1.0, 0.001, 0.040, 0.0, + 4.4, 1.5, 1.0, 0.002, 0.040, 0.0, + ]) + # l=1, three J values, so a reader that reuses NJS from l=0 is caught. + s.list_record(AWR, 0.0, 1, 0, 3, [ + 3.1, 0.5, 1.0, 0.003, 0.041, 0.0, + 2.7, 1.5, 2.0, 0.004, 0.041, 0.0, + 1.9, 2.5, 1.0, 0.005, 0.041, 0.0, + ]) + # fmt: on + + # Range 2: resolved multi-level Breit-Wigner. Reading this correctly is + # only possible if the range above consumed exactly its own records. + s.cont(3.0e4, 1.0e5, 1, 2, 0, 0) + s.cont(0.5, 0.94, 0, 0, 1, 0) + # fmt: off + s.list_record(AWR, 0.0, 0, 0, 1, [ + 5.5e4, 0.5, 1.10, 1.00, 0.10, 0.0, + ]) + # fmt: on + + # ---- Isotope 2: LFW=1, so Case B --------------------------------------- + s.cont(ZA + 1.0, 0.3, 0, 1, 1, 0) # ZAI, ABN, LFW=1, NER=1 + s.cont(1.0e3, 3.0e4, 2, 1, 0, 0) # LRU=2, LRF=1 + + # With LFW=1 and LRF=1 the spin and radius arrive on a LIST whose values + # are the energy grid, rather than on the CONT that the other cases use. + # SPI, AP, LSSF=0, 0, NE, NLS=1 + s.list_record(0.5, 0.94, 0, 0, 1, CASE_B_ENERGIES) + + # One CONT per L, then one LIST per J. + s.cont(AWR, 0.0, 0, 0, 2, 0) # AWRI, 0, L=0, 0, NJS=2, 0 + # MUF in L2; values are D, AJ, AMUN, GN0, GG, 0, then GF per energy. + # fmt: off + s.list_record(0.0, 0.0, 0, 1, 0, [ + 8.9, 0.5, 1.0, 0.001, 0.040, 0.0, + 0.010, 0.012, 0.015, + ]) + s.list_record(0.0, 0.0, 0, 2, 0, [ + 4.4, 1.5, 1.0, 0.002, 0.040, 0.0, + 0.020, 0.022, 0.025, + ]) + # fmt: on + return s.finish() + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit(__doc__) + target = Path(sys.argv[1]) + + write_material( + target, + MAT, + [ + descriptive( + MAT, + ZA, + AWR, + 10, + [(1, 451, 9), (2, 151, 16)], + " 94-Pu-239", + [ + "----SYNTHETIC MATERIAL 9997", + "-----UNRESOLVED RESONANCE CASES A AND B", + "------ENDF-6 FORMAT", + ], + author="tools/make_urr_endf.py", + lrp=1, + ), + mf2(), + ], + ) + print( + f"{target}: unresolved Case A and Case B, plus a resolved range after A", + file=sys.stderr, + ) + + +if __name__ == "__main__": + main() diff --git a/tools/trim_endf.py b/tools/trim_endf.py new file mode 100644 index 0000000..2e62e29 --- /dev/null +++ b/tools/trim_endf.py @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: MIT +"""Cut an ENDF-6 file down to a chosen set of sections. + +Full evaluations run to tens of megabytes, most of it covariance data, which is +more than a test fixture needs to be useful. This keeps the sections named on +the command line and drops the rest, preserving the record structure — SEND +after each section, FEND after each file, MEND and TEND — so the result is a +valid ENDF tape that both readers accept. + +Sections are kept whole. Truncating one would leave its own counts (NP, NE, NR) +describing records that are no longer there, which is a different file format, +not a smaller fixture. + + python tools/trim_endf.py in.endf out.endf 1:451 2:151 3:* 6:16 33:2 + +``MF:MT`` keeps one section, ``MF:*`` keeps every section of that file. +Listing the sections present, with their line counts: + + python tools/trim_endf.py --list in.endf +""" + +from __future__ import annotations + +import sys +from pathlib import Path + + +def control(line: str) -> tuple[int, int, int]: + """The (MAT, MF, MT) in the last 14 columns.""" + + def field(a: int, b: int) -> int: + s = line[a:b].strip() + return int(s) if s else 0 + + return field(66, 70), field(70, 72), field(72, 75) + + +def sections(lines: list[str]) -> dict[tuple[int, int], int]: + counts: dict[tuple[int, int], int] = {} + for line in lines: + try: + _, mf, mt = control(line) + except ValueError: + continue + if mf > 0 and mt > 0: + counts[mf, mt] = counts.get((mf, mt), 0) + 1 + return counts + + +def parse_keep(specs: list[str]) -> tuple[set[tuple[int, int]], set[int]]: + pairs: set[tuple[int, int]] = set() + whole: set[int] = set() + for spec in specs: + mf_s, _, mt_s = spec.partition(":") + if mt_s == "*": + whole.add(int(mf_s)) + else: + pairs.add((int(mf_s), int(mt_s))) + return pairs, whole + + +def trim(lines: list[str], pairs: set[tuple[int, int]], whole: set[int]) -> list[str]: + def keep(mf: int, mt: int) -> bool: + return mf in whole or (mf, mt) in pairs + + out: list[str] = [] + if lines: + out.append(lines[0]) # TPID + + emitted_in_file = False + last_kept = False + for line in lines[1:]: + try: + mat, mf, mt = control(line) + except ValueError: + continue + + if mat == -1: # TEND + out.append(line) + elif mat == 0: # MEND + out.append(line) + elif mf == 0: # FEND + if emitted_in_file: + out.append(line) + emitted_in_file = False + elif mt == 0: # SEND + if last_kept: + out.append(line) + last_kept = False + else: + last_kept = keep(mf, mt) + if last_kept: + out.append(line) + emitted_in_file = True + return out + + +def main() -> None: + args = sys.argv[1:] + if args and args[0] == "--list": + lines = Path(args[1]).read_text().splitlines(keepends=True) + for (mf, mt), n in sorted(sections(lines).items()): + print(f"MF={mf:<3} MT={mt:<4} {n:>8} lines") + return + + if len(args) < 3: + sys.exit(__doc__) + + source, target, *specs = args + lines = Path(source).read_text().splitlines(keepends=True) + pairs, whole = parse_keep(specs) + out = trim(lines, pairs, whole) + Path(target).write_text("".join(out)) + + kept = sections(out) + print( + f"{source} -> {target}: {len(lines)} lines -> {len(out)}, {len(kept)} sections", + file=sys.stderr, + ) + + +if __name__ == "__main__": + main() diff --git a/xsdir b/xsdir new file mode 100644 index 0000000..e69de29