diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 670b76cd9..050c8e287 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,13 +5,6 @@ on: workflow_dispatch: pull_request: - paths-ignore: - - 'docs/**' - - 'examples/**' - - 'man/**' - - '**.md' - - CODEOWNERS - - LICENSE branches: - develop - master diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cf72db20..85dcd7084 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,10 +17,15 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) # Allow user to specify _ROOT variables -if (NOT (CMAKE_VERSION VERSION_LESS 3.12)) +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.12) cmake_policy(SET CMP0074 NEW) endif() +# Enable correct usage of CXX_EXTENSIONS +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.22) + cmake_policy(SET CMP0128 NEW) +endif() + #=============================================================================== # Command line options #=============================================================================== @@ -118,7 +123,7 @@ endif() # Version 1.12 of HDF5 deprecates the H5Oget_info_by_idx() interface. # Thus, we give these flags to allow usage of the old interface in newer # versions of HDF5. -if(NOT (${HDF5_VERSION} VERSION_LESS 1.12.0)) +if(${HDF5_VERSION} VERSION_GREATER_EQUAL 1.12.0) list(APPEND cxxflags -DH5Oget_info_by_idx_vers=1 -DH5O_info_t_vers=1) endif() @@ -205,7 +210,7 @@ endif() #=============================================================================== # CMake 3.13+ will complain about policy CMP0079 unless it is set explicitly -if (NOT (CMAKE_VERSION VERSION_LESS 3.13)) +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.13) cmake_policy(SET CMP0079 NEW) endif() diff --git a/Dockerfile b/Dockerfile index 755d9f2a0..341390c9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ # sudo docker run image_name:tag_name or ID with no tag sudo docker run ID number -FROM debian:bullseye-slim +FROM debian:bullseye-slim AS dependencies # By default this Dockerfile builds OpenMC without DAGMC and LIBMESH support ARG build_dagmc=off @@ -172,6 +172,8 @@ RUN if [ "$build_libmesh" = "on" ]; then \ && rm -rf ${LIBMESH_INSTALL_DIR}/build ${LIBMESH_INSTALL_DIR}/libmesh ; \ fi +FROM dependencies AS build + # clone and install openmc RUN mkdir -p ${HOME}/OpenMC && cd ${HOME}/OpenMC \ && git clone --shallow-submodules --recurse-submodules --single-branch -b ${openmc_branch} --depth=1 ${OPENMC_REPO} \ @@ -207,5 +209,7 @@ RUN mkdir -p ${HOME}/OpenMC && cd ${HOME}/OpenMC \ && cd ../openmc && pip install .[test,depletion-mpi] \ && python -c "import openmc" +FROM build AS release + # Download cross sections (NNDC and WMP) and ENDF data needed by test suite RUN ${HOME}/OpenMC/openmc/tools/ci/download-xs.sh diff --git a/docs/requirements-rtd.txt b/docs/requirements-rtd.txt index c3d1c0372..9591d482f 100644 --- a/docs/requirements-rtd.txt +++ b/docs/requirements-rtd.txt @@ -1,4 +1,5 @@ -sphinx==4.3.0 +sphinx==5.0.2 +sphinx_rtd_theme==1.0.0 sphinx-numfig jupyter sphinxcontrib-katex diff --git a/docs/source/pythonapi/data.rst b/docs/source/pythonapi/data.rst index 95fdfeca9..287738774 100644 --- a/docs/source/pythonapi/data.rst +++ b/docs/source/pythonapi/data.rst @@ -61,8 +61,10 @@ Core Functions atomic_mass atomic_weight + decay_constant dose_coefficients gnd_name + half_life isotopes linearize thin diff --git a/include/openmc/photon.h b/include/openmc/photon.h index e8ec82d10..09fb3ba01 100644 --- a/include/openmc/photon.h +++ b/include/openmc/photon.h @@ -36,7 +36,6 @@ public: int threshold; double n_electrons; double binding_energy; - xt::xtensor cross_section; vector transitions; }; @@ -80,8 +79,11 @@ public: Tabulated1D coherent_anomalous_real_; Tabulated1D coherent_anomalous_imag_; - // Photoionization and atomic relaxation data + // Photoionization and atomic relaxation data. Subshell cross sections are + // stored separately to improve memory access pattern when calculating the + // total cross section vector shells_; + xt::xtensor cross_sections_; // Compton profile data xt::xtensor profile_pdf_; diff --git a/openmc/cell.py b/openmc/cell.py index 103a34fe6..4b419e1c6 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -214,8 +214,8 @@ class Cell(IDManagerMixin): self._atoms = self._fill.get_nuclide_atom_densities() # Convert to total number of atoms - for key, nuclide in self._atoms.items(): - atom = nuclide[1] * self._volume * 1.0e+24 + for key, atom_per_bcm in self._atoms.items(): + atom = atom_per_bcm * self._volume * 1.0e+24 self._atoms[key] = atom elif self.fill_type == 'distribmat': @@ -224,12 +224,12 @@ class Cell(IDManagerMixin): partial_volume = self.volume / len(self.fill) self._atoms = OrderedDict() for mat in self.fill: - for key, nuclide in mat.get_nuclide_atom_densities().items(): + for key, atom_per_bcm in mat.get_nuclide_atom_densities().items(): # To account for overlap of nuclides between distribmat # we need to append new atoms to any existing value # hence it is necessary to ask for default. atom = self._atoms.setdefault(key, 0) - atom += nuclide[1] * partial_volume * 1.0e+24 + atom += atom_per_bcm * partial_volume * 1.0e+24 self._atoms[key] = atom else: diff --git a/openmc/data/data.py b/openmc/data/data.py index a1d0ee1dc..71b93293e 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -1,10 +1,11 @@ import itertools -from math import sqrt +import json import os import re +from pathlib import Path +from math import sqrt, log from warnings import warn - # Isotopic abundances from Meija J, Coplen T B, et al, "Isotopic compositions # of the elements 2013 (IUPAC Technical Report)", Pure. Appl. Chem. 88 (3), # pp. 293-306 (2013). The "representative isotopic abundance" values from @@ -199,6 +200,9 @@ _ATOMIC_MASS = {} # Regex for GND nuclide names (used in zam function) _GND_NAME_RE = re.compile(r'([A-Zn][a-z]*)(\d+)((?:_[em]\d+)?)') +# Used in half_life function as a cache +_HALF_LIFE = {} +_LOG_TWO = log(2.0) def atomic_mass(isotope): """Return atomic mass of isotope in atomic mass units. @@ -273,6 +277,62 @@ def atomic_weight(element): .format(element)) +def half_life(isotope): + """Return half-life of isotope in seconds or None if isotope is stable + + Half-life values are from the `ENDF/B-VIII.0 decay sublibrary + `_. + + .. versionadded:: 0.13.1 + + Parameters + ---------- + isotope : str + Name of isotope, e.g., 'Pu239' + + Returns + ------- + float + Half-life of isotope in [s] + + """ + global _HALF_LIFE + if not _HALF_LIFE: + # Load ENDF/B-VIII.0 data from JSON file + half_life_path = Path(__file__).with_name('half_life.json') + _HALF_LIFE = json.loads(half_life_path.read_text()) + + return _HALF_LIFE.get(isotope.lower()) + + +def decay_constant(isotope): + """Return decay constant of isotope in [s^-1] + + Decay constants are based on half-life values from the + :func:`~openmc.data.half_life` function. When the isotope is stable, a decay + constant of zero is returned. + + .. versionadded:: 0.13.1 + + Parameters + ---------- + isotope : str + Name of isotope, e.g., 'Pu239' + + Returns + ------- + float + Decay constant of isotope in [s^-1] + + See also + -------- + openmc.data.half_life + + """ + t = half_life(isotope) + return _LOG_TWO / t if t else 0.0 + + def water_density(temperature, pressure=0.1013): """Return the density of liquid water at a given temperature and pressure. diff --git a/openmc/data/decay.py b/openmc/data/decay.py index 5ca2b235a..51a594bc8 100644 --- a/openmc/data/decay.py +++ b/openmc/data/decay.py @@ -465,11 +465,10 @@ class Decay(EqualityMixin): @property def decay_constant(self): - if hasattr(self.half_life, 'n'): - return log(2.)/self.half_life - else: - mu, sigma = self.half_life - return ufloat(log(2.)/mu, log(2.)/mu**2*sigma) + if self.half_life.n == 0.0: + name = self.nuclide['name'] + raise ValueError(f"{name} is listed as unstable but has a zero half-life.") + return log(2.)/self.half_life @property def decay_energy(self): diff --git a/openmc/data/half_life.json b/openmc/data/half_life.json new file mode 100644 index 000000000..4f670918b --- /dev/null +++ b/openmc/data/half_life.json @@ -0,0 +1,3563 @@ +{ + "h3": 388789600.0, + "h4": 9.90652e-23, + "h5": 7.99473e-23, + "h6": 2.84812e-22, + "h7": 2.3e-23, + "he5": 7.595e-22, + "he6": 0.8067, + "he7": 3.038e-21, + "he8": 0.1191, + "he9": 7e-21, + "he10": 1.519e-21, + "li4": 7.55721e-23, + "li5": 3.06868e-22, + "li8": 0.838, + "li9": 0.1783, + "li10": 2e-21, + "li11": 0.00859, + "li12": 1e-08, + "be5": 1e-09, + "be6": 4.95326e-21, + "be7": 4598208.0, + "be8": 8.18132e-17, + "be10": 47652000000000.0, + "be11": 13.81, + "be12": 0.0213, + "be13": 2.7e-21, + "be14": 0.00435, + "be15": 2e-07, + "be16": 2e-07, + "b6": 1e-09, + "b7": 3.255e-22, + "b8": 0.77, + "b9": 8.43888e-19, + "b12": 0.0202, + "b13": 0.01736, + "b14": 0.0125, + "b15": 0.00993, + "b16": 1.9e-10, + "b17": 0.00508, + "b18": 2.6e-08, + "b19": 0.00292, + "c8": 1.9813e-21, + "c9": 0.1265, + "c10": 19.29, + "c11": 1223.1, + "c14": 179878000000.0, + "c15": 2.449, + "c16": 0.747, + "c17": 0.193, + "c18": 0.092, + "c19": 0.049, + "c20": 0.0145, + "c21": 3e-08, + "c22": 0.0062, + "n10": 2e-22, + "n11": 3.12742e-22, + "n12": 0.011, + "n13": 597.9, + "n16": 7.13, + "n17": 4.171, + "n18": 0.624, + "n19": 0.271, + "n20": 0.13, + "n21": 0.085, + "n22": 0.024, + "n23": 0.0145, + "n24": 5.2e-08, + "n25": 2.6e-07, + "o12": 1.13925e-21, + "o13": 0.00858, + "o14": 70.606, + "o15": 122.24, + "o19": 26.88, + "o20": 13.51, + "o21": 3.42, + "o22": 2.25, + "o23": 0.0905, + "o24": 0.065, + "o25": 5e-08, + "o26": 4e-08, + "o27": 2.6e-07, + "o28": 1e-07, + "f14": 5.0007e-22, + "f15": 4.557e-22, + "f16": 1.13925e-20, + "f17": 64.49, + "f18": 6586.2, + "f20": 11.163, + "f21": 4.158, + "f22": 4.23, + "f23": 2.23, + "f24": 0.39, + "f25": 0.05, + "f26": 0.0096, + "f27": 0.005, + "f28": 4e-08, + "f29": 0.0025, + "f30": 2.6e-07, + "f31": 2.5e-07, + "ne16": 3.73524e-21, + "ne17": 0.1092, + "ne18": 1.672, + "ne19": 17.22, + "ne23": 37.24, + "ne24": 202.8, + "ne25": 0.602, + "ne26": 0.197, + "ne27": 0.032, + "ne28": 0.0189, + "ne29": 0.0148, + "ne30": 0.0073, + "ne31": 0.0034, + "ne32": 0.0035, + "ne33": 1.8e-07, + "ne34": 6e-08, + "na18": 1.3e-21, + "na19": 4e-08, + "na20": 0.4479, + "na21": 22.49, + "na22": 82134970.0, + "na24": 53989.2, + "na24_m1": 0.02018, + "na25": 59.1, + "na26": 1.077, + "na27": 0.301, + "na28": 0.0305, + "na29": 0.0449, + "na30": 0.048, + "na31": 0.017, + "na32": 0.0132, + "na33": 0.008, + "na34": 0.0055, + "na35": 0.0015, + "na36": 1.8e-07, + "na37": 6e-08, + "mg19": 4e-12, + "mg20": 0.0908, + "mg21": 0.122, + "mg22": 3.8755, + "mg23": 11.317, + "mg27": 567.48, + "mg28": 75294.0, + "mg29": 1.3, + "mg30": 0.335, + "mg31": 0.232, + "mg32": 0.086, + "mg33": 0.0905, + "mg34": 0.02, + "mg35": 0.07, + "mg36": 0.0039, + "mg37": 2.6e-07, + "mg38": 2.6e-07, + "mg39": 1.8e-07, + "mg40": 1.7e-07, + "al21": 3.5e-08, + "al22": 0.059, + "al23": 0.47, + "al24": 2.053, + "al24_m1": 0.13, + "al25": 7.183, + "al26": 22626800000000.0, + "al26_m1": 6.3452, + "al28": 134.484, + "al29": 393.6, + "al30": 3.62, + "al31": 0.644, + "al32": 0.033, + "al33": 0.0417, + "al34": 0.042, + "al35": 0.0386, + "al36": 0.09, + "al37": 0.0107, + "al38": 0.0076, + "al39": 7.6e-06, + "al40": 2.6e-07, + "al41": 2.6e-07, + "al42": 1.7e-07, + "si22": 0.029, + "si23": 0.0423, + "si24": 0.14, + "si25": 0.22, + "si26": 2.234, + "si27": 4.16, + "si31": 9438.0, + "si32": 4828310000.0, + "si33": 6.11, + "si34": 2.77, + "si35": 0.78, + "si36": 0.45, + "si37": 0.09, + "si38": 1e-06, + "si39": 0.0475, + "si40": 0.033, + "si41": 0.02, + "si42": 0.0125, + "si43": 6e-08, + "si44": 3.6e-07, + "p24": 0.0074, + "p25": 3e-08, + "p26": 0.0437, + "p27": 0.26, + "p28": 0.2703, + "p29": 4.142, + "p30": 149.88, + "p32": 1232323.0, + "p33": 2189376.0, + "p34": 12.43, + "p35": 47.3, + "p36": 5.6, + "p37": 2.31, + "p38": 0.64, + "p39": 0.28, + "p40": 0.125, + "p41": 0.1, + "p42": 0.0485, + "p43": 0.0365, + "p44": 0.0185, + "p45": 2e-07, + "p46": 2e-07, + "s26": 0.01, + "s27": 0.0155, + "s28": 0.125, + "s29": 0.187, + "s30": 1.178, + "s31": 2.572, + "s35": 7560864.0, + "s37": 303.0, + "s38": 10218.0, + "s39": 11.5, + "s40": 8.8, + "s41": 1.99, + "s42": 1.013, + "s43": 0.28, + "s44": 0.1, + "s45": 0.068, + "s46": 0.05, + "s48": 2e-07, + "s49": 2e-07, + "cl28": 0.0017, + "cl29": 2e-08, + "cl30": 3e-08, + "cl31": 0.15, + "cl32": 0.298, + "cl33": 2.511, + "cl34": 1.5264, + "cl34_m1": 1920.0, + "cl36": 9498840000000.0, + "cl38": 2233.8, + "cl38_m1": 0.715, + "cl39": 3336.0, + "cl40": 81.0, + "cl41": 38.4, + "cl42": 6.8, + "cl43": 3.13, + "cl44": 0.56, + "cl45": 0.413, + "cl46": 0.232, + "cl47": 0.101, + "cl48": 2e-07, + "cl49": 1.7e-07, + "cl50": 0.02, + "cl51": 2e-07, + "ar30": 2e-08, + "ar31": 0.0151, + "ar32": 0.098, + "ar33": 0.173, + "ar34": 0.8445, + "ar35": 1.775, + "ar37": 3027456.0, + "ar39": 8488990000.0, + "ar41": 6576.6, + "ar42": 1038250000.0, + "ar43": 322.2, + "ar44": 712.2, + "ar45": 21.48, + "ar46": 8.4, + "ar47": 1.23, + "ar48": 0.475, + "ar49": 0.17, + "ar50": 0.085, + "ar51": 2e-07, + "ar52": 0.01, + "ar53": 0.003, + "k32": 0.0033, + "k33": 2.5e-08, + "k34": 2.5e-08, + "k35": 0.178, + "k36": 0.342, + "k37": 1.226, + "k38": 458.16, + "k38_m1": 0.924, + "k40": 3.93839e16, + "k42": 44496.0, + "k43": 80280.0, + "k44": 1327.8, + "k45": 1068.6, + "k46": 105.0, + "k47": 17.5, + "k48": 6.8, + "k49": 1.26, + "k50": 0.472, + "k51": 0.365, + "k52": 0.105, + "k53": 0.03, + "k54": 0.01, + "k55": 0.003, + "ca34": 3.5e-08, + "ca35": 0.0257, + "ca36": 0.102, + "ca37": 0.1811, + "ca38": 0.44, + "ca39": 0.8596, + "ca41": 3218880000000.0, + "ca45": 14049500.0, + "ca47": 391910.4, + "ca48": 7.25824e26, + "ca49": 523.08, + "ca50": 13.9, + "ca51": 10.0, + "ca52": 4.6, + "ca53": 0.09, + "ca54": 0.086, + "ca55": 0.022, + "ca56": 0.01, + "ca57": 0.005, + "sc36": 0.0088, + "sc37": 0.056, + "sc38": 0.0423, + "sc39": 3e-07, + "sc40": 0.1823, + "sc41": 0.5963, + "sc42": 0.6808, + "sc42_m1": 62.0, + "sc43": 14007.6, + "sc44": 14292.0, + "sc44_m1": 210996.0, + "sc45_m1": 0.318, + "sc46": 7239456.0, + "sc46_m1": 18.75, + "sc47": 289370.9, + "sc48": 157212.0, + "sc49": 3430.8, + "sc50": 102.5, + "sc50_m1": 0.35, + "sc51": 12.4, + "sc52": 8.2, + "sc53": 3.0, + "sc54": 0.36, + "sc55": 0.105, + "sc56": 0.06, + "sc57": 0.013, + "sc58": 0.012, + "sc59": 0.01, + "sc60": 0.003, + "ti38": 1.2e-07, + "ti39": 0.032, + "ti40": 0.0533, + "ti41": 0.0804, + "ti42": 0.199, + "ti43": 0.509, + "ti44": 1893460000.0, + "ti45": 11088.0, + "ti51": 345.6, + "ti52": 102.0, + "ti53": 32.7, + "ti54": 1.5, + "ti55": 1.3, + "ti56": 0.2, + "ti57": 0.06, + "ti58": 0.059, + "ti59": 0.03, + "ti60": 0.022, + "ti61": 3e-07, + "ti62": 0.01, + "ti63": 0.003, + "v40": 0.0077, + "v41": 0.0244, + "v42": 5.5e-08, + "v43": 0.8, + "v44": 0.111, + "v44_m1": 0.15, + "v45": 0.547, + "v46": 0.4225, + "v46_m1": 0.00102, + "v47": 1956.0, + "v48": 1380110.0, + "v49": 28512000.0, + "v50": 4.41806e24, + "v52": 224.58, + "v53": 92.58, + "v54": 49.8, + "v55": 6.54, + "v56": 0.216, + "v57": 0.35, + "v58": 0.185, + "v59": 0.075, + "v60": 0.068, + "v61": 0.047, + "v62": 1.5e-07, + "v63": 0.017, + "v64": 0.019, + "v65": 0.01, + "cr42": 0.014, + "cr43": 0.0216, + "cr44": 0.0535, + "cr45": 0.0609, + "cr46": 0.26, + "cr47": 0.5, + "cr48": 77616.0, + "cr49": 2538.0, + "cr51": 2393366.0, + "cr55": 209.82, + "cr56": 356.4, + "cr57": 21.1, + "cr58": 7.0, + "cr59": 0.46, + "cr60": 0.49, + "cr61": 0.27, + "cr62": 0.19, + "cr63": 0.129, + "cr64": 0.043, + "cr65": 0.027, + "cr66": 0.01, + "cr67": 0.05, + "mn44": 1.05e-07, + "mn45": 7e-08, + "mn46": 0.0345, + "mn47": 0.1, + "mn48": 0.1581, + "mn49": 0.382, + "mn50": 0.28319, + "mn50_m1": 105.0, + "mn51": 2772.0, + "mn52": 483062.4, + "mn52_m1": 1266.0, + "mn53": 116763000000000.0, + "mn54": 26961120.0, + "mn56": 9284.04, + "mn57": 85.4, + "mn58": 3.0, + "mn58_m1": 65.4, + "mn59": 4.59, + "mn60": 51.0, + "mn60_m1": 1.77, + "mn61": 0.67, + "mn62": 0.671, + "mn62_m1": 0.092, + "mn63": 0.29, + "mn64": 0.09, + "mn65": 0.092, + "mn66": 0.064, + "mn67": 0.047, + "mn68": 0.028, + "mn69": 0.014, + "fe45": 0.00203, + "fe46": 0.013, + "fe47": 0.0219, + "fe48": 0.044, + "fe49": 0.0647, + "fe50": 0.155, + "fe51": 0.305, + "fe52": 29790.0, + "fe52_m1": 45.9, + "fe53": 510.6, + "fe53_m1": 152.4, + "fe55": 86594050.0, + "fe59": 3844368.0, + "fe60": 47336400000000.0, + "fe61": 358.8, + "fe62": 68.0, + "fe63": 6.1, + "fe64": 2.0, + "fe65": 0.81, + "fe65_m1": 1.12, + "fe66": 0.44, + "fe67": 0.416, + "fe68": 0.187, + "fe69": 0.109, + "fe70": 0.094, + "fe71": 0.028, + "fe72": 1.5e-07, + "co49": 3.5e-08, + "co50": 0.044, + "co51": 2e-07, + "co52": 0.115, + "co53": 0.24, + "co53_m1": 0.247, + "co54": 0.19328, + "co54_m1": 88.8, + "co55": 63108.0, + "co56": 6672931.0, + "co57": 23478340.0, + "co58": 6122304.0, + "co58_m1": 32760.0, + "co60": 166344200.0, + "co60_m1": 628.02, + "co61": 5940.0, + "co62": 90.0, + "co62_m1": 834.6, + "co63": 27.4, + "co64": 0.3, + "co65": 1.16, + "co66": 0.2, + "co67": 0.425, + "co68": 0.199, + "co68_m1": 1.6, + "co69": 0.22, + "co70": 0.119, + "co70_m1": 0.5, + "co71": 0.079, + "co72": 0.0599, + "co73": 0.041, + "co74": 0.03, + "co75": 0.034, + "ni48": 0.0021, + "ni49": 0.0075, + "ni50": 0.012, + "ni51": 2e-07, + "ni52": 0.038, + "ni53": 0.045, + "ni54": 0.104, + "ni55": 0.2047, + "ni56": 524880.0, + "ni57": 128160.0, + "ni59": 2398380000000.0, + "ni63": 3193630000.0, + "ni65": 9061.884, + "ni66": 196560.0, + "ni67": 21.0, + "ni68": 29.0, + "ni69": 11.4, + "ni69_m1": 3.5, + "ni70": 6.0, + "ni71": 2.56, + "ni72": 1.57, + "ni73": 0.84, + "ni74": 0.68, + "ni75": 0.6, + "ni76": 0.238, + "ni77": 0.061, + "ni78": 0.11, + "cu52": 0.0069, + "cu53": 3e-07, + "cu54": 7.5e-08, + "cu55": 0.04, + "cu56": 0.094, + "cu57": 0.1963, + "cu58": 3.204, + "cu59": 81.5, + "cu60": 1422.0, + "cu61": 11998.8, + "cu62": 580.38, + "cu64": 45723.6, + "cu66": 307.2, + "cu67": 222588.0, + "cu68": 31.1, + "cu68_m1": 225.0, + "cu69": 171.0, + "cu70": 44.5, + "cu70_m1": 33.0, + "cu70_m2": 6.6, + "cu71": 19.5, + "cu72": 6.63, + "cu73": 4.2, + "cu74": 1.75, + "cu75": 1.224, + "cu76": 0.653, + "cu76_m1": 1.27, + "cu77": 0.469, + "cu78": 0.335, + "cu79": 0.188, + "cu80": 0.17, + "cu81": 0.028, + "zn54": 0.0037, + "zn55": 0.02, + "zn56": 5e-07, + "zn57": 0.038, + "zn58": 0.084, + "zn59": 0.182, + "zn60": 142.8, + "zn61": 89.1, + "zn61_m1": 0.43, + "zn61_m2": 0.14, + "zn62": 33336.0, + "zn63": 2308.2, + "zn65": 21075550.0, + "zn69": 3384.0, + "zn69_m1": 49536.0, + "zn71": 147.0, + "zn71_m1": 14256.0, + "zn72": 167400.0, + "zn73": 23.5, + "zn73_m1": 5.8, + "zn73_m2": 0.013, + "zn74": 95.6, + "zn75": 10.2, + "zn76": 5.7, + "zn77": 2.08, + "zn77_m1": 1.05, + "zn78": 1.47, + "zn79": 0.995, + "zn80": 0.54, + "zn81": 0.32, + "zn82": 0.052, + "zn83": 0.043, + "ga56": 0.0059, + "ga57": 0.0123, + "ga58": 0.0152, + "ga59": 0.0418, + "ga60": 0.07, + "ga61": 0.168, + "ga62": 0.11612, + "ga63": 32.4, + "ga64": 157.62, + "ga65": 912.0, + "ga66": 34164.0, + "ga67": 281810.9, + "ga68": 4062.6, + "ga70": 1268.4, + "ga72": 50760.0, + "ga72_m1": 0.03968, + "ga73": 17496.0, + "ga74": 487.2, + "ga74_m1": 9.5, + "ga75": 126.0, + "ga76": 32.6, + "ga77": 13.2, + "ga78": 5.09, + "ga79": 2.847, + "ga80": 1.676, + "ga81": 1.217, + "ga82": 0.599, + "ga83": 0.3081, + "ga84": 0.085, + "ga85": 0.048, + "ga86": 0.029, + "ge58": 0.0152, + "ge59": 0.0418, + "ge60": 0.03, + "ge61": 0.039, + "ge62": 1.5e-07, + "ge63": 0.142, + "ge64": 63.7, + "ge65": 30.9, + "ge66": 8136.0, + "ge67": 1134.0, + "ge68": 23410080.0, + "ge69": 140580.0, + "ge71": 987552.0, + "ge71_m1": 0.02041, + "ge73_m1": 0.499, + "ge75": 4966.8, + "ge75_m1": 47.7, + "ge77": 40680.0, + "ge77_m1": 52.9, + "ge78": 5280.0, + "ge79": 18.98, + "ge79_m1": 39.0, + "ge80": 29.5, + "ge81": 7.6, + "ge81_m1": 7.6, + "ge82": 4.55, + "ge83": 1.85, + "ge84": 0.954, + "ge85": 0.535, + "ge86": 0.095, + "ge87": 0.14, + "ge88": 0.066, + "ge89": 0.039, + "as60": 0.0083, + "as61": 0.0166, + "as62": 0.0259, + "as63": 0.0921, + "as64": 0.036, + "as65": 0.128, + "as66": 0.09579, + "as67": 42.5, + "as68": 151.6, + "as69": 913.8, + "as70": 3156.0, + "as71": 235080.0, + "as72": 93600.0, + "as73": 6937920.0, + "as74": 1535328.0, + "as75_m1": 0.01762, + "as76": 94464.0, + "as77": 139788.0, + "as78": 5442.0, + "as79": 540.6, + "as80": 15.2, + "as81": 33.3, + "as82": 19.1, + "as82_m1": 13.6, + "as83": 13.4, + "as84": 4.2, + "as85": 2.021, + "as86": 0.945, + "as87": 0.56, + "as88": 0.112, + "as89": 0.059, + "as90": 0.043, + "as91": 0.044, + "as92": 0.027, + "se65": 0.05, + "se66": 0.033, + "se67": 0.136, + "se68": 35.5, + "se69": 27.4, + "se70": 2466.0, + "se71": 284.4, + "se72": 725760.0, + "se73": 25740.0, + "se73_m1": 2388.0, + "se75": 10349860.0, + "se77_m1": 17.36, + "se79": 9309490000000.0, + "se79_m1": 235.2, + "se81": 1107.0, + "se81_m1": 3436.8, + "se83": 1338.0, + "se83_m1": 70.1, + "se84": 195.6, + "se85": 31.7, + "se86": 14.3, + "se87": 5.5, + "se88": 1.53, + "se89": 0.41, + "se90": 0.161, + "se91": 0.27, + "se92": 0.093, + "se93": 0.062, + "se94": 0.059, + "br67": 0.0443, + "br68": 1.2e-06, + "br69": 2.4e-08, + "br70": 0.0791, + "br70_m1": 2.2, + "br71": 21.4, + "br72": 78.6, + "br72_m1": 10.6, + "br73": 204.0, + "br74": 1524.0, + "br74_m1": 2760.0, + "br75": 5802.0, + "br76": 58320.0, + "br76_m1": 1.31, + "br77": 205329.6, + "br77_m1": 256.8, + "br78": 387.0, + "br79_m1": 4.86, + "br80": 1060.8, + "br80_m1": 15913.8, + "br82": 127015.2, + "br82_m1": 367.8, + "br83": 8640.0, + "br84": 1905.6, + "br84_m1": 360.0, + "br85": 174.0, + "br86": 55.0, + "br87": 55.65, + "br88": 16.29, + "br89": 4.4, + "br90": 1.92, + "br91": 0.541, + "br92": 0.343, + "br93": 0.102, + "br94": 0.07, + "br95": 0.066, + "br96": 0.042, + "br97": 0.04, + "kr69": 0.032, + "kr70": 0.052, + "kr71": 0.1, + "kr72": 17.1, + "kr73": 27.3, + "kr74": 690.0, + "kr75": 257.4, + "kr76": 53280.0, + "kr77": 4464.0, + "kr79": 126144.0, + "kr79_m1": 50.0, + "kr81": 7226690000000.0, + "kr81_m1": 13.1, + "kr83_m1": 6588.0, + "kr85": 339433500.0, + "kr85_m1": 16128.0, + "kr87": 4578.0, + "kr88": 10224.0, + "kr89": 189.0, + "kr90": 32.32, + "kr91": 8.57, + "kr92": 1.84, + "kr93": 1.286, + "kr94": 0.212, + "kr95": 0.114, + "kr96": 0.08, + "kr97": 0.063, + "kr98": 0.046, + "kr99": 0.027, + "kr100": 0.007, + "rb71": 1e-09, + "rb72": 1.2e-06, + "rb73": 3e-08, + "rb74": 0.064776, + "rb75": 19.0, + "rb76": 36.5, + "rb77": 226.2, + "rb78": 1059.6, + "rb78_m1": 344.4, + "rb79": 1374.0, + "rb80": 34.0, + "rb81": 16459.2, + "rb81_m1": 1830.0, + "rb82": 75.45, + "rb82_m1": 23299.2, + "rb83": 7447680.0, + "rb84": 2835648.0, + "rb84_m1": 1215.6, + "rb86": 1609718.0, + "rb86_m1": 61.02, + "rb87": 1.51792e18, + "rb88": 1066.38, + "rb89": 909.0, + "rb90": 158.0, + "rb90_m1": 258.0, + "rb91": 58.4, + "rb92": 4.492, + "rb93": 5.84, + "rb94": 2.702, + "rb95": 0.3777, + "rb96": 0.203, + "rb97": 0.1691, + "rb98": 0.114, + "rb98_m1": 0.096, + "rb99": 0.054, + "rb100": 0.051, + "rb101": 0.032, + "rb102": 0.037, + "sr73": 0.025, + "sr74": 1.2e-06, + "sr75": 0.088, + "sr76": 7.89, + "sr77": 9.0, + "sr78": 150.0, + "sr79": 135.0, + "sr80": 6378.0, + "sr81": 1338.0, + "sr82": 2190240.0, + "sr83": 116676.0, + "sr83_m1": 4.95, + "sr85": 5602176.0, + "sr85_m1": 4057.8, + "sr87_m1": 10134.0, + "sr89": 4365792.0, + "sr90": 908543300.0, + "sr91": 34668.0, + "sr92": 9756.0, + "sr93": 445.38, + "sr94": 75.3, + "sr95": 23.9, + "sr96": 1.07, + "sr97": 0.429, + "sr98": 0.653, + "sr99": 0.27, + "sr100": 0.202, + "sr101": 0.118, + "sr102": 0.069, + "sr103": 0.068, + "sr104": 0.043, + "sr105": 0.0556, + "y76": 2e-07, + "y77": 0.062, + "y78": 0.05, + "y78_m1": 5.7, + "y79": 14.8, + "y80": 30.1, + "y80_m1": 4.8, + "y81": 70.4, + "y82": 8.3, + "y83": 424.8, + "y83_m1": 171.0, + "y84": 2370.0, + "y84_m1": 4.6, + "y85": 9648.0, + "y85_m1": 17496.0, + "y86": 53064.0, + "y86_m1": 2880.0, + "y87": 287280.0, + "y87_m1": 48132.0, + "y88": 9212486.0, + "y88_m1": 0.000301, + "y88_m2": 0.01397, + "y89_m1": 15.663, + "y90": 230400.0, + "y90_m1": 11484.0, + "y91": 5055264.0, + "y91_m1": 2982.6, + "y92": 12744.0, + "y93": 36648.0, + "y93_m1": 0.82, + "y94": 1122.0, + "y95": 618.0, + "y96": 5.34, + "y96_m1": 9.6, + "y97": 3.75, + "y97_m1": 1.17, + "y97_m2": 0.142, + "y98": 0.548, + "y98_m1": 2.0, + "y99": 1.47, + "y100": 0.735, + "y100_m1": 0.94, + "y101": 0.45, + "y102": 0.36, + "y102_m1": 0.298, + "y103": 0.23, + "y104": 0.18, + "y105": 0.088, + "y106": 0.066, + "y107": 0.03, + "y108": 0.048, + "zr78": 2e-07, + "zr79": 0.056, + "zr80": 4.6, + "zr81": 5.5, + "zr82": 32.0, + "zr83": 41.6, + "zr84": 1554.0, + "zr85": 471.6, + "zr85_m1": 10.9, + "zr86": 59400.0, + "zr87": 6048.0, + "zr87_m1": 14.0, + "zr88": 7205760.0, + "zr89": 282276.0, + "zr89_m1": 249.66, + "zr90_m1": 0.8092, + "zr93": 48283100000000.0, + "zr95": 5532365.0, + "zr96": 6.31152e26, + "zr97": 60296.4, + "zr98": 30.7, + "zr99": 2.1, + "zr100": 7.1, + "zr101": 2.3, + "zr102": 2.9, + "zr103": 1.3, + "zr104": 1.2, + "zr105": 0.6, + "zr106": 0.27, + "zr107": 0.15, + "zr108": 0.08, + "zr109": 0.117, + "zr110": 0.098, + "nb81": 0.8, + "nb82": 0.05, + "nb83": 4.1, + "nb84": 9.8, + "nb85": 20.9, + "nb85_m1": 3.3, + "nb86": 88.0, + "nb87": 225.0, + "nb87_m1": 156.0, + "nb88": 873.0, + "nb88_m1": 466.8, + "nb89": 7308.0, + "nb89_m1": 3960.0, + "nb90": 52560.0, + "nb90_m1": 18.81, + "nb90_m2": 0.00619, + "nb91": 21459200000.0, + "nb91_m1": 5258304.0, + "nb92": 1095050000000000.0, + "nb92_m1": 876960.0, + "nb93_m1": 509024100.0, + "nb94": 640619000000.0, + "nb94_m1": 375.78, + "nb95": 3023222.0, + "nb95_m1": 311904.0, + "nb96": 84060.0, + "nb97": 4326.0, + "nb97_m1": 58.7, + "nb98": 2.86, + "nb98_m1": 3078.0, + "nb99": 15.0, + "nb99_m1": 150.0, + "nb100": 1.5, + "nb100_m1": 2.99, + "nb101": 7.1, + "nb102": 4.3, + "nb102_m1": 1.3, + "nb103": 1.5, + "nb104": 4.9, + "nb104_m1": 0.94, + "nb105": 2.95, + "nb106": 0.93, + "nb107": 0.3, + "nb108": 0.193, + "nb109": 0.19, + "nb110": 0.17, + "nb111": 0.08, + "nb112": 0.069, + "nb113": 0.03, + "mo83": 0.0195, + "mo84": 3.8, + "mo85": 3.2, + "mo86": 19.6, + "mo87": 14.02, + "mo88": 480.0, + "mo89": 126.6, + "mo89_m1": 0.19, + "mo90": 20412.0, + "mo91": 929.4, + "mo91_m1": 64.6, + "mo93": 126230000000.0, + "mo93_m1": 24660.0, + "mo99": 237513.6, + "mo100": 2.3037e26, + "mo101": 876.6, + "mo102": 678.0, + "mo103": 67.5, + "mo104": 60.0, + "mo105": 35.6, + "mo106": 8.73, + "mo107": 3.5, + "mo108": 1.09, + "mo109": 0.53, + "mo110": 0.3, + "mo111": 0.2, + "mo112": 0.287, + "mo113": 0.1, + "mo114": 0.08, + "mo115": 0.092, + "tc85": 0.5, + "tc86": 0.054, + "tc86_m1": 1.1e-06, + "tc87": 2.2, + "tc88": 5.8, + "tc88_m1": 6.4, + "tc89": 12.8, + "tc89_m1": 12.9, + "tc90": 8.7, + "tc90_m1": 49.2, + "tc91": 188.4, + "tc91_m1": 198.0, + "tc92": 255.0, + "tc93": 9900.0, + "tc93_m1": 2610.0, + "tc94": 17580.0, + "tc94_m1": 3120.0, + "tc95": 72000.0, + "tc95_m1": 5270400.0, + "tc96": 369792.0, + "tc96_m1": 3090.0, + "tc97": 132857000000000.0, + "tc97_m1": 7862400.0, + "tc98": 132542000000000.0, + "tc99": 6661810000000.0, + "tc99_m1": 21624.12, + "tc100": 15.46, + "tc101": 852.0, + "tc102": 5.28, + "tc102_m1": 261.0, + "tc103": 54.2, + "tc104": 1098.0, + "tc105": 456.0, + "tc106": 35.6, + "tc107": 21.2, + "tc108": 5.17, + "tc109": 0.86, + "tc110": 0.92, + "tc111": 0.29, + "tc112": 0.28, + "tc113": 0.16, + "tc114": 0.15, + "tc115": 0.073, + "tc116": 0.09, + "tc117": 0.04, + "tc118": 0.066, + "ru87": 1.5e-06, + "ru88": 1.25, + "ru89": 1.5, + "ru90": 11.7, + "ru91": 7.9, + "ru91_m1": 7.6, + "ru92": 219.0, + "ru93": 59.7, + "ru93_m1": 10.8, + "ru94": 3108.0, + "ru95": 5914.8, + "ru97": 244512.0, + "ru103": 3390941.0, + "ru103_m1": 0.00169, + "ru105": 15984.0, + "ru106": 32123520.0, + "ru107": 225.0, + "ru108": 273.0, + "ru109": 34.5, + "ru110": 11.6, + "ru111": 2.12, + "ru112": 1.75, + "ru113": 0.8, + "ru113_m1": 0.51, + "ru114": 0.52, + "ru115": 0.74, + "ru116": 0.204, + "ru117": 0.142, + "ru118": 0.123, + "ru119": 0.162, + "ru120": 0.149, + "rh89": 1.5e-06, + "rh90": 0.0145, + "rh90_m1": 1.05, + "rh91": 1.47, + "rh92": 4.66, + "rh93": 11.9, + "rh94": 70.6, + "rh94_m1": 25.8, + "rh95": 301.2, + "rh95_m1": 117.6, + "rh96": 594.0, + "rh96_m1": 90.6, + "rh97": 1842.0, + "rh97_m1": 2772.0, + "rh98": 523.2, + "rh98_m1": 216.0, + "rh99": 1391040.0, + "rh99_m1": 16920.0, + "rh100": 74880.0, + "rh100_m1": 276.0, + "rh101": 104140100.0, + "rh101_m1": 374976.0, + "rh102": 17910720.0, + "rh102_m1": 118088500.0, + "rh103_m1": 3366.84, + "rh104": 42.3, + "rh104_m1": 260.4, + "rh105": 127296.0, + "rh105_m1": 40.0, + "rh106": 30.07, + "rh106_m1": 7860.0, + "rh107": 1302.0, + "rh108": 16.8, + "rh108_m1": 360.0, + "rh109": 80.0, + "rh110": 3.2, + "rh110_m1": 28.5, + "rh111": 11.0, + "rh112": 2.1, + "rh112_m1": 6.73, + "rh113": 2.8, + "rh114": 1.85, + "rh115": 0.99, + "rh116": 0.68, + "rh116_m1": 0.57, + "rh117": 0.44, + "rh118": 0.266, + "rh119": 0.171, + "rh120": 0.136, + "rh121": 0.151, + "rh122": 0.108, + "rh123": 0.0489, + "pd91": 1e-06, + "pd92": 0.8, + "pd93": 1.3, + "pd94": 9.0, + "pd95": 10.0, + "pd95_m1": 13.3, + "pd96": 122.0, + "pd97": 186.0, + "pd98": 1062.0, + "pd99": 1284.0, + "pd100": 313632.0, + "pd101": 30492.0, + "pd103": 1468022.0, + "pd107": 205124000000000.0, + "pd107_m1": 21.3, + "pd109": 49324.32, + "pd109_m1": 281.4, + "pd111": 1404.0, + "pd111_m1": 19800.0, + "pd112": 75708.0, + "pd113": 93.0, + "pd113_m1": 0.3, + "pd114": 145.2, + "pd115": 25.0, + "pd115_m1": 50.0, + "pd116": 11.8, + "pd117": 4.3, + "pd117_m1": 0.0191, + "pd118": 1.9, + "pd119": 0.92, + "pd120": 0.5, + "pd121": 0.285, + "pd122": 0.175, + "pd123": 0.244, + "pd124": 0.038, + "pd125": 0.3987, + "pd126": 0.2499, + "ag93": 1.5e-06, + "ag94": 0.035, + "ag94_m1": 0.55, + "ag94_m2": 0.4, + "ag95": 2.0, + "ag95_m1": 0.5, + "ag95_m2": 0.016, + "ag95_m3": 0.04, + "ag96": 4.4, + "ag96_m1": 6.9, + "ag97": 25.5, + "ag98": 47.5, + "ag99": 124.0, + "ag99_m1": 10.5, + "ag100": 120.6, + "ag100_m1": 134.4, + "ag101": 666.0, + "ag101_m1": 3.1, + "ag102": 774.0, + "ag102_m1": 462.0, + "ag103": 3942.0, + "ag103_m1": 5.7, + "ag104": 4152.0, + "ag104_m1": 2010.0, + "ag105": 3567456.0, + "ag105_m1": 433.8, + "ag106": 1437.6, + "ag106_m1": 715392.0, + "ag107_m1": 44.3, + "ag108": 142.92, + "ag108_m1": 13822200000.0, + "ag109_m1": 39.6, + "ag110": 24.6, + "ag110_m1": 21579260.0, + "ag111": 643680.0, + "ag111_m1": 64.8, + "ag112": 11268.0, + "ag113": 19332.0, + "ag113_m1": 68.7, + "ag114": 4.6, + "ag114_m1": 0.0015, + "ag115": 1200.0, + "ag115_m1": 18.0, + "ag116": 237.0, + "ag116_m1": 20.0, + "ag116_m2": 9.3, + "ag117": 72.8, + "ag117_m1": 5.34, + "ag118": 3.76, + "ag118_m1": 2.0, + "ag119": 2.1, + "ag119_m1": 6.0, + "ag120": 1.23, + "ag120_m1": 0.32, + "ag121": 0.78, + "ag122": 0.529, + "ag122_m1": 0.2, + "ag123": 0.3, + "ag124": 0.172, + "ag125": 0.166, + "ag126": 0.107, + "ag127": 0.109, + "ag128": 0.058, + "ag129": 0.046, + "ag130": 0.05, + "cd95": 0.005, + "cd96": 1.0, + "cd97": 2.8, + "cd98": 9.2, + "cd99": 16.0, + "cd100": 49.1, + "cd101": 81.6, + "cd102": 330.0, + "cd103": 438.0, + "cd104": 3462.0, + "cd105": 3330.0, + "cd107": 23400.0, + "cd109": 39864960.0, + "cd111_m1": 2912.4, + "cd113": 2.53723e23, + "cd113_m1": 444962200.0, + "cd115": 192456.0, + "cd115_m1": 3849984.0, + "cd116": 9.78286e26, + "cd117": 8964.0, + "cd117_m1": 12096.0, + "cd118": 3018.0, + "cd119": 161.4, + "cd119_m1": 132.0, + "cd120": 50.8, + "cd121": 13.5, + "cd121_m1": 8.3, + "cd122": 5.24, + "cd123": 2.1, + "cd123_m1": 1.82, + "cd124": 1.25, + "cd125": 0.68, + "cd125_m1": 0.48, + "cd126": 0.515, + "cd127": 0.37, + "cd128": 0.28, + "cd129": 0.27, + "cd130": 0.162, + "cd131": 0.068, + "cd132": 0.097, + "in97": 0.005, + "in98": 0.0425, + "in98_m1": 1.6, + "in99": 3.05, + "in100": 5.9, + "in101": 15.1, + "in102": 23.3, + "in103": 65.0, + "in103_m1": 34.0, + "in104": 108.0, + "in104_m1": 15.7, + "in105": 304.2, + "in105_m1": 48.0, + "in106": 372.0, + "in106_m1": 312.0, + "in107": 1944.0, + "in107_m1": 50.4, + "in108": 3480.0, + "in108_m1": 2376.0, + "in109": 15001.2, + "in109_m1": 80.4, + "in109_m2": 0.209, + "in110": 17640.0, + "in110_m1": 4146.0, + "in111": 242326.1, + "in111_m1": 462.0, + "in112": 898.2, + "in112_m1": 1233.6, + "in113_m1": 5968.56, + "in114": 71.9, + "in114_m1": 4277664.0, + "in114_m2": 0.0431, + "in115": 1.39169e22, + "in115_m1": 16149.6, + "in116": 14.1, + "in116_m1": 3257.4, + "in116_m2": 2.18, + "in117": 2592.0, + "in117_m1": 6972.0, + "in118": 5.0, + "in118_m1": 267.0, + "in118_m2": 8.5, + "in119": 144.0, + "in119_m1": 1080.0, + "in120": 3.08, + "in120_m1": 46.2, + "in120_m2": 47.3, + "in121": 23.1, + "in121_m1": 232.8, + "in122": 1.5, + "in122_m1": 10.3, + "in122_m2": 10.8, + "in123": 6.17, + "in123_m1": 47.4, + "in124": 3.12, + "in124_m1": 3.7, + "in125": 2.36, + "in125_m1": 12.2, + "in126": 1.53, + "in126_m1": 1.64, + "in127": 1.09, + "in127_m1": 3.67, + "in128": 0.84, + "in128_m1": 0.72, + "in129": 0.61, + "in129_m1": 1.23, + "in130": 0.29, + "in130_m1": 0.54, + "in130_m2": 0.54, + "in131": 0.28, + "in131_m1": 0.35, + "in131_m2": 0.32, + "in132": 0.207, + "in133": 0.165, + "in133_m1": 0.18, + "in134": 0.14, + "in135": 0.092, + "sn99": 0.005, + "sn100": 0.86, + "sn101": 1.7, + "sn102": 4.5, + "sn103": 7.0, + "sn104": 20.8, + "sn105": 34.0, + "sn106": 115.0, + "sn107": 174.0, + "sn108": 618.0, + "sn109": 1080.0, + "sn110": 14796.0, + "sn111": 2118.0, + "sn113": 9943776.0, + "sn113_m1": 1284.0, + "sn117_m1": 1175040.0, + "sn119_m1": 25315200.0, + "sn121": 97308.0, + "sn121_m1": 1385380000.0, + "sn123": 11162880.0, + "sn123_m1": 2403.6, + "sn125": 832896.0, + "sn125_m1": 571.2, + "sn126": 7258250000000.0, + "sn127": 7560.0, + "sn127_m1": 247.8, + "sn128": 3544.2, + "sn128_m1": 6.5, + "sn129": 133.8, + "sn129_m1": 414.0, + "sn130": 223.2, + "sn130_m1": 102.0, + "sn131": 56.0, + "sn131_m1": 58.4, + "sn132": 39.7, + "sn133": 1.46, + "sn134": 1.05, + "sn135": 0.53, + "sn136": 0.25, + "sn137": 0.19, + "sb103": 1.5e-06, + "sb104": 0.46, + "sb105": 1.22, + "sb106": 0.6, + "sb107": 4.0, + "sb108": 7.4, + "sb109": 17.0, + "sb110": 23.0, + "sb111": 75.0, + "sb112": 51.4, + "sb113": 400.2, + "sb114": 209.4, + "sb115": 1926.0, + "sb116": 948.0, + "sb116_m1": 3618.0, + "sb117": 10080.0, + "sb118": 216.0, + "sb118_m1": 18000.0, + "sb119": 137484.0, + "sb119_m1": 0.85, + "sb120": 953.4, + "sb120_m1": 497664.0, + "sb122": 235336.3, + "sb122_m1": 251.46, + "sb124": 5201280.0, + "sb124_m1": 93.0, + "sb124_m2": 1212.0, + "sb125": 87053530.0, + "sb126": 1067040.0, + "sb126_m1": 1149.0, + "sb126_m2": 11.0, + "sb127": 332640.0, + "sb128": 32436.0, + "sb128_m1": 624.0, + "sb129": 15840.0, + "sb129_m1": 1062.0, + "sb130": 2370.0, + "sb130_m1": 378.0, + "sb131": 1381.8, + "sb132": 167.4, + "sb132_m1": 246.0, + "sb133": 150.0, + "sb134": 0.78, + "sb134_m1": 10.07, + "sb135": 1.679, + "sb136": 0.923, + "sb137": 0.45, + "sb138": 0.168, + "sb139": 0.127, + "te105": 6.2e-07, + "te106": 6e-05, + "te107": 0.0031, + "te108": 2.1, + "te109": 4.6, + "te110": 18.6, + "te111": 19.3, + "te112": 120.0, + "te113": 102.0, + "te114": 912.0, + "te115": 348.0, + "te115_m1": 402.0, + "te116": 8964.0, + "te117": 3720.0, + "te117_m1": 0.103, + "te118": 518400.0, + "te119": 57780.0, + "te119_m1": 406080.0, + "te121": 1656288.0, + "te121_m1": 14186880.0, + "te123_m1": 10298880.0, + "te125_m1": 4959360.0, + "te127": 33660.0, + "te127_m1": 9417600.0, + "te128": 2.77707e26, + "te129": 4176.0, + "te129_m1": 2903040.0, + "te131": 1500.0, + "te131_m1": 119700.0, + "te132": 276825.6, + "te133": 750.0, + "te133_m1": 3324.0, + "te134": 2508.0, + "te135": 19.0, + "te136": 17.5, + "te137": 2.49, + "te138": 1.4, + "te139": 0.347, + "te140": 0.304, + "te141": 0.213, + "te142": 0.2, + "i108": 0.036, + "i109": 0.000103, + "i110": 0.65, + "i111": 2.5, + "i112": 3.42, + "i113": 6.6, + "i114": 2.1, + "i114_m1": 6.2, + "i115": 78.0, + "i116": 2.91, + "i117": 133.2, + "i118": 822.0, + "i118_m1": 510.0, + "i119": 1146.0, + "i120": 4896.0, + "i120_m1": 3180.0, + "i121": 7632.0, + "i122": 217.8, + "i123": 47604.24, + "i124": 360806.4, + "i125": 5132160.0, + "i126": 1117152.0, + "i128": 1499.4, + "i129": 495454000000000.0, + "i130": 44496.0, + "i130_m1": 530.4, + "i131": 693377.3, + "i132": 8262.0, + "i132_m1": 4993.2, + "i133": 74880.0, + "i133_m1": 9.0, + "i134": 3150.0, + "i134_m1": 211.2, + "i135": 23652.0, + "i136": 83.4, + "i136_m1": 46.9, + "i137": 24.5, + "i138": 6.23, + "i139": 2.28, + "i140": 0.86, + "i141": 0.43, + "i142": 0.222, + "i143": 0.296, + "i144": 0.194, + "i145": 0.127, + "xe110": 0.093, + "xe111": 0.81, + "xe112": 2.7, + "xe113": 2.74, + "xe114": 10.0, + "xe115": 18.0, + "xe116": 59.0, + "xe117": 61.0, + "xe118": 228.0, + "xe119": 348.0, + "xe120": 2400.0, + "xe121": 2406.0, + "xe122": 72360.0, + "xe123": 7488.0, + "xe125": 60840.0, + "xe125_m1": 56.9, + "xe127": 3144960.0, + "xe127_m1": 69.2, + "xe129_m1": 767232.0, + "xe131_m1": 1022976.0, + "xe132_m1": 0.00839, + "xe133": 452995.2, + "xe133_m1": 189216.0, + "xe134_m1": 0.29, + "xe135": 32904.0, + "xe135_m1": 917.4, + "xe137": 229.08, + "xe138": 844.8, + "xe139": 39.68, + "xe140": 13.6, + "xe141": 1.73, + "xe142": 1.23, + "xe143": 0.3, + "xe144": 1.15, + "xe145": 0.188, + "xe146": 0.369, + "xe147": 0.1, + "cs112": 0.0005, + "cs113": 1.67e-05, + "cs114": 0.57, + "cs115": 1.4, + "cs116": 0.7, + "cs116_m1": 3.85, + "cs117": 8.4, + "cs117_m1": 6.5, + "cs118": 14.0, + "cs118_m1": 17.0, + "cs119": 43.0, + "cs119_m1": 30.4, + "cs120": 61.3, + "cs120_m1": 57.0, + "cs121": 155.0, + "cs121_m1": 122.0, + "cs122": 21.18, + "cs122_m1": 0.36, + "cs122_m2": 222.0, + "cs123": 352.8, + "cs123_m1": 1.64, + "cs124": 30.8, + "cs124_m1": 6.3, + "cs125": 2802.0, + "cs125_m1": 0.0009, + "cs126": 98.4, + "cs127": 22500.0, + "cs128": 217.2, + "cs129": 115416.0, + "cs130": 1752.6, + "cs130_m1": 207.6, + "cs131": 837129.6, + "cs132": 559872.0, + "cs134": 65172760.0, + "cs134_m1": 10483.2, + "cs135": 72582500000000.0, + "cs135_m1": 3180.0, + "cs136": 1137024.0, + "cs136_m1": 19.0, + "cs137": 949252600.0, + "cs138": 2004.6, + "cs138_m1": 174.6, + "cs139": 556.2, + "cs140": 63.7, + "cs141": 24.84, + "cs142": 1.684, + "cs143": 1.791, + "cs144": 0.994, + "cs144_m1": 1.0, + "cs145": 0.587, + "cs146": 0.321, + "cs147": 0.23, + "cs148": 0.146, + "cs149": 0.05, + "cs150": 0.05, + "cs151": 0.05, + "ba114": 0.43, + "ba115": 0.45, + "ba116": 1.3, + "ba117": 1.75, + "ba118": 5.5, + "ba119": 5.4, + "ba120": 24.0, + "ba121": 29.7, + "ba122": 117.0, + "ba123": 162.0, + "ba124": 660.0, + "ba125": 210.0, + "ba126": 6000.0, + "ba127": 762.0, + "ba127_m1": 1.9, + "ba128": 209952.0, + "ba129": 8028.0, + "ba129_m1": 7776.0, + "ba130_m1": 0.0094, + "ba131": 993600.0, + "ba131_m1": 876.0, + "ba133": 331862400.0, + "ba133_m1": 140040.0, + "ba135_m1": 103320.0, + "ba136_m1": 0.3084, + "ba137_m1": 153.12, + "ba139": 4983.6, + "ba140": 1101833.0, + "ba141": 1096.2, + "ba142": 636.0, + "ba143": 14.5, + "ba144": 11.5, + "ba145": 4.31, + "ba146": 2.22, + "ba147": 0.894, + "ba148": 0.612, + "ba149": 0.344, + "ba150": 0.3, + "ba151": 0.259, + "ba152": 0.228, + "ba153": 0.158, + "la117": 0.0235, + "la117_m1": 0.01, + "la118": 1.0, + "la119": 2.0, + "la120": 2.8, + "la121": 5.3, + "la122": 8.6, + "la123": 17.0, + "la124": 29.21, + "la124_m1": 21.0, + "la125": 64.8, + "la125_m1": 0.4, + "la126": 54.0, + "la126_m1": 50.0, + "la127": 306.0, + "la127_m1": 222.0, + "la128": 310.8, + "la128_m1": 60.0, + "la129": 696.0, + "la129_m1": 0.56, + "la130": 522.0, + "la131": 3540.0, + "la132": 17280.0, + "la132_m1": 1458.0, + "la133": 14083.2, + "la134": 387.0, + "la135": 70200.0, + "la136": 592.2, + "la136_m1": 0.114, + "la137": 1893460000000.0, + "la138": 3.21888e18, + "la140": 145026.7, + "la141": 14112.0, + "la142": 5466.0, + "la143": 852.0, + "la144": 40.8, + "la145": 24.8, + "la146": 6.27, + "la146_m1": 10.0, + "la147": 4.06, + "la148": 1.26, + "la149": 1.05, + "la150": 0.86, + "la151": 0.778, + "la152": 0.451, + "la153": 0.342, + "la154": 0.228, + "la155": 0.184, + "ce119": 0.2, + "ce120": 0.25, + "ce121": 1.1, + "ce122": 2.73, + "ce123": 3.8, + "ce124": 6.0, + "ce125": 10.2, + "ce126": 51.0, + "ce127": 31.0, + "ce127_m1": 28.6, + "ce128": 235.8, + "ce129": 210.0, + "ce130": 1374.0, + "ce131": 618.0, + "ce131_m1": 324.0, + "ce132": 12636.0, + "ce132_m1": 0.0094, + "ce133": 5820.0, + "ce133_m1": 17640.0, + "ce134": 273024.0, + "ce135": 63720.0, + "ce135_m1": 20.0, + "ce137": 32400.0, + "ce137_m1": 123840.0, + "ce138_m1": 0.00865, + "ce139": 11892180.0, + "ce139_m1": 54.8, + "ce141": 2808691.0, + "ce143": 118940.4, + "ce144": 24616220.0, + "ce145": 180.6, + "ce146": 811.2, + "ce147": 56.4, + "ce148": 56.0, + "ce149": 5.3, + "ce150": 4.0, + "ce151": 1.76, + "ce152": 1.4, + "ce153": 0.979, + "ce154": 0.775, + "ce155": 0.471, + "ce156": 0.369, + "ce157": 0.2428, + "pr121": 1.4, + "pr122": 0.5, + "pr123": 0.8, + "pr124": 1.2, + "pr125": 3.3, + "pr126": 3.14, + "pr127": 4.2, + "pr128": 2.85, + "pr129": 32.0, + "pr130": 40.0, + "pr131": 90.6, + "pr131_m1": 5.73, + "pr132": 96.0, + "pr133": 390.0, + "pr134": 1020.0, + "pr134_m1": 660.0, + "pr135": 1440.0, + "pr136": 786.0, + "pr137": 4608.0, + "pr138": 87.0, + "pr138_m1": 7632.0, + "pr139": 15876.0, + "pr140": 203.4, + "pr142": 68832.0, + "pr142_m1": 876.0, + "pr143": 1172448.0, + "pr144": 1036.8, + "pr144_m1": 432.0, + "pr145": 21542.4, + "pr146": 1449.0, + "pr147": 804.0, + "pr148": 137.4, + "pr148_m1": 120.6, + "pr149": 135.6, + "pr150": 6.19, + "pr151": 18.9, + "pr152": 3.63, + "pr153": 4.28, + "pr154": 2.3, + "pr155": 0.852, + "pr156": 0.733, + "pr157": 0.598, + "pr158": 0.1342, + "pr159": 0.1055, + "nd124": 0.5, + "nd125": 0.6, + "nd126": 2e-07, + "nd127": 1.8, + "nd128": 5.0, + "nd129": 4.9, + "nd130": 21.0, + "nd131": 26.0, + "nd132": 94.0, + "nd133": 70.0, + "nd133_m1": 70.0, + "nd134": 510.0, + "nd135": 744.0, + "nd135_m1": 330.0, + "nd136": 3039.0, + "nd137": 2310.0, + "nd137_m1": 1.6, + "nd138": 18144.0, + "nd139": 1782.0, + "nd139_m1": 19800.0, + "nd140": 291168.0, + "nd141": 8964.0, + "nd141_m1": 62.0, + "nd144": 7.22669e22, + "nd147": 948672.0, + "nd149": 6220.8, + "nd150": 2.49305e26, + "nd151": 746.4, + "nd152": 684.0, + "nd153": 31.6, + "nd154": 25.9, + "nd155": 8.9, + "nd156": 5.49, + "nd157": 1.906, + "nd158": 1.331, + "nd159": 0.773, + "nd160": 0.5883, + "nd161": 0.4884, + "pm126": 0.5, + "pm127": 1.0, + "pm128": 1.0, + "pm129": 2.4, + "pm130": 2.6, + "pm131": 6.3, + "pm132": 6.2, + "pm133": 15.0, + "pm133_m1": 8.8, + "pm134": 5.0, + "pm134_m1": 22.0, + "pm135": 49.0, + "pm135_m1": 45.0, + "pm136": 47.0, + "pm136_m1": 107.0, + "pm137": 144.0, + "pm138": 10.0, + "pm138_m1": 194.4, + "pm139": 249.0, + "pm139_m1": 0.18, + "pm140": 357.0, + "pm140_m1": 357.0, + "pm141": 1254.0, + "pm142": 40.5, + "pm142_m1": 0.002, + "pm143": 22896000.0, + "pm144": 31363200.0, + "pm145": 558569500.0, + "pm146": 174513500.0, + "pm147": 82788210.0, + "pm148": 463795.2, + "pm148_m1": 3567456.0, + "pm149": 191088.0, + "pm150": 9648.0, + "pm151": 102240.0, + "pm152": 247.2, + "pm152_m1": 451.2, + "pm152_m2": 828.0, + "pm153": 315.0, + "pm154": 103.8, + "pm154_m1": 160.8, + "pm155": 41.5, + "pm156": 26.7, + "pm157": 10.56, + "pm158": 4.8, + "pm159": 1.47, + "pm160": 1.561, + "pm161": 1.065, + "pm162": 0.2679, + "pm163": 0.2, + "sm128": 0.5, + "sm129": 0.55, + "sm130": 1.0, + "sm131": 1.2, + "sm132": 4.0, + "sm133": 3.7, + "sm134": 9.5, + "sm135": 10.3, + "sm136": 47.0, + "sm137": 45.0, + "sm138": 186.0, + "sm139": 154.2, + "sm139_m1": 10.7, + "sm140": 889.2, + "sm141": 612.0, + "sm141_m1": 1356.0, + "sm142": 4349.4, + "sm143": 525.0, + "sm143_m1": 66.0, + "sm143_m2": 0.03, + "sm145": 29376000.0, + "sm146": 3250430000000000.0, + "sm147": 3.34511e18, + "sm148": 2.20903e23, + "sm151": 2840184000.0, + "sm153": 167400.0, + "sm153_m1": 0.0106, + "sm155": 1338.0, + "sm156": 33840.0, + "sm157": 482.0, + "sm158": 318.0, + "sm159": 11.37, + "sm160": 9.6, + "sm161": 4.8, + "sm162": 2.4, + "sm163": 1.748, + "sm164": 1.226, + "sm165": 0.764, + "eu130": 0.001, + "eu131": 0.0178, + "eu132": 0.1, + "eu133": 1.0, + "eu134": 0.5, + "eu135": 1.5, + "eu136": 3.8, + "eu136_m1": 3.3, + "eu136_m2": 3.8, + "eu137": 11.0, + "eu138": 12.1, + "eu139": 17.9, + "eu140": 1.51, + "eu140_m1": 0.125, + "eu141": 40.7, + "eu141_m1": 2.7, + "eu142": 2.34, + "eu142_m1": 73.38, + "eu143": 155.4, + "eu144": 10.2, + "eu145": 512352.0, + "eu146": 396576.0, + "eu147": 2082240.0, + "eu148": 4708800.0, + "eu149": 8043840.0, + "eu150": 1164480000.0, + "eu150_m1": 46080.0, + "eu152": 427195200.0, + "eu152_m1": 33521.76, + "eu152_m2": 5760.0, + "eu154": 271426900.0, + "eu154_m1": 2760.0, + "eu155": 149993300.0, + "eu156": 1312416.0, + "eu157": 54648.0, + "eu158": 2754.0, + "eu159": 1086.0, + "eu160": 38.0, + "eu161": 26.0, + "eu162": 10.6, + "eu163": 7.7, + "eu164": 2.844, + "eu165": 2.3, + "eu166": 0.4, + "eu167": 0.2, + "gd134": 0.4, + "gd135": 1.1, + "gd136": 2e-05, + "gd137": 2.2, + "gd138": 4.7, + "gd139": 5.8, + "gd139_m1": 4.8, + "gd140": 15.8, + "gd141": 14.0, + "gd141_m1": 24.5, + "gd142": 70.2, + "gd143": 39.0, + "gd143_m1": 110.0, + "gd144": 268.2, + "gd145": 1380.0, + "gd145_m1": 85.0, + "gd146": 4170528.0, + "gd147": 137016.0, + "gd148": 2354197000.0, + "gd149": 801792.0, + "gd150": 56488100000000.0, + "gd151": 10713600.0, + "gd152": 3.40822e21, + "gd153": 20770560.0, + "gd155_m1": 0.03197, + "gd159": 66524.4, + "gd161": 219.6, + "gd162": 504.0, + "gd163": 68.0, + "gd164": 45.0, + "gd165": 10.3, + "gd166": 4.8, + "gd167": 3.0, + "gd168": 0.3, + "gd169": 1.0, + "tb135": 0.995, + "tb136": 0.2, + "tb137": 0.6, + "tb138": 2e-07, + "tb139": 1.6, + "tb140": 2.4, + "tb141": 3.5, + "tb141_m1": 7.9, + "tb142": 0.597, + "tb142_m1": 0.303, + "tb143": 12.0, + "tb143_m1": 21.0, + "tb144": 1.0, + "tb144_m1": 4.25, + "tb145": 30.9, + "tb145_m1": 30.9, + "tb146": 8.0, + "tb146_m1": 23.0, + "tb146_m2": 0.00118, + "tb147": 5904.0, + "tb147_m1": 109.8, + "tb148": 3600.0, + "tb148_m1": 132.0, + "tb149": 14824.8, + "tb149_m1": 249.6, + "tb150": 12528.0, + "tb150_m1": 348.0, + "tb151": 63392.4, + "tb151_m1": 25.0, + "tb152": 63000.0, + "tb152_m1": 252.0, + "tb153": 202176.0, + "tb154": 77400.0, + "tb154_m1": 33840.0, + "tb154_m2": 81720.0, + "tb155": 459648.0, + "tb156": 462240.0, + "tb156_m1": 87840.0, + "tb156_m2": 19080.0, + "tb157": 2240590000.0, + "tb158": 5680368000.0, + "tb158_m1": 10.7, + "tb160": 6246720.0, + "tb161": 596678.4, + "tb162": 456.0, + "tb163": 1170.0, + "tb164": 180.0, + "tb165": 126.6, + "tb166": 25.1, + "tb167": 19.4, + "tb168": 8.2, + "tb169": 2.0, + "tb170": 3.0, + "tb171": 0.5, + "dy138": 0.2, + "dy139": 0.6, + "dy140": 0.84, + "dy141": 0.9, + "dy142": 2.3, + "dy143": 3.2, + "dy143_m1": 3.0, + "dy144": 9.1, + "dy145": 6.0, + "dy145_m1": 14.1, + "dy146": 29.0, + "dy146_m1": 0.15, + "dy147": 40.0, + "dy147_m1": 55.7, + "dy148": 198.0, + "dy149": 252.0, + "dy149_m1": 0.49, + "dy150": 430.2, + "dy151": 1074.0, + "dy152": 8568.0, + "dy153": 23040.0, + "dy154": 94672800000000.0, + "dy155": 35640.0, + "dy157": 29304.0, + "dy157_m1": 0.0216, + "dy159": 12476160.0, + "dy165": 8402.4, + "dy165_m1": 75.42, + "dy166": 293760.0, + "dy167": 372.0, + "dy168": 522.0, + "dy169": 39.0, + "dy170": 30.0, + "dy171": 6.0, + "dy172": 3.0, + "dy173": 2.0, + "ho140": 0.006, + "ho141": 0.0041, + "ho142": 0.4, + "ho143": 2e-07, + "ho144": 0.7, + "ho145": 2.4, + "ho146": 3.6, + "ho147": 5.8, + "ho148": 2.2, + "ho148_m1": 9.59, + "ho148_m2": 0.00236, + "ho149": 21.1, + "ho149_m1": 56.0, + "ho150": 72.0, + "ho150_m1": 23.3, + "ho151": 35.2, + "ho151_m1": 47.2, + "ho152": 161.8, + "ho152_m1": 50.0, + "ho153": 120.6, + "ho153_m1": 558.0, + "ho154": 705.6, + "ho154_m1": 186.0, + "ho155": 2880.0, + "ho155_m1": 0.00088, + "ho156": 3360.0, + "ho156_m1": 9.5, + "ho156_m2": 468.0, + "ho157": 756.0, + "ho158": 678.0, + "ho158_m1": 1680.0, + "ho158_m2": 1278.0, + "ho159": 1983.0, + "ho159_m1": 8.3, + "ho160": 1536.0, + "ho160_m1": 18072.0, + "ho160_m2": 3.0, + "ho161": 8928.0, + "ho161_m1": 6.76, + "ho162": 900.0, + "ho162_m1": 4020.0, + "ho163": 144218000000.0, + "ho163_m1": 1.09, + "ho164": 1740.0, + "ho164_m1": 2250.0, + "ho166": 96480.0, + "ho166_m1": 37869100000.0, + "ho167": 11160.0, + "ho168": 179.4, + "ho168_m1": 132.0, + "ho169": 283.2, + "ho170": 165.6, + "ho170_m1": 43.0, + "ho171": 53.0, + "ho172": 25.0, + "ho173": 10.0, + "ho174": 8.0, + "ho175": 5.0, + "er143": 0.2, + "er144": 2e-07, + "er146": 1.7, + "er147": 2.5, + "er147_m1": 2.5, + "er148": 4.6, + "er149": 4.0, + "er149_m1": 8.9, + "er150": 18.5, + "er151": 23.5, + "er151_m1": 0.58, + "er152": 10.3, + "er153": 37.1, + "er154": 223.8, + "er155": 318.0, + "er156": 1170.0, + "er157": 1119.0, + "er157_m1": 0.076, + "er158": 8244.0, + "er159": 2160.0, + "er160": 102888.0, + "er161": 11556.0, + "er163": 4500.0, + "er165": 37296.0, + "er167_m1": 2.269, + "er169": 811468.8, + "er171": 27057.6, + "er172": 177480.0, + "er173": 84.0, + "er174": 192.0, + "er175": 72.0, + "er176": 20.0, + "er177": 3.0, + "tm145": 3.1e-06, + "tm146": 0.08, + "tm146_m1": 0.2, + "tm147": 0.58, + "tm148": 0.7, + "tm149": 0.9, + "tm150": 2.2, + "tm150_m1": 0.0052, + "tm151": 4.17, + "tm151_m1": 4.51e-07, + "tm152": 8.0, + "tm152_m1": 5.2, + "tm153": 1.48, + "tm153_m1": 2.5, + "tm154": 8.1, + "tm154_m1": 3.3, + "tm155": 21.6, + "tm155_m1": 45.0, + "tm156": 83.8, + "tm157": 217.8, + "tm158": 238.8, + "tm159": 547.8, + "tm160": 564.0, + "tm160_m1": 74.5, + "tm161": 1812.0, + "tm162": 1302.0, + "tm162_m1": 24.3, + "tm163": 6516.0, + "tm164": 120.0, + "tm164_m1": 306.0, + "tm165": 108216.0, + "tm166": 27720.0, + "tm166_m1": 0.34, + "tm167": 799200.0, + "tm168": 8043840.0, + "tm170": 11111040.0, + "tm171": 60590590.0, + "tm172": 228960.0, + "tm173": 29664.0, + "tm174": 324.0, + "tm175": 912.0, + "tm176": 114.0, + "tm177": 90.0, + "tm178": 30.0, + "tm179": 20.0, + "yb148": 0.25, + "yb149": 0.7, + "yb150": 2e-07, + "yb151": 1.6, + "yb151_m1": 1.6, + "yb152": 3.04, + "yb153": 4.2, + "yb154": 0.409, + "yb155": 1.793, + "yb156": 26.1, + "yb157": 38.6, + "yb158": 89.4, + "yb159": 100.2, + "yb160": 288.0, + "yb161": 252.0, + "yb162": 1132.2, + "yb163": 663.0, + "yb164": 4548.0, + "yb165": 594.0, + "yb166": 204120.0, + "yb167": 1050.0, + "yb169": 2766355.0, + "yb169_m1": 46.0, + "yb171_m1": 0.00525, + "yb175": 361584.0, + "yb175_m1": 0.0682, + "yb176_m1": 11.4, + "yb177": 6879.6, + "yb177_m1": 6.41, + "yb178": 4440.0, + "yb179": 480.0, + "yb180": 144.0, + "yb181": 60.0, + "lu150": 0.043, + "lu151": 0.0806, + "lu152": 0.7, + "lu153": 0.9, + "lu153_m1": 1.0, + "lu154": 2.0, + "lu154_m1": 1.12, + "lu155": 0.068, + "lu155_m1": 0.138, + "lu155_m2": 0.00269, + "lu156": 0.494, + "lu156_m1": 0.198, + "lu157": 6.8, + "lu157_m1": 4.79, + "lu158": 10.6, + "lu159": 12.1, + "lu160": 36.1, + "lu160_m1": 40.0, + "lu161": 77.0, + "lu161_m1": 0.0073, + "lu162": 82.2, + "lu162_m1": 90.0, + "lu162_m2": 114.0, + "lu163": 238.2, + "lu164": 188.4, + "lu165": 644.4, + "lu166": 159.0, + "lu166_m1": 84.6, + "lu166_m2": 127.2, + "lu167": 3090.0, + "lu167_m1": 60.0, + "lu168": 330.0, + "lu168_m1": 402.0, + "lu169": 122616.0, + "lu169_m1": 160.0, + "lu170": 173836.8, + "lu170_m1": 0.67, + "lu171": 711936.0, + "lu171_m1": 79.0, + "lu172": 578880.0, + "lu172_m1": 222.0, + "lu173": 43233910.0, + "lu174": 104455700.0, + "lu174_m1": 12268800.0, + "lu176": 1.18657e18, + "lu176_m1": 13086.0, + "lu177": 574300.8, + "lu177_m1": 13862020.0, + "lu177_m2": 390.0, + "lu178": 1704.0, + "lu178_m1": 1386.0, + "lu179": 16524.0, + "lu179_m1": 0.0031, + "lu180": 342.0, + "lu180_m1": 0.001, + "lu181": 210.0, + "lu182": 120.0, + "lu183": 58.0, + "lu184": 20.0, + "hf153": 6e-06, + "hf154": 2.0, + "hf155": 0.89, + "hf156": 0.023, + "hf157": 0.11, + "hf158": 2.85, + "hf159": 5.6, + "hf160": 13.6, + "hf161": 18.2, + "hf162": 39.4, + "hf163": 40.0, + "hf164": 111.0, + "hf165": 76.0, + "hf166": 406.2, + "hf167": 123.0, + "hf168": 1557.0, + "hf169": 194.4, + "hf170": 57636.0, + "hf171": 43560.0, + "hf171_m1": 29.5, + "hf172": 59012710.0, + "hf173": 84960.0, + "hf174": 6.31152e22, + "hf175": 6048000.0, + "hf177_m1": 1.09, + "hf177_m2": 3084.0, + "hf178_m1": 4.0, + "hf178_m2": 978285600.0, + "hf179_m1": 18.67, + "hf179_m2": 2164320.0, + "hf180_m1": 19800.0, + "hf181": 3662496.0, + "hf182": 280863000000000.0, + "hf182_m1": 3690.0, + "hf183": 3841.2, + "hf184": 14832.0, + "hf184_m1": 48.0, + "hf185": 210.0, + "hf186": 156.0, + "hf187": 30.0, + "hf188": 20.0, + "ta155": 0.0031, + "ta156": 0.144, + "ta156_m1": 0.36, + "ta157": 0.0101, + "ta157_m1": 0.0043, + "ta157_m2": 0.0017, + "ta158": 0.055, + "ta158_m1": 0.0367, + "ta159": 0.83, + "ta159_m1": 0.515, + "ta160": 1.55, + "ta160_m1": 1.7, + "ta161": 2.89, + "ta162": 3.57, + "ta163": 10.6, + "ta164": 14.2, + "ta165": 31.0, + "ta166": 34.4, + "ta167": 80.0, + "ta168": 120.0, + "ta169": 294.0, + "ta170": 405.6, + "ta171": 1398.0, + "ta172": 2208.0, + "ta173": 11304.0, + "ta174": 4104.0, + "ta175": 37800.0, + "ta176": 29124.0, + "ta176_m1": 0.0011, + "ta176_m2": 0.00097, + "ta177": 203616.0, + "ta178": 558.6, + "ta178_m1": 8496.0, + "ta178_m2": 0.058, + "ta179": 57434830.0, + "ta179_m1": 0.009, + "ta179_m2": 0.0541, + "ta180": 29354.4, + "ta182": 9913536.0, + "ta182_m1": 0.283, + "ta182_m2": 950.4, + "ta183": 440640.0, + "ta184": 31320.0, + "ta185": 2964.0, + "ta185_m1": 0.002, + "ta186": 630.0, + "ta187": 120.0, + "ta188": 20.0, + "ta189": 3.0, + "ta190": 0.3, + "w158": 0.00125, + "w159": 0.0073, + "w160": 0.091, + "w161": 0.409, + "w162": 1.36, + "w163": 2.8, + "w164": 6.3, + "w165": 5.1, + "w166": 19.2, + "w167": 19.9, + "w168": 53.0, + "w169": 74.0, + "w170": 145.2, + "w171": 142.8, + "w172": 396.0, + "w173": 456.0, + "w174": 1992.0, + "w175": 2112.0, + "w176": 9000.0, + "w177": 7920.0, + "w178": 1866240.0, + "w179": 2223.0, + "w179_m1": 384.0, + "w180": 5.68037e25, + "w180_m1": 0.00547, + "w181": 10471680.0, + "w183_m1": 5.2, + "w185": 6488640.0, + "w185_m1": 100.2, + "w186": 5.36e27, + "w186_m1": 0.003, + "w187": 86400.0, + "w188": 6028992.0, + "w189": 642.0, + "w190": 1800.0, + "w190_m1": 0.0031, + "w191": 20.0, + "w192": 10.0, + "re160": 0.00085, + "re161": 0.00037, + "re161_m1": 0.0156, + "re162": 0.107, + "re162_m1": 0.077, + "re163": 0.39, + "re163_m1": 0.214, + "re164": 0.53, + "re164_m1": 0.87, + "re165": 1.0, + "re165_m1": 2.1, + "re166": 2.25, + "re167": 5.9, + "re167_m1": 3.4, + "re168": 4.4, + "re169": 8.1, + "re169_m1": 15.1, + "re170": 9.2, + "re171": 15.2, + "re172": 55.0, + "re172_m1": 15.0, + "re173": 118.8, + "re174": 144.0, + "re175": 353.4, + "re176": 318.0, + "re177": 840.0, + "re178": 792.0, + "re179": 1170.0, + "re180": 146.4, + "re181": 71640.0, + "re182": 230400.0, + "re182_m1": 45720.0, + "re183": 6048000.0, + "re183_m1": 0.00104, + "re184": 3058560.0, + "re184_m1": 14601600.0, + "re186": 321261.1, + "re186_m1": 6311520000000.0, + "re187": 1.36644e18, + "re188": 61214.4, + "re188_m1": 1115.4, + "re189": 87480.0, + "re190": 186.0, + "re190_m1": 11520.0, + "re191": 588.0, + "re192": 16.0, + "re193": 51.9, + "re194": 1.0, + "os162": 0.00205, + "os163": 0.0055, + "os164": 0.021, + "os165": 0.071, + "os166": 0.199, + "os167": 0.81, + "os168": 2.1, + "os169": 3.43, + "os170": 7.37, + "os171": 8.3, + "os172": 19.2, + "os173": 22.4, + "os174": 44.0, + "os175": 84.0, + "os176": 216.0, + "os177": 180.0, + "os178": 300.0, + "os179": 390.0, + "os180": 1290.0, + "os181": 6300.0, + "os181_m1": 162.0, + "os182": 78624.0, + "os183": 46800.0, + "os183_m1": 35640.0, + "os185": 8087040.0, + "os186": 6.31152e22, + "os189_m1": 20916.0, + "os190_m1": 594.0, + "os191": 1330560.0, + "os191_m1": 47160.0, + "os192_m1": 5.9, + "os193": 108396.0, + "os194": 189345600.0, + "os195": 540.0, + "os196": 2094.0, + "ir164": 0.14, + "ir164_m1": 9.5e-05, + "ir165": 1e-06, + "ir166": 0.0105, + "ir166_m1": 0.0151, + "ir167": 0.0352, + "ir167_m1": 0.0257, + "ir168": 0.232, + "ir168_m1": 0.16, + "ir169": 0.64, + "ir169_m1": 0.281, + "ir170": 0.9, + "ir170_m1": 0.811, + "ir171": 3.5, + "ir171_m1": 1.4, + "ir172": 4.4, + "ir172_m1": 2.0, + "ir173": 9.0, + "ir173_m1": 2.2, + "ir174": 7.9, + "ir174_m1": 4.9, + "ir175": 9.0, + "ir176": 8.7, + "ir177": 30.0, + "ir178": 12.0, + "ir179": 79.0, + "ir180": 90.0, + "ir181": 294.0, + "ir182": 900.0, + "ir183": 3480.0, + "ir184": 11124.0, + "ir185": 51840.0, + "ir186": 59904.0, + "ir186_m1": 6840.0, + "ir187": 37800.0, + "ir187_m1": 0.0303, + "ir188": 149400.0, + "ir188_m1": 0.0042, + "ir189": 1140480.0, + "ir189_m1": 0.0133, + "ir189_m2": 0.0037, + "ir190": 1017792.0, + "ir190_m1": 4032.0, + "ir190_m2": 11113.2, + "ir191_m1": 4.899, + "ir191_m2": 5.5, + "ir192": 6378653.0, + "ir192_m1": 87.0, + "ir192_m2": 7605382000.0, + "ir193_m1": 909792.0, + "ir194": 69408.0, + "ir194_m1": 0.03185, + "ir194_m2": 14774400.0, + "ir195": 9000.0, + "ir195_m1": 13680.0, + "ir196": 52.0, + "ir196_m1": 5040.0, + "ir197": 348.0, + "ir197_m1": 534.0, + "ir198": 8.0, + "ir199": 6.5, + "pt166": 0.0003, + "pt167": 0.00078, + "pt168": 0.002, + "pt169": 0.007, + "pt170": 0.014, + "pt171": 0.051, + "pt172": 0.096, + "pt173": 0.382, + "pt174": 0.889, + "pt175": 2.53, + "pt176": 6.33, + "pt177": 10.6, + "pt178": 21.1, + "pt179": 21.2, + "pt180": 56.0, + "pt181": 52.0, + "pt182": 180.0, + "pt183": 390.0, + "pt183_m1": 43.0, + "pt184": 1038.0, + "pt184_m1": 0.00101, + "pt185": 4254.0, + "pt185_m1": 1980.0, + "pt186": 7488.0, + "pt187": 8460.0, + "pt188": 881280.0, + "pt189": 39132.0, + "pt190": 2.05124e19, + "pt191": 242092.8, + "pt193": 1577880000.0, + "pt193_m1": 374112.0, + "pt195_m1": 346464.0, + "pt197": 71609.4, + "pt197_m1": 5724.6, + "pt199": 1848.0, + "pt199_m1": 13.6, + "pt200": 45360.0, + "pt201": 150.0, + "pt202": 158400.0, + "au169": 0.00015, + "au170": 0.000291, + "au170_m1": 0.00062, + "au171": 1.9e-05, + "au171_m1": 0.00102, + "au172": 0.0047, + "au173": 0.025, + "au173_m1": 0.014, + "au174": 0.139, + "au174_m1": 0.1629, + "au175": 0.1, + "au175_m1": 0.156, + "au176": 1.05, + "au176_m1": 1.36, + "au177": 1.462, + "au177_m1": 1.18, + "au178": 2.6, + "au179": 3.3, + "au180": 8.1, + "au181": 13.7, + "au182": 15.6, + "au183": 42.8, + "au184": 20.6, + "au184_m1": 47.6, + "au185": 255.0, + "au186": 642.0, + "au187": 504.0, + "au187_m1": 2.3, + "au188": 530.4, + "au189": 1722.0, + "au189_m1": 275.4, + "au190": 2568.0, + "au190_m1": 0.125, + "au191": 11448.0, + "au191_m1": 0.92, + "au192": 17784.0, + "au192_m1": 0.029, + "au192_m2": 0.16, + "au193": 63540.0, + "au193_m1": 3.9, + "au194": 136872.0, + "au194_m1": 0.6, + "au194_m2": 0.42, + "au195": 16078870.0, + "au195_m1": 30.5, + "au196": 532820.2, + "au196_m1": 8.1, + "au196_m2": 34560.0, + "au197_m1": 7.73, + "au198": 232822.1, + "au198_m1": 196300.8, + "au199": 271209.6, + "au200": 2904.0, + "au200_m1": 67320.0, + "au201": 1560.0, + "au202": 28.4, + "au203": 60.0, + "au204": 39.8, + "au205": 31.0, + "hg171": 6.9e-05, + "hg172": 0.000365, + "hg173": 0.0007, + "hg174": 0.0019, + "hg175": 0.0107, + "hg176": 0.0203, + "hg177": 0.1273, + "hg178": 0.269, + "hg179": 1.08, + "hg180": 2.58, + "hg181": 3.6, + "hg182": 10.83, + "hg183": 9.4, + "hg184": 30.9, + "hg185": 49.1, + "hg185_m1": 21.6, + "hg186": 82.8, + "hg187": 144.0, + "hg187_m1": 114.0, + "hg188": 195.0, + "hg189": 456.0, + "hg189_m1": 516.0, + "hg190": 1200.0, + "hg191": 2940.0, + "hg191_m1": 3048.0, + "hg192": 17460.0, + "hg193": 13680.0, + "hg193_m1": 42480.0, + "hg194": 14011600000.0, + "hg195": 37908.0, + "hg195_m1": 149760.0, + "hg197": 230904.0, + "hg197_m1": 85680.0, + "hg199_m1": 2560.2, + "hg203": 4025722.0, + "hg205": 308.4, + "hg205_m1": 0.00109, + "hg206": 499.2, + "hg207": 174.0, + "hg208": 2490.0, + "hg209": 36.5, + "hg210": 146.0, + "tl176": 0.006, + "tl177": 0.018, + "tl178": 0.06, + "tl179": 0.23, + "tl179_m1": 0.0017, + "tl180": 1.09, + "tl181": 3.2, + "tl181_m1": 0.0014, + "tl182": 3.1, + "tl183": 6.9, + "tl183_m1": 0.0533, + "tl184": 11.0, + "tl185": 19.5, + "tl185_m1": 1.93, + "tl186": 27.5, + "tl186_m1": 2.9, + "tl187": 51.0, + "tl187_m1": 15.6, + "tl188": 71.0, + "tl188_m1": 71.0, + "tl188_m2": 0.041, + "tl189": 138.0, + "tl189_m1": 84.0, + "tl190": 222.0, + "tl190_m1": 156.0, + "tl191": 1200.0, + "tl191_m1": 313.2, + "tl192": 576.0, + "tl192_m1": 648.0, + "tl193": 1296.0, + "tl193_m1": 126.6, + "tl194": 1980.0, + "tl194_m1": 1968.0, + "tl195": 4176.0, + "tl195_m1": 3.6, + "tl196": 6624.0, + "tl196_m1": 5076.0, + "tl197": 10224.0, + "tl197_m1": 0.54, + "tl198": 19080.0, + "tl198_m1": 6732.0, + "tl198_m2": 0.0321, + "tl199": 26712.0, + "tl199_m1": 0.0284, + "tl200": 93960.0, + "tl200_m1": 0.034, + "tl201": 262837.4, + "tl201_m1": 0.00201, + "tl202": 1063584.0, + "tl204": 119382400.0, + "tl206": 252.12, + "tl206_m1": 224.4, + "tl207": 286.2, + "tl207_m1": 1.33, + "tl208": 183.18, + "tl209": 132.0, + "tl210": 78.0, + "tl211": 60.0, + "tl212": 67.0, + "pb178": 0.00023, + "pb179": 0.003, + "pb180": 0.0045, + "pb181": 0.036, + "pb181_m1": 0.045, + "pb182": 0.0575, + "pb183": 0.535, + "pb183_m1": 0.415, + "pb184": 0.49, + "pb185": 6.3, + "pb185_m1": 4.3, + "pb186": 4.82, + "pb187": 15.2, + "pb187_m1": 18.3, + "pb188": 25.1, + "pb189": 39.0, + "pb189_m1": 50.0, + "pb190": 71.0, + "pb191": 79.8, + "pb191_m1": 130.8, + "pb192": 210.0, + "pb193": 120.0, + "pb193_m1": 348.0, + "pb194": 720.0, + "pb195": 900.0, + "pb195_m1": 900.0, + "pb196": 2220.0, + "pb197": 480.0, + "pb197_m1": 2580.0, + "pb198": 8640.0, + "pb199": 5400.0, + "pb199_m1": 732.0, + "pb200": 77400.0, + "pb201": 33588.0, + "pb201_m1": 60.8, + "pb202": 1656770000000.0, + "pb202_m1": 12744.0, + "pb203": 186912.0, + "pb203_m1": 6.21, + "pb203_m2": 0.48, + "pb204": 4.4e24, + "pb204_m1": 4015.8, + "pb205": 545946000000000.0, + "pb205_m1": 0.00555, + "pb207_m1": 0.806, + "pb209": 11710.8, + "pb210": 700578700.0, + "pb211": 2166.0, + "pb212": 38304.0, + "pb213": 612.0, + "pb214": 1608.0, + "pb215": 36.0, + "bi184": 0.013, + "bi184_m1": 0.0066, + "bi185": 5.8e-05, + "bi186": 0.015, + "bi186_m1": 0.0098, + "bi187": 0.032, + "bi187_m1": 0.00031, + "bi188": 0.06, + "bi188_m1": 0.265, + "bi189": 0.674, + "bi189_m1": 0.005, + "bi190": 6.3, + "bi190_m1": 6.2, + "bi191": 12.4, + "bi191_m1": 0.125, + "bi192": 34.6, + "bi192_m1": 39.6, + "bi193": 63.6, + "bi193_m1": 3.2, + "bi194": 95.0, + "bi194_m1": 125.0, + "bi194_m2": 115.0, + "bi195": 183.0, + "bi195_m1": 87.0, + "bi196": 308.0, + "bi196_m1": 0.6, + "bi196_m2": 240.0, + "bi197": 559.8, + "bi197_m1": 302.4, + "bi198": 618.0, + "bi198_m1": 696.0, + "bi198_m2": 7.7, + "bi199": 1620.0, + "bi199_m1": 1482.0, + "bi200": 2184.0, + "bi200_m1": 1860.0, + "bi200_m2": 0.4, + "bi201": 6180.0, + "bi201_m1": 3450.0, + "bi202": 6156.0, + "bi203": 42336.0, + "bi203_m1": 0.305, + "bi204": 40392.0, + "bi204_m1": 0.013, + "bi204_m2": 0.00107, + "bi205": 1322784.0, + "bi206": 539395.2, + "bi207": 995642300.0, + "bi208": 11613200000000.0, + "bi208_m1": 0.00258, + "bi209": 5.99594e26, + "bi210": 433036.8, + "bi210_m1": 95935100000000.0, + "bi211": 128.4, + "bi212": 3633.0, + "bi212_m1": 1500.0, + "bi212_m2": 420.0, + "bi213": 2735.4, + "bi214": 1194.0, + "bi215": 462.0, + "bi215_m1": 36.4, + "bi216": 135.0, + "bi217": 98.5, + "bi218": 33.0, + "po188": 0.000425, + "po189": 0.0035, + "po190": 0.00245, + "po191": 0.022, + "po191_m1": 0.093, + "po192": 0.0332, + "po193": 0.37, + "po193_m1": 0.373, + "po194": 0.392, + "po195": 4.64, + "po195_m1": 1.92, + "po196": 5.8, + "po197": 84.0, + "po197_m1": 32.0, + "po198": 106.2, + "po199": 328.2, + "po199_m1": 250.2, + "po200": 690.6, + "po201": 936.0, + "po201_m1": 537.6, + "po202": 2676.0, + "po203": 2202.0, + "po203_m1": 45.0, + "po204": 12708.0, + "po205": 6264.0, + "po205_m1": 0.000645, + "po205_m2": 0.0574, + "po206": 760320.0, + "po207": 20880.0, + "po207_m1": 2.79, + "po208": 91453920.0, + "po209": 3218880000.0, + "po210": 11955690.0, + "po211": 0.516, + "po211_m1": 25.2, + "po212": 2.99e-07, + "po212_m1": 45.1, + "po213": 4.2e-06, + "po214": 0.0001643, + "po215": 0.001781, + "po216": 0.145, + "po217": 1.53, + "po218": 185.88, + "po219": 3e-07, + "po220": 3e-07, + "at193": 0.0285, + "at194": 0.04, + "at194_m1": 0.25, + "at195": 0.328, + "at195_m1": 0.147, + "at196": 0.388, + "at196_m1": 1.1e-05, + "at197": 0.388, + "at197_m1": 2.0, + "at198": 4.2, + "at198_m1": 1.0, + "at199": 7.03, + "at200": 43.0, + "at200_m1": 47.0, + "at200_m2": 7.9, + "at201": 85.2, + "at202": 184.0, + "at202_m1": 182.0, + "at202_m2": 0.46, + "at203": 444.0, + "at204": 553.2, + "at204_m1": 0.108, + "at205": 1614.0, + "at206": 1836.0, + "at207": 6480.0, + "at208": 5868.0, + "at209": 19476.0, + "at210": 29160.0, + "at211": 25970.4, + "at212": 0.314, + "at212_m1": 0.119, + "at213": 1.25e-07, + "at214": 5.58e-07, + "at215": 0.0001, + "at216": 0.0003, + "at217": 0.0323, + "at218": 1.5, + "at219": 56.0, + "at220": 222.6, + "at221": 138.0, + "at222": 54.0, + "at223": 50.0, + "rn195": 0.0065, + "rn195_m1": 0.005, + "rn196": 0.0046, + "rn197": 0.066, + "rn197_m1": 0.021, + "rn198": 0.065, + "rn199": 0.59, + "rn199_m1": 0.31, + "rn200": 1.075, + "rn201": 7.0, + "rn201_m1": 3.8, + "rn202": 9.7, + "rn203": 44.0, + "rn203_m1": 26.9, + "rn204": 70.2, + "rn205": 170.0, + "rn206": 340.2, + "rn207": 555.0, + "rn208": 1461.0, + "rn209": 1728.0, + "rn210": 8640.0, + "rn211": 52560.0, + "rn212": 1434.0, + "rn213": 0.025, + "rn214": 2.7e-07, + "rn215": 2.3e-06, + "rn216": 4.5e-05, + "rn217": 0.00054, + "rn218": 0.035, + "rn219": 3.96, + "rn220": 55.6, + "rn221": 1542.0, + "rn222": 330350.4, + "rn223": 1458.0, + "rn224": 6420.0, + "rn225": 279.6, + "rn226": 444.0, + "rn227": 20.8, + "rn228": 65.0, + "fr199": 0.015, + "fr200": 0.049, + "fr201": 0.069, + "fr202": 0.3, + "fr202_m1": 0.29, + "fr203": 0.55, + "fr204": 1.7, + "fr204_m1": 2.6, + "fr204_m2": 1.0, + "fr205": 3.8, + "fr206": 16.0, + "fr206_m1": 16.0, + "fr206_m2": 0.7, + "fr207": 14.8, + "fr208": 59.1, + "fr209": 50.0, + "fr210": 190.8, + "fr211": 186.0, + "fr212": 1200.0, + "fr213": 34.82, + "fr214": 0.005, + "fr214_m1": 0.00335, + "fr215": 8.6e-08, + "fr216": 7e-07, + "fr217": 1.9e-05, + "fr218": 0.001, + "fr218_m1": 0.022, + "fr219": 0.02, + "fr220": 27.4, + "fr221": 294.0, + "fr222": 852.0, + "fr223": 1320.0, + "fr224": 199.8, + "fr225": 237.0, + "fr226": 49.0, + "fr227": 148.2, + "fr228": 38.0, + "fr229": 50.2, + "fr230": 19.1, + "fr231": 17.6, + "fr232": 5.5, + "ra202": 0.0275, + "ra203": 0.031, + "ra203_m1": 0.025, + "ra204": 0.0605, + "ra205": 0.22, + "ra205_m1": 0.18, + "ra206": 0.24, + "ra207": 1.3, + "ra207_m1": 0.055, + "ra208": 1.3, + "ra209": 4.6, + "ra210": 3.7, + "ra211": 13.0, + "ra212": 13.0, + "ra213": 163.8, + "ra213_m1": 0.0021, + "ra214": 2.46, + "ra215": 0.00155, + "ra216": 1.82e-07, + "ra217": 1.6e-06, + "ra218": 2.52e-05, + "ra219": 0.01, + "ra220": 0.018, + "ra221": 28.0, + "ra222": 36.17, + "ra223": 987552.0, + "ra224": 316224.0, + "ra225": 1287360.0, + "ra226": 50492200000.0, + "ra227": 2532.0, + "ra228": 181456200.0, + "ra229": 240.0, + "ra230": 5580.0, + "ra231": 103.0, + "ra232": 252.0, + "ra233": 30.0, + "ra234": 30.0, + "ac206": 0.024, + "ac206_m1": 0.0395, + "ac207": 0.027, + "ac208": 0.095, + "ac208_m1": 0.025, + "ac209": 0.098, + "ac210": 0.35, + "ac211": 0.21, + "ac212": 0.93, + "ac213": 0.8, + "ac214": 8.2, + "ac215": 0.17, + "ac216": 0.00044, + "ac216_m1": 0.000441, + "ac217": 6.9e-08, + "ac218": 1.08e-06, + "ac219": 1.18e-05, + "ac220": 0.0264, + "ac221": 0.052, + "ac222": 5.0, + "ac222_m1": 63.0, + "ac223": 126.0, + "ac224": 10008.0, + "ac225": 864000.0, + "ac226": 105732.0, + "ac227": 687072100.0, + "ac228": 22140.0, + "ac229": 3762.0, + "ac230": 122.0, + "ac231": 450.0, + "ac232": 119.0, + "ac233": 145.0, + "ac234": 44.0, + "ac235": 60.0, + "ac236": 120.0, + "th209": 0.0065, + "th210": 0.016, + "th211": 0.05, + "th212": 0.035, + "th213": 0.14, + "th214": 0.1, + "th215": 1.2, + "th216": 0.026, + "th217": 0.000251, + "th218": 1.17e-07, + "th219": 1.05e-06, + "th220": 9.7e-06, + "th221": 0.00173, + "th222": 0.002237, + "th223": 0.6, + "th224": 1.05, + "th225": 523.2, + "th226": 1834.2, + "th227": 1613952.0, + "th228": 60338130.0, + "th229": 231633000000.0, + "th230": 2378810000000.0, + "th231": 91872.0, + "th232": 4.43384e17, + "th233": 1338.0, + "th234": 2082240.0, + "th235": 426.0, + "th236": 2238.0, + "th237": 282.0, + "th238": 564.0, + "pa212": 0.0051, + "pa213": 0.0053, + "pa214": 0.017, + "pa215": 0.014, + "pa216": 0.16, + "pa217": 0.0036, + "pa217_m1": 0.0012, + "pa218": 0.000113, + "pa219": 5.3e-08, + "pa220": 7.8e-07, + "pa221": 5.9e-06, + "pa222": 0.0033, + "pa223": 0.0051, + "pa224": 0.79, + "pa225": 1.7, + "pa226": 108.0, + "pa227": 2298.0, + "pa228": 79200.0, + "pa229": 129600.0, + "pa230": 1503360.0, + "pa231": 1033830000000.0, + "pa232": 114048.0, + "pa233": 2330640.0, + "pa234": 24120.0, + "pa234_m1": 69.54, + "pa235": 1466.4, + "pa236": 546.0, + "pa237": 522.0, + "pa238": 136.2, + "pa239": 6480.0, + "pa240": 120.0, + "u217": 0.0235, + "u218": 0.000545, + "u219": 4.2e-05, + "u220": 6e-08, + "u222": 1.3e-06, + "u223": 1.8e-05, + "u224": 0.0009, + "u225": 0.084, + "u226": 0.35, + "u227": 66.0, + "u228": 546.0, + "u229": 3480.0, + "u230": 1797120.0, + "u231": 362880.0, + "u232": 2174319000.0, + "u233": 5023970000000.0, + "u234": 7747390000000.0, + "u235": 2.22102e16, + "u235_m1": 1560.0, + "u236": 739079000000000.0, + "u237": 583200.0, + "u238": 1.40999e17, + "u239": 1407.0, + "u240": 50760.0, + "u241": 300.0, + "u242": 1008.0, + "np225": 2e-06, + "np226": 0.035, + "np227": 0.51, + "np228": 61.4, + "np229": 240.0, + "np230": 276.0, + "np231": 2928.0, + "np232": 882.0, + "np233": 2172.0, + "np234": 380160.0, + "np235": 34231680.0, + "np236": 4828310000000.0, + "np236_m1": 81000.0, + "np237": 67659500000000.0, + "np238": 182908.8, + "np239": 203558.4, + "np240": 3714.0, + "np240_m1": 433.2, + "np241": 834.0, + "np242": 132.0, + "np242_m1": 330.0, + "np243": 111.0, + "np244": 137.4, + "pu228": 1.85, + "pu229": 112.0, + "pu230": 102.0, + "pu231": 516.0, + "pu232": 2028.0, + "pu233": 1254.0, + "pu234": 31680.0, + "pu235": 1518.0, + "pu236": 90191620.0, + "pu237": 3943296.0, + "pu237_m1": 0.18, + "pu238": 2767602000.0, + "pu239": 760854000000.0, + "pu240": 207049000000.0, + "pu241": 450958100.0, + "pu242": 11786800000000.0, + "pu243": 17841.6, + "pu244": 2559320000000000.0, + "pu245": 37800.0, + "pu246": 936576.0, + "pu247": 196128.0, + "am231": 10.0, + "am232": 79.0, + "am233": 192.0, + "am234": 139.2, + "am235": 618.0, + "am236": 216.0, + "am237": 4416.0, + "am238": 5880.0, + "am239": 42840.0, + "am240": 182880.0, + "am241": 13651800000.0, + "am242": 57672.0, + "am242_m1": 4449622000.0, + "am242_m2": 0.014, + "am243": 232580000000.0, + "am244": 36360.0, + "am244_m1": 1560.0, + "am245": 7380.0, + "am246": 2340.0, + "am246_m1": 1500.0, + "am247": 1380.0, + "am248": 600.0, + "am249": 120.0, + "cm233": 17.7, + "cm234": 51.0, + "cm235": 300.0, + "cm236": 1900.0, + "cm237": 1200.0, + "cm238": 8640.0, + "cm239": 10440.0, + "cm240": 2332800.0, + "cm241": 2833920.0, + "cm242": 14078020.0, + "cm243": 918326200.0, + "cm244": 571508100.0, + "cm244_m1": 5e-07, + "cm245": 268240000000.0, + "cm246": 150214000000.0, + "cm247": 492299000000000.0, + "cm248": 10982000000000.0, + "cm249": 3849.0, + "cm250": 261928000000.0, + "cm251": 1008.0, + "bk235": 20.0, + "bk237": 60.0, + "bk238": 144.0, + "bk240": 288.0, + "bk241": 276.0, + "bk242": 420.0, + "bk243": 16200.0, + "bk244": 15660.0, + "bk245": 426816.0, + "bk246": 155520.0, + "bk247": 43549500000.0, + "bk248": 283824000.0, + "bk248_m1": 85320.0, + "bk249": 27648000.0, + "bk250": 11563.2, + "bk251": 3336.0, + "bk253": 600.0, + "bk254": 120.0, + "cf237": 2.1, + "cf238": 0.021, + "cf239": 51.5, + "cf240": 57.6, + "cf241": 226.8, + "cf242": 222.0, + "cf243": 642.0, + "cf244": 1164.0, + "cf245": 2700.0, + "cf246": 128520.0, + "cf247": 11196.0, + "cf248": 28814400.0, + "cf249": 11076700000.0, + "cf250": 412773400.0, + "cf251": 28338700000.0, + "cf252": 83468070.0, + "cf253": 1538784.0, + "cf254": 5227200.0, + "cf255": 5100.0, + "cf256": 738.0, + "es240": 1.0, + "es241": 8.5, + "es242": 13.5, + "es243": 21.0, + "es244": 37.0, + "es245": 66.0, + "es246": 462.0, + "es247": 273.0, + "es247_m1": 54000000.0, + "es248": 1620.0, + "es249": 6132.0, + "es250": 30960.0, + "es250_m1": 7992.0, + "es251": 118800.0, + "es252": 40754880.0, + "es253": 1768608.0, + "es254": 23820480.0, + "es254_m1": 141479.9, + "es255": 3438720.0, + "es256": 1524.0, + "es256_m1": 27360.0, + "es257": 665280.0, + "es258": 180.0, + "fm242": 0.0008, + "fm243": 0.2, + "fm244": 0.0033, + "fm245": 4.2, + "fm246": 1.1, + "fm247": 29.0, + "fm248": 36.0, + "fm249": 156.0, + "fm250": 1800.0, + "fm250_m1": 1.8, + "fm251": 19080.0, + "fm252": 91404.0, + "fm253": 259200.0, + "fm254": 11664.0, + "fm255": 72252.0, + "fm256": 9456.0, + "fm257": 8683200.0, + "fm258": 0.00037, + "fm259": 1.5, + "fm260": 0.004, + "md245": 0.0009, + "md245_m1": 0.39, + "md246": 0.9, + "md247": 1.12, + "md247_m1": 0.26, + "md248": 7.0, + "md249": 24.0, + "md249_m1": 1.9, + "md250": 27.5, + "md251": 240.0, + "md252": 138.0, + "md253": 630.0, + "md254": 1680.0, + "md254_m1": 1680.0, + "md255": 1620.0, + "md256": 4620.0, + "md257": 19872.0, + "md258": 4449600.0, + "md258_m1": 3420.0, + "md259": 5760.0, + "md260": 2747520.0, + "md261": 2400.0, + "no250": 4.35e-06, + "no251": 0.8, + "no251_m1": 1.02, + "no252": 2.44, + "no253": 97.2, + "no254": 51.0, + "no254_m1": 0.28, + "no255": 186.0, + "no256": 2.91, + "no257": 25.0, + "no258": 0.0012, + "no259": 3480.0, + "no260": 0.106, + "no261": 160000.0, + "no262": 0.005, + "lr251": 1.341, + "lr252": 0.38, + "lr253": 0.575, + "lr253_m1": 1.535, + "lr254": 13.0, + "lr255": 22.0, + "lr255_m1": 2.53, + "lr256": 27.0, + "lr257": 0.646, + "lr258": 4.1, + "lr259": 6.2, + "lr260": 180.0, + "lr261": 2340.0, + "lr262": 14400.0, + "lr263": 18000.0, + "rf253": 5.15e-05, + "rf254": 2.3e-05, + "rf255": 1.68, + "rf256": 0.0064, + "rf257": 4.7, + "rf257_m1": 3.9, + "rf258": 0.012, + "rf259": 3.2, + "rf260": 0.021, + "rf261": 65.0, + "rf261_m1": 81.0, + "rf262": 2.3, + "rf263": 600.0, + "rf264": 3600.0, + "rf265": 1.0, + "db255": 1.7, + "db256": 1.7, + "db257": 1.52, + "db257_m1": 0.78, + "db258": 4.0, + "db258_m1": 20.0, + "db259": 0.51, + "db260": 1.52, + "db261": 1.8, + "db262": 35.0, + "db263": 28.5, + "db264": 180.0, + "db265": 900.0, + "sg258": 0.0032, + "sg259": 0.555, + "sg260": 0.0036, + "sg261": 0.23, + "sg262": 0.0079, + "sg263": 1.0, + "sg263_m1": 0.12, + "sg264": 0.045, + "sg265": 8.0, + "sg266": 25.0, + "sg269": 50.0, + "bh260": 0.0003, + "bh261": 0.013, + "bh262": 0.102, + "bh262_m1": 0.022, + "bh263": 0.0002, + "bh264": 0.66, + "bh265": 1.1, + "bh266": 5.4, + "bh267": 21.0, + "bh269": 50.0, + "hs263": 0.00355, + "hs264": 0.0008, + "hs265": 0.00205, + "hs265_m1": 0.0003, + "hs266": 0.00265, + "hs267": 0.0545, + "hs268": 1.2, + "hs269": 12.9, + "hs273": 50.0, + "mt265": 120.0, + "mt266": 0.0018, + "mt266_m1": 0.0017, + "mt267": 0.01, + "mt268": 0.0225, + "mt269": 0.05, + "mt270": 0.00605, + "mt271": 5.0, + "mt273": 20.0, + "ds267": 2.8e-06, + "ds268": 0.0001, + "ds269": 0.000268, + "ds270": 0.00015, + "ds270_m1": 0.009, + "ds271": 0.001705, + "ds271_m1": 0.0865, + "ds272": 1.0, + "ds273": 0.000225, + "ds279_m1": 0.19, + "rg272": 0.0041 +} diff --git a/openmc/deplete/operator.py b/openmc/deplete/operator.py index 327c762e0..7ef874e87 100644 --- a/openmc/deplete/operator.py +++ b/openmc/deplete/operator.py @@ -528,9 +528,9 @@ class Operator(TransportOperator): """ mat_id = str(mat.id) - for nuclide, density in mat.get_nuclide_atom_densities().values(): - number = density * 1.0e24 - self.number.set_atom_density(mat_id, nuclide, number) + for nuclide, atom_per_bcm in mat.get_nuclide_atom_densities().items(): + atom_per_cc = atom_per_bcm * 1.0e24 + self.number.set_atom_density(mat_id, nuclide, atom_per_cc) def _set_number_from_results(self, mat, prev_res): """Extracts material nuclides and number densities. @@ -556,16 +556,15 @@ class Operator(TransportOperator): # Merge lists of nuclides, with the same order for every calculation geom_nuc_densities.update(depl_nuc) - for nuclide in geom_nuc_densities.keys(): + for nuclide, atom_per_bcm in geom_nuc_densities.items(): if nuclide in depl_nuc: concentration = prev_res.get_atoms(mat_id, nuclide)[1][-1] volume = prev_res[-1].volume[mat_id] - number = concentration / volume + atom_per_cc = concentration / volume else: - density = geom_nuc_densities[nuclide][1] - number = density * 1.0e24 + atom_per_cc = atom_per_bcm * 1.0e24 - self.number.set_atom_density(mat_id, nuclide, number) + self.number.set_atom_density(mat_id, nuclide, atom_per_cc) def initial_condition(self): """Performs final setup and returns initial condition. diff --git a/openmc/material.py b/openmc/material.py index de1b2187b..a837b1f17 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -3,10 +3,14 @@ from collections.abc import Iterable from copy import deepcopy from numbers import Real from pathlib import Path +import os import re +import typing # imported separately as py3.8 requires typing.Iterable import warnings +from typing import Optional, Union from xml.etree import ElementTree as ET +import h5py import numpy as np import openmc @@ -85,6 +89,9 @@ class Material(IDManagerMixin): fissionable_mass : float Mass of fissionable nuclides in the material in [g]. Requires that the :attr:`volume` attribute is set. + activity : float + Activity of the material in [Bq]. Requires that the :attr:`volume` + attribute is set. """ @@ -141,6 +148,11 @@ class Material(IDManagerMixin): return string + @property + def activity(self): + """Returns the total activity of the material in Becquerels.""" + return sum(self.get_nuclide_activity().values()) + @property def name(self): return self._name @@ -206,7 +218,7 @@ class Material(IDManagerMixin): return self._volume @name.setter - def name(self, name): + def name(self, name: Optional[str]): if name is not None: cv.check_type(f'name for Material ID="{self._id}"', name, str) @@ -215,25 +227,25 @@ class Material(IDManagerMixin): self._name = '' @temperature.setter - def temperature(self, temperature): + def temperature(self, temperature: Optional[Real]): cv.check_type(f'Temperature for Material ID="{self._id}"', temperature, (Real, type(None))) self._temperature = temperature @depletable.setter - def depletable(self, depletable): + def depletable(self, depletable: bool): cv.check_type(f'Depletable flag for Material ID="{self._id}"', depletable, bool) self._depletable = depletable @volume.setter - def volume(self, volume): + def volume(self, volume: Real): if volume is not None: cv.check_type('material volume', volume, Real) self._volume = volume @isotropic.setter - def isotropic(self, isotropic): + def isotropic(self, isotropic: typing.Iterable[str]): cv.check_iterable_type('Isotropic scattering nuclides', isotropic, str) self._isotropic = list(isotropic) @@ -243,15 +255,15 @@ class Material(IDManagerMixin): if self.volume is None: raise ValueError("Volume must be set in order to determine mass.") density = 0.0 - for nuc, atoms_per_cc in self.get_nuclide_atom_densities().values(): + for nuc, atoms_per_bcm in self.get_nuclide_atom_densities().items(): Z = openmc.data.zam(nuc)[0] if Z >= 90: - density += 1e24 * atoms_per_cc * openmc.data.atomic_mass(nuc) \ + density += 1e24 * atoms_per_bcm * openmc.data.atomic_mass(nuc) \ / openmc.data.AVOGADRO return density*self.volume @classmethod - def from_hdf5(cls, group): + def from_hdf5(cls, group: h5py.Group): """Create material from HDF5 group Parameters @@ -325,7 +337,7 @@ class Material(IDManagerMixin): raise ValueError('No volume information found for material ID={}.' .format(self.id)) - def set_density(self, units, density=None): + def set_density(self, units: str, density: Optional[float] = None): """Set the density of the material Parameters @@ -357,7 +369,7 @@ class Material(IDManagerMixin): density, Real) self._density = density - def add_nuclide(self, nuclide, percent, percent_type='ao'): + def add_nuclide(self, nuclide: str, percent: float, percent_type: str = 'ao'): """Add a nuclide to the material Parameters @@ -391,7 +403,7 @@ class Material(IDManagerMixin): self._nuclides.append(NuclideTuple(nuclide, percent, percent_type)) - def remove_nuclide(self, nuclide): + def remove_nuclide(self, nuclide: str): """Remove a nuclide from the material Parameters @@ -407,7 +419,24 @@ class Material(IDManagerMixin): if nuclide == nuc.name: self.nuclides.remove(nuc) - def add_macroscopic(self, macroscopic): + def remove_element(self, element): + """Remove an element from the material + + Parameters + ---------- + element : str + Element to remove + + """ + cv.check_type('element', element, str) + + # If the Material contains the element, delete it + for nuc in reversed(self.nuclides): + element_name = re.split(r'\d+', nuc.name)[0] + if element_name == element: + self.nuclides.remove(nuc) + + def add_macroscopic(self, macroscopic: str): """Add a macroscopic to the material. This will also set the density of the material to 1.0, unless it has been otherwise set, as a default for Macroscopic cross sections. @@ -449,7 +478,7 @@ class Material(IDManagerMixin): if self._density is None: self.set_density('macro', 1.0) - def remove_macroscopic(self, macroscopic): + def remove_macroscopic(self, macroscopic: str): """Remove a macroscopic from the material Parameters @@ -468,8 +497,10 @@ class Material(IDManagerMixin): if macroscopic == self._macroscopic: self._macroscopic = None - def add_element(self, element, percent, percent_type='ao', enrichment=None, - enrichment_target=None, enrichment_type=None): + def add_element(self, element: str, percent: float, percent_type: str = 'ao', + enrichment: Optional[float] = None, + enrichment_target: Optional[str] = None, + enrichment_type: Optional[str] = None): """Add a natural element to the material Parameters @@ -574,8 +605,10 @@ class Material(IDManagerMixin): enrichment_type): self.add_nuclide(*nuclide) - def add_elements_from_formula(self, formula, percent_type='ao', enrichment=None, - enrichment_target=None, enrichment_type=None): + def add_elements_from_formula(self, formula: str, percent_type: str = 'ao', + enrichment: Optional[float] = None, + enrichment_target: Optional[str] = None, + enrichment_type: Optional[str] = None): """Add a elements from a chemical formula to the material. .. versionadded:: 0.12 @@ -672,7 +705,7 @@ class Material(IDManagerMixin): else: self.add_element(element, percent, percent_type) - def add_s_alpha_beta(self, name, fraction=1.0): + def add_s_alpha_beta(self, name: str, fraction: float = 1.0): r"""Add an :math:`S(\alpha,\beta)` table to the material Parameters @@ -753,11 +786,15 @@ class Material(IDManagerMixin): """Returns all nuclides in the material and their atomic densities in units of atom/b-cm + .. versionchanged:: 0.13.1 + The values in the dictionary were changed from a tuple containing + the nuclide name and the density to just the density. + Returns ------- nuclides : dict - Dictionary whose keys are nuclide names and values are tuples of - (nuclide, density in atom/b-cm) + Dictionary whose keys are nuclide names and values are densities in + [atom/b-cm] """ @@ -817,11 +854,47 @@ class Material(IDManagerMixin): nuclides = OrderedDict() for n, nuc in enumerate(nucs): - nuclides[nuc] = (nuc, nuc_densities[n]) + nuclides[nuc] = nuc_densities[n] return nuclides - def get_mass_density(self, nuclide=None): + def get_nuclide_activity(self): + """Return activity in [Bq] for each nuclide in the material + + .. versionadded:: 0.13.1 + + Returns + ------- + dict + Dictionary whose keys are nuclide names and values are activity in + [Bq]. + """ + activity = {} + for nuclide, atoms in self.get_nuclide_atoms().items(): + inv_seconds = openmc.data.decay_constant(nuclide) + activity[nuclide] = inv_seconds * atoms + return activity + + def get_nuclide_atoms(self): + """Return number of atoms of each nuclide in the material + + .. versionadded:: 0.13.1 + + Returns + ------- + dict + Dictionary whose keys are nuclide names and values are number of + atoms present in the material. + + """ + if self.volume is None: + raise ValueError("Volume must be set in order to determine atoms.") + atoms = {} + for nuclide, atom_per_bcm in self.get_nuclide_atom_densities().items(): + atoms[nuclide] = 1.0e24 * atom_per_bcm * self.volume + return atoms + + def get_mass_density(self, nuclide: Optional[str] = None): """Return mass density of one or all nuclides Parameters @@ -837,14 +910,14 @@ class Material(IDManagerMixin): """ mass_density = 0.0 - for nuc, atoms_per_cc in self.get_nuclide_atom_densities().values(): + for nuc, atoms_per_bcm in self.get_nuclide_atom_densities().items(): if nuclide is None or nuclide == nuc: - density_i = 1e24 * atoms_per_cc * openmc.data.atomic_mass(nuc) \ + density_i = 1e24 * atoms_per_bcm * openmc.data.atomic_mass(nuc) \ / openmc.data.AVOGADRO mass_density += density_i return mass_density - def get_mass(self, nuclide=None): + def get_mass(self, nuclide: Optional[str] = None): """Return mass of one or all nuclides. Note that this method requires that the :attr:`Material.volume` has @@ -866,7 +939,7 @@ class Material(IDManagerMixin): raise ValueError("Volume must be set in order to determine mass.") return self.volume*self.get_mass_density(nuclide) - def clone(self, memo=None): + def clone(self, memo: Optional[dict] = None): """Create a copy of this material with a new unique ID. Parameters @@ -905,7 +978,7 @@ class Material(IDManagerMixin): return memo[self] - def _get_nuclide_xml(self, nuclide): + def _get_nuclide_xml(self, nuclide: str): xml_element = ET.Element("nuclide") xml_element.set("name", nuclide.name) @@ -916,13 +989,13 @@ class Material(IDManagerMixin): return xml_element - def _get_macroscopic_xml(self, macroscopic): + def _get_macroscopic_xml(self, macroscopic: str): xml_element = ET.Element("macroscopic") xml_element.set("name", macroscopic) return xml_element - def _get_nuclides_xml(self, nuclides): + def _get_nuclides_xml(self, nuclides: typing.Iterable[str]): xml_elements = [] for nuclide in nuclides: xml_elements.append(self._get_nuclide_xml(nuclide)) @@ -989,7 +1062,8 @@ class Material(IDManagerMixin): return element @classmethod - def mix_materials(cls, materials, fracs, percent_type='ao', name=None): + def mix_materials(cls, materials, fracs: typing.Iterable[float], + percent_type: str = 'ao', name: Optional[str] = None): """Mix materials together based on atom, weight, or volume fractions .. versionadded:: 0.12 @@ -1059,7 +1133,7 @@ class Material(IDManagerMixin): nuclides_per_cc = defaultdict(float) mass_per_cc = defaultdict(float) for mat, wgt in zip(materials, wgts): - for nuc, atoms_per_bcm in mat.get_nuclide_atom_densities().values(): + for nuc, atoms_per_bcm in mat.get_nuclide_atom_densities().items(): nuc_per_cc = wgt*1.e24*atoms_per_bcm nuclides_per_cc[nuc] += nuc_per_cc mass_per_cc[nuc] += nuc_per_cc*openmc.data.atomic_mass(nuc) / \ @@ -1087,7 +1161,7 @@ class Material(IDManagerMixin): return new_mat @classmethod - def from_xml_element(cls, elem): + def from_xml_element(cls, elem: ET.Element): """Generate material from an XML element Parameters @@ -1201,7 +1275,7 @@ class Materials(cv.CheckedList): """ super().append(material) - def insert(self, index, material): + def insert(self, index: int, material): """Insert material before index Parameters @@ -1218,7 +1292,7 @@ class Materials(cv.CheckedList): for material in self: material.make_isotropic_in_lab() - def export_to_xml(self, path='materials.xml'): + def export_to_xml(self, path: Union[str, os.PathLike] = 'materials.xml'): """Export material collection to an XML file. Parameters @@ -1265,12 +1339,12 @@ class Materials(cv.CheckedList): fh.write('\n') @classmethod - def from_xml(cls, path='materials.xml'): + def from_xml(cls, path: Union[str, os.PathLike] = 'materials.xml'): """Generate materials collection from XML file Parameters ---------- - path : str, optional + path : str Path to materials XML file Returns diff --git a/openmc/mesh.py b/openmc/mesh.py index 7f7b07879..1fe5429d0 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -193,6 +193,81 @@ class StructuredMesh(MeshBase): s1 = (slice(1, None),)*ndim + (slice(None),) return (vertices[s0] + vertices[s1]) / 2 + @property + def num_mesh_cells(self): + return np.prod(self.dimension) + + def write_data_to_vtk(self, points, filename, datasets, volume_normalization=True): + """Creates a VTK object of the mesh + + Parameters + ---------- + points : list or np.array + List of (X,Y,Z) tuples. + filename : str + Name of the VTK file to write. + datasets : dict + Dictionary whose keys are the data labels + and values are the data sets. + volume_normalization : bool, optional + Whether or not to normalize the data by + the volume of the mesh elements. + + Raises + ------ + RuntimeError + When the size of a dataset doesn't match the number of cells + + Returns + ------- + vtk.vtkStructuredGrid + the VTK object + """ + + import vtk + from vtk.util import numpy_support as nps + + # check that the data sets are appropriately sized + errmsg = "The size of the dataset {} should be equal to the number of cells" + for label, dataset in datasets.items(): + if isinstance(dataset, np.ndarray): + if not dataset.size == self.dimension[0] * self.dimension[1]* self.dimension[2]: + raise RuntimeError(errmsg.format(label)) + else: + if len(dataset) == self.dimension[0] * self.dimension[1]* self.dimension[2]: + raise RuntimeError(errmsg.format(label)) + cv.check_type('label', label, str) + + vtk_grid = vtk.vtkStructuredGrid() + + vtk_grid.SetDimensions(*[dim + 1 for dim in self.dimension]) + + vtkPts = vtk.vtkPoints() + vtkPts.SetData(nps.numpy_to_vtk(points, deep=True)) + vtk_grid.SetPoints(vtkPts) + + # create VTK arrays for each of + # the data sets + for label, dataset in datasets.items(): + dataset = np.asarray(dataset).flatten() + + if volume_normalization: + dataset /= self.volumes.flatten() + + dataset_array = vtk.vtkDoubleArray() + dataset_array.SetName(label) + dataset_array.SetArray(nps.numpy_to_vtk(dataset), + dataset.size, + True) + vtk_grid.GetCellData().AddArray(dataset_array) + + # write the .vtk file + writer = vtk.vtkStructuredGridWriter() + writer.SetFileName(str(filename)) + writer.SetInputData(vtk_grid) + writer.Write() + + return vtk_grid class RegularMesh(StructuredMesh): """A regular Cartesian mesh in one, two, or three dimensions @@ -273,10 +348,6 @@ class RegularMesh(StructuredMesh): dims = self._dimension return [(u - l) / d for u, l, d in zip(us, ls, dims)] - @property - def num_mesh_cells(self): - return np.prod(self._dimension) - @property def volumes(self): """Return Volumes for every mesh cell @@ -621,7 +692,42 @@ class RegularMesh(StructuredMesh): root_cell.fill = lattice return root_cell, cells + + def write_data_to_vtk(self, filename, datasets, volume_normalization=True): + """Creates a VTK object of the mesh + Parameters + ---------- + filename : str or pathlib.Path + Name of the VTK file to write. + datasets : dict + Dictionary whose keys are the data labels + and values are the data sets. + volume_normalization : bool, optional + Whether or not to normalize the data by + the volume of the mesh elements. + Defaults to True. + + Returns + ------- + vtk.vtkStructuredGrid + the VTK object + """ + + ll, ur = self.lower_left, self.upper_right + x_vals = np.linspace(ll[0], ur[0], num=self.dimension[0] + 1) + y_vals = np.linspace(ll[1], ur[1], num=self.dimension[1] + 1) + z_vals = np.linspace(ll[2], ur[2], num=self.dimension[2] + 1) + + # create points + pts_cartesian = np.array([[x, y, z] for z in z_vals for y in y_vals for x in x_vals]) + + return super().write_data_to_vtk( + points=pts_cartesian, + filename=filename, + datasets=datasets, + volume_normalization=volume_normalization + ) def Mesh(*args, **kwargs): warnings.warn("Mesh has been renamed RegularMesh. Future versions of " @@ -821,6 +927,36 @@ class RectilinearMesh(StructuredMesh): return element + def write_data_to_vtk(self, filename, datasets, volume_normalization=True): + """Creates a VTK object of the mesh + + Parameters + ---------- + filename : str or pathlib.Path + Name of the VTK file to write. + datasets : dict + Dictionary whose keys are the data labels + and values are the data sets. + volume_normalization : bool, optional + Whether or not to normalize the data by + the volume of the mesh elements. + Defaults to True. + + Returns + ------- + vtk.vtkStructuredGrid + the VTK object + """ + # create points + pts_cartesian = np.array([[x, y, z] for z in self.z_grid for y in self.y_grid for x in self.x_grid]) + + return super().write_data_to_vtk( + points=pts_cartesian, + filename=filename, + datasets=datasets, + volume_normalization=volume_normalization + ) + class CylindricalMesh(StructuredMesh): """A 3D cylindrical mesh @@ -1012,6 +1148,46 @@ class CylindricalMesh(StructuredMesh): return np.multiply.outer(np.outer(V_r, V_p), V_z) + def write_data_to_vtk(self, filename, datasets, volume_normalization=True): + """Creates a VTK object of the mesh + + Parameters + ---------- + filename : str or pathlib.Path + Name of the VTK file to write. + datasets : dict + Dictionary whose keys are the data labels + and values are the data sets. + volume_normalization : bool, optional + Whether or not to normalize the data by + the volume of the mesh elements. + Defaults to True. + + Returns + ------- + vtk.vtkStructuredGrid + the VTK object + """ + # create points + pts_cylindrical = np.array( + [ + [r, phi, z] + for z in self.z_grid + for phi in self.phi_grid + for r in self.r_grid + ] + ) + pts_cartesian = np.copy(pts_cylindrical) + r, phi = pts_cylindrical[:, 0], pts_cylindrical[:, 1] + pts_cartesian[:, 0] = r * np.cos(phi) + pts_cartesian[:, 1] = r * np.sin(phi) + + return super().write_data_to_vtk( + points=pts_cartesian, + filename=filename, + datasets=datasets, + volume_normalization=volume_normalization + ) class SphericalMesh(StructuredMesh): """A 3D spherical mesh @@ -1204,6 +1380,49 @@ class SphericalMesh(StructuredMesh): return np.multiply.outer(np.outer(V_r, V_t), V_p) + def write_data_to_vtk(self, filename, datasets, volume_normalization=True): + """Creates a VTK object of the mesh + + Parameters + ---------- + filename : str or pathlib.Path + Name of the VTK file to write. + datasets : dict + Dictionary whose keys are the data labels + and values are the data sets. + volume_normalization : bool, optional + Whether or not to normalize the data by + the volume of the mesh elements. + Defaults to True. + + Returns + ------- + vtk.vtkStructuredGrid + the VTK object + """ + + # create points + pts_spherical = np.array( + [ + [r, theta, phi] + for phi in self.phi_grid + for theta in self.theta_grid + for r in self.r_grid + ] + ) + pts_cartesian = np.copy(pts_spherical) + r, theta, phi = pts_spherical[:, 0], pts_spherical[:, 1], pts_spherical[:, 2] + pts_cartesian[:, 0] = r * np.sin(phi) * np.cos(theta) + pts_cartesian[:, 1] = r * np.sin(phi) * np.sin(theta) + pts_cartesian[:, 2] = r * np.cos(phi) + + return super().write_data_to_vtk( + points=pts_cartesian, + filename=filename, + datasets=datasets, + volume_normalization=volume_normalization + ) + class UnstructuredMesh(MeshBase): """A 3D unstructured mesh @@ -1328,6 +1547,7 @@ class UnstructuredMesh(MeshBase): "been loaded from a statepoint file.") return len(self._centroids) + @centroids.setter def centroids(self, centroids): cv.check_type("Unstructured mesh centroids", centroids, @@ -1373,7 +1593,7 @@ class UnstructuredMesh(MeshBase): Parameters ---------- - filename : str + filename : str or pathlib.Path Name of the VTK file to write. datasets : dict Dictionary whose keys are the data labels @@ -1381,6 +1601,11 @@ class UnstructuredMesh(MeshBase): volume_normalization : bool Whether or not to normalize the data by the volume of the mesh elements + + Raises + ------ + RuntimeError + when the size of a dataset doesn't match the number of cells """ import vtk @@ -1397,11 +1622,14 @@ class UnstructuredMesh(MeshBase): " mesh information from a statepoint file.") # check that the data sets are appropriately sized + errmsg = "The size of the dataset {} should be equal to the number of cells" for label, dataset in datasets.items(): if isinstance(dataset, np.ndarray): - assert dataset.size == self.n_elements + if not dataset.size == self.dimension[0] * self.dimension[1]* self.dimension[2]: + raise RuntimeError(errmsg.format(label)) else: - assert len(dataset) == self.n_elements + if len(dataset) == self.dimension[0] * self.dimension[1]* self.dimension[2]: + raise RuntimeError(errmsg.format(label)) cv.check_type('label', label, str) # create data arrays for the cells/points diff --git a/openmc/plotter.py b/openmc/plotter.py index 92acaf5bb..16760868e 100644 --- a/openmc/plotter.py +++ b/openmc/plotter.py @@ -542,15 +542,11 @@ def _calculate_cexs_elem_mat(this, types, temperature=294., if isinstance(this, openmc.Material): # Expand elements in to nuclides with atomic densities - nuclides = this.get_nuclide_atom_densities() - # For ease of processing split out the nuclide and its fraction - nuc_fractions = {nuclide[1][0]: nuclide[1][1] - for nuclide in nuclides.items()} + nuc_fractions = this.get_nuclide_atom_densities() # Create a dict of [nuclide name] = nuclide object to carry forward # with a common nuclides format between openmc.Material and # openmc.Element objects - nuclides = {nuclide[1][0]: nuclide[1][0] - for nuclide in nuclides.items()} + nuclides = {nuclide: nuclide for nuclide in nuc_fractions} else: # Expand elements in to nuclides with atomic densities nuclides = this.expand(1., 'ao', enrichment=enrichment, @@ -885,13 +881,13 @@ def _calculate_mgxs_elem_mat(this, types, library, orders=None, # Check to see if we have nuclides/elements or a macroscopic object if this._macroscopic is not None: # We have macroscopics - nuclides = {this._macroscopic: (this._macroscopic, this.density)} + nuclides = {this._macroscopic: this.density} else: # Expand elements in to nuclides with atomic densities nuclides = this.get_nuclide_atom_densities() # For ease of processing split out nuc and nuc_density - nuc_fraction = [nuclide[1][1] for nuclide in nuclides.items()] + nuc_fraction = list(nuclides.values()) else: T = temperature # Expand elements in to nuclides with atomic densities diff --git a/openmc/stats/univariate.py b/openmc/stats/univariate.py index e4a9b8f92..5528bdb30 100644 --- a/openmc/stats/univariate.py +++ b/openmc/stats/univariate.py @@ -60,6 +60,24 @@ class Univariate(EqualityMixin, ABC): elif distribution == 'mixture': return Mixture.from_xml_element(elem) + @abstractmethod + def sample(n_samples=1, seed=None): + """Sample the univariate distribution + + Parameters + ---------- + n_samples : int + Number of sampled values to generate + seed : int or None + Initial random number seed. + + Returns + ------- + numpy.ndarray + A 1-D array of sampled values + """ + pass + class Discrete(Univariate): """Distribution characterized by a probability mass function. @@ -115,6 +133,18 @@ class Discrete(Univariate): cv.check_greater_than('discrete probability', pk, 0.0, True) self._p = p + def cdf(self): + return np.insert(np.cumsum(self.p), 0, 0.0) + + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + return np.random.choice(self.x, n_samples, p=self.p) + + def normalize(self): + """Normalize the probabilities stored on the distribution""" + norm = sum(self.p) + self.p = [val / norm for val in self.p] + def to_xml_element(self, element_name): """Return XML representation of the discrete distribution @@ -240,6 +270,10 @@ class Uniform(Univariate): t.c = [0., 1.] return t + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + return np.random.uniform(self.a, self.b, n_samples) + def to_xml_element(self, element_name): """Return XML representation of the uniform distribution @@ -341,6 +375,14 @@ class PowerLaw(Univariate): cv.check_type('power law exponent', n, Real) self._n = n + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + xi = np.random.rand(n_samples) + pwr = self.n + 1 + offset = self.a**pwr + span = self.b**pwr - offset + return np.power(offset + xi * span, 1/pwr) + def to_xml_element(self, element_name): """Return XML representation of the power law distribution @@ -414,6 +456,16 @@ class Maxwell(Univariate): cv.check_greater_than('Maxwell temperature', theta, 0.0) self._theta = theta + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + return self.sample_maxwell(self.theta, n_samples) + + @staticmethod + def sample_maxwell(t, n_samples): + r1, r2, r3 = np.random.rand(3, n_samples) + c = np.cos(0.5 * np.pi * r3) + return -t * (np.log(r1) + np.log(r2) * c * c) + def to_xml_element(self, element_name): """Return XML representation of the Maxwellian distribution @@ -502,6 +554,13 @@ class Watt(Univariate): cv.check_greater_than('Watt b', b, 0.0) self._b = b + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + w = Maxwell.sample_maxwell(self.a, n_samples) + u = np.random.uniform(-1., 1., n_samples) + aab = self.a * self.a * self.b + return w + 0.25*aab + u*np.sqrt(aab*w) + def to_xml_element(self, element_name): """Return XML representation of the Watt distribution @@ -588,6 +647,10 @@ class Normal(Univariate): cv.check_greater_than('Normal std_dev', std_dev, 0.0) self._std_dev = std_dev + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + return np.random.normal(self.mean_value, self.std_dev, n_samples) + def to_xml_element(self, element_name): """Return XML representation of the Normal distribution @@ -694,6 +757,15 @@ class Muir(Univariate): cv.check_greater_than('Muir kt', kt, 0.0) self._kt = kt + @property + def std_dev(self): + return np.sqrt(4.*self.e0*self.kt/self.m_rat) + + def sample(self, n_samples=1, seed=None): + # Based on LANL report LA-05411-MS + np.random.seed(seed) + return np.random.normal(self.e0, self.std_dev, n_samples) + def to_xml_element(self, element_name): """Return XML representation of the Watt distribution @@ -803,6 +875,114 @@ class Tabular(Univariate): cv.check_value('interpolation', interpolation, _INTERPOLATION_SCHEMES) self._interpolation = interpolation + def cdf(self): + if not self.interpolation in ('histogram', 'linear-linear'): + raise NotImplementedError('Can only generate CDFs for tabular ' + 'distributions using histogram or ' + 'linear-linear interpolation') + c = np.zeros_like(self.x) + x = np.asarray(self.x) + p = np.asarray(self.p) + + if self.interpolation == 'histogram': + c[1:] = p[:-1] * np.diff(x) + elif self.interpolation == 'linear-linear': + c[1:] = 0.5 * (p[:-1] + p[1:]) * np.diff(x) + + return np.cumsum(c) + + def mean(self): + """Compute the mean of the tabular distribution""" + if not self.interpolation in ('histogram', 'linear-linear'): + raise NotImplementedError('Can only compute mean for tabular ' + 'distributions using histogram ' + 'or linear-linear interpolation.') + if self.interpolation == 'linear-linear': + mean = 0.0 + self.normalize() + for i in range(1, len(self.x)): + y_min = self.p[i-1] + y_max = self.p[i] + x_min = self.x[i-1] + x_max = self.x[i] + + m = (y_max - y_min) / (x_max - x_min) + + exp_val = (1./3.) * m * (x_max**3 - x_min**3) + exp_val += 0.5 * m * x_min * (x_min**2 - x_max**2) + exp_val += 0.5 * y_min * (x_max**2 - x_min**2) + mean += exp_val + + elif self.interpolation == 'histogram': + mean = 0.5 * (self.x[:-1] + self.x[1:]) + mean *= np.diff(self.cdf()) + mean = sum(mean) + + return mean + + def normalize(self): + """Normalize the probabilities stored on the distribution""" + self.p = np.asarray(self.p) / self.cdf().max() + + def sample(self, n_samples=1, seed=None): + if not self.interpolation in ('histogram', 'linear-linear'): + raise NotImplementedError('Can only sample tabular distributions ' + 'using histogram or ' + 'linear-linear interpolation') + np.random.seed(seed) + xi = np.random.rand(n_samples) + cdf = self.cdf() + cdf /= cdf.max() + # always use normalized probabilities when sampling + p = self.p / cdf.max() + + # get CDF bins that are above the + # sampled values + c_i = np.full(n_samples, cdf[0]) + cdf_idx = np.zeros(n_samples, dtype=int) + for i, val in enumerate(cdf[:-1]): + mask = xi > val + c_i[mask] = val + cdf_idx[mask] = i + + # get table values at each index where + # the random number is less than the next cdf + # entry + x_i = self.x[cdf_idx] + p_i = self.p[cdf_idx] + + if self.interpolation == 'histogram': + # mask where probability is greater than zero + pos_mask = p_i > 0.0 + # probabilities greater than zero are set proportional to the + # position of the random numebers in relation to the cdf value + p_i[pos_mask] = x_i[pos_mask] + (xi[pos_mask] - c_i[pos_mask]) \ + / p_i[pos_mask] + # probabilities smaller than zero are set to the random number value + p_i[~pos_mask] = x_i[~pos_mask] + + samples_out = p_i + + elif self.interpolation == 'linear-linear': + # get variable and probability values for the + # next entry + x_i1 = self.x[cdf_idx + 1] + p_i1 = self.p[cdf_idx + 1] + # compute slope between entries + m = (p_i1 - p_i) / (x_i1 - x_i) + # set values for zero slope + zero = m == 0.0 + m[zero] = x_i[zero] + (xi[zero] - c_i[zero]) / p_i[zero] + # set values for non-zero slope + non_zero = ~zero + quad = np.power(p_i[non_zero], 2) + 2.0 * m[non_zero] * (xi[non_zero] - c_i[non_zero]) + quad[quad < 0.0] = 0.0 + m[non_zero] = x_i[non_zero] + (np.sqrt(quad) - p_i[non_zero]) / m[non_zero] + samples_out = m + + assert all(samples_out < self.x[-1]) + return samples_out + def to_xml_element(self, element_name): """Return XML representation of the tabular distribution @@ -890,6 +1070,9 @@ class Legendre(Univariate): def coefficients(self, coefficients): self._coefficients = np.asarray(coefficients) + def sample(self, n_samples=1, seed=None): + raise NotImplementedError + def to_xml_element(self, element_name): raise NotImplementedError @@ -947,6 +1130,25 @@ class Mixture(Univariate): Iterable, Univariate) self._distribution = distribution + def cdf(self): + return np.insert(np.cumsum(self.probability), 0, 0.0) + + def sample(self, n_samples=1, seed=None): + np.random.seed(seed) + idx = np.random.choice(self.distribution, n_samples, p=self.probability) + + out = np.zeros_like(idx) + for i in np.unique(idx): + n_dist_samples = np.count_nonzero(idx == i) + samples = self.distribution[i].sample(n_dist_samples) + out[idx == i] = samples + return out + + def normalize(self): + """Normalize the probabilities stored on the distribution""" + norm = sum(self.probability) + self.probability = [val / norm for val in self.probability] + def to_xml_element(self, element_name): """Return XML representation of the mixture distribution diff --git a/setup.py b/setup.py index b2e3f160a..477f29dec 100755 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ kwargs = { # Data files and libraries 'package_data': { 'openmc.lib': ['libopenmc.{}'.format(suffix)], - 'openmc.data': ['mass16.txt', 'BREMX.DAT', '*.h5'], + 'openmc.data': ['mass16.txt', 'BREMX.DAT', 'half_life.json', '*.h5'], 'openmc.data.effective_dose': ['*.txt'] }, diff --git a/src/mesh.cpp b/src/mesh.cpp index de29233fb..e8f79aa37 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -379,7 +379,7 @@ void StructuredMesh::raytrace_mesh( // TODO: when c++-17 is available, use "if constexpr ()" to compile-time // enable/disable tally calls for now, T template type needs to provide both // surface and track methods, which might be empty. modern optimizing - // compilers will (hopefully) eleminate the complete code (including + // compilers will (hopefully) eliminate the complete code (including // calculation of parameters) but for the future: be explicit // Compute the length of the entire track. @@ -957,7 +957,7 @@ double CylindricalMesh::find_r_crossing( const Position& r, const Direction& u, double l, int shell) const { - if ((shell < 0) || (shell >= shape_[0])) + if ((shell < 0) || (shell > shape_[0])) return INFTY; // solve r.x^2 + r.y^2 == r0^2 @@ -1190,7 +1190,7 @@ StructuredMesh::MeshIndex SphericalMesh::get_indices( double SphericalMesh::find_r_crossing( const Position& r, const Direction& u, double l, int shell) const { - if ((shell < 0) || (shell >= shape_[0])) + if ((shell < 0) || (shell > shape_[0])) return INFTY; // solve |r+s*u| = r0 @@ -1312,20 +1312,17 @@ StructuredMesh::MeshDistance SphericalMesh::distance_to_grid_boundary( { if (i == 0) { - return std::min( MeshDistance(ijk[i] + 1, true, find_r_crossing(r0, u, l, ijk[i])), MeshDistance(ijk[i] - 1, false, find_r_crossing(r0, u, l, ijk[i] - 1))); } else if (i == 1) { - return std::min(MeshDistance(sanitize_theta(ijk[i] + 1), true, find_theta_crossing(r0, u, l, ijk[i])), MeshDistance(sanitize_theta(ijk[i] - 1), false, find_theta_crossing(r0, u, l, ijk[i] - 1))); } else { - return std::min(MeshDistance(sanitize_phi(ijk[i] + 1), true, find_phi_crossing(r0, u, l, ijk[i])), MeshDistance(sanitize_phi(ijk[i] - 1), false, @@ -2567,8 +2564,9 @@ void read_meshes(pugi::xml_node root) // Check to make sure multiple meshes in the same file don't share IDs int id = std::stoi(get_node_value(node, "id")); if (contains(mesh_ids, id)) { - fatal_error( - fmt::format("Two or more meshes use the same unique ID '{}' in the same input file", id)); + fatal_error(fmt::format( + "Two or more meshes use the same unique ID '{}' in the same input file", + id)); } mesh_ids.insert(id); diff --git a/src/photon.cpp b/src/photon.cpp index b0cd8aa87..2f9bc5e3d 100644 --- a/src/photon.cpp +++ b/src/photon.cpp @@ -14,7 +14,9 @@ #include "openmc/settings.h" #include "xtensor/xbuilder.hpp" +#include "xtensor/xmath.hpp" #include "xtensor/xoperation.hpp" +#include "xtensor/xslice.hpp" #include "xtensor/xview.hpp" #include @@ -44,6 +46,8 @@ vector> elements; PhotonInteraction::PhotonInteraction(hid_t group) { + using namespace xt::placeholders; + // Set index of element in global vector index_ = data::elements.size(); @@ -125,6 +129,7 @@ PhotonInteraction::PhotonInteraction(hid_t group) } shells_.resize(n_shell); + cross_sections_ = xt::zeros({energy_.size(), n_shell}); // Create mapping from designator to index std::unordered_map shell_map; @@ -155,13 +160,15 @@ PhotonInteraction::PhotonInteraction(hid_t group) read_attribute(tgroup, "num_electrons", shell.n_electrons); // Read subshell cross section + xt::xtensor xs; dset = open_dataset(tgroup, "xs"); read_attribute(dset, "threshold_idx", shell.threshold); close_dataset(dset); - read_dataset(tgroup, "xs", shell.cross_section); + read_dataset(tgroup, "xs", xs); - auto& xs = shell.cross_section; - xs = xt::where(xs > 0.0, xt::log(xs), -500.0); + auto cross_section = + xt::view(cross_sections_, xt::range(shell.threshold, _), i); + cross_section = xt::where(xs > 0, xt::log(xs), 0); if (object_exists(tgroup, "transitions")) { // Determine dimensions of transitions @@ -566,18 +573,13 @@ void PhotonInteraction::calculate_xs(Particle& p) const // Calculate microscopic photoelectric cross section xs.photoelectric = 0.0; - for (const auto& shell : shells_) { - // Check threshold of reaction - int i_start = shell.threshold; - if (i_grid < i_start) - continue; + const auto& xs_lower = xt::row(cross_sections_, i_grid); + const auto& xs_upper = xt::row(cross_sections_, i_grid + 1); - // Evaluation subshell photoionization cross section - xs.photoelectric += - std::exp(shell.cross_section(i_grid - i_start) + - f * (shell.cross_section(i_grid + 1 - i_start) - - shell.cross_section(i_grid - i_start))); - } + for (int i = 0; i < xs_upper.size(); ++i) + if (xs_lower(i) != 0) + xs.photoelectric += + std::exp(xs_lower(i) + f * (xs_upper(i) - xs_lower(i))); // Calculate microscopic pair production cross section xs.pair_production = std::exp( diff --git a/src/physics.cpp b/src/physics.cpp index 13dd063de..bcdcf7ecf 100644 --- a/src/physics.cpp +++ b/src/physics.cpp @@ -29,6 +29,7 @@ #include // for max, min, max_element #include // for sqrt, exp, log, abs, copysign +#include namespace openmc { @@ -344,25 +345,26 @@ void sample_photon_reaction(Particle& p) // Photoelectric effect double prob_after = prob + micro.photoelectric; + if (prob_after > cutoff) { + // Get grid index, interpolation factor, and bounding subshell + // cross sections + int i_grid = micro.index_grid; + double f = micro.interp_factor; + const auto& xs_lower = xt::row(element.cross_sections_, i_grid); + const auto& xs_upper = xt::row(element.cross_sections_, i_grid + 1); + for (int i_shell = 0; i_shell < element.shells_.size(); ++i_shell) { const auto& shell {element.shells_[i_shell]}; - // Get grid index and interpolation factor - int i_grid = micro.index_grid; - double f = micro.interp_factor; - // Check threshold of reaction - int i_start = shell.threshold; - if (i_grid < i_start) + if (xs_lower(i_shell) == 0) continue; - // Evaluation subshell photoionization cross section - double xs = std::exp(shell.cross_section(i_grid - i_start) + - f * (shell.cross_section(i_grid + 1 - i_start) - - shell.cross_section(i_grid - i_start))); + // Evaluation subshell photoionization cross section + prob += std::exp( + xs_lower(i_shell) + f * (xs_upper(i_shell) - xs_lower(i_shell))); - prob += xs; if (prob > cutoff) { double E_electron = p.E() - shell.binding_energy; diff --git a/tests/regression_tests/filter_mesh/results_true.dat b/tests/regression_tests/filter_mesh/results_true.dat index 97735130e..ef52af2c7 100644 --- a/tests/regression_tests/filter_mesh/results_true.dat +++ b/tests/regression_tests/filter_mesh/results_true.dat @@ -1 +1 @@ -6e02d01fc115c54e4c60477a9f963149bc83c82e6a7bdb2d29125b131546150c59de5ac3aae5b9469b89b343ecf2574f6c949b918ccb43231e8666ee2b7c1b7c \ No newline at end of file +70243ebdb882e4367bf821667a9f4d41dea03eaf8b27d734e014a13e14922b5158cd47b0a7edf3733d4e23ca6a5ab06457220c9138b7e9720acf547f2eaa06e2 \ No newline at end of file diff --git a/tests/unit_tests/test_data_misc.py b/tests/unit_tests/test_data_misc.py index 6a81fb1e0..c3f7e3cff 100644 --- a/tests/unit_tests/test_data_misc.py +++ b/tests/unit_tests/test_data_misc.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -from collections.abc import Mapping +from math import log import os from pathlib import Path @@ -126,3 +126,14 @@ def test_zam(): assert openmc.data.zam('Am242_m10') == (95, 242, 10) with pytest.raises(ValueError): openmc.data.zam('garbage') + + +def test_half_life(): + assert openmc.data.half_life('H2') is None + assert openmc.data.half_life('U235') == pytest.approx(2.22102e16) + assert openmc.data.half_life('Am242') == pytest.approx(57672.0) + assert openmc.data.half_life('Am242_m1') == pytest.approx(4449622000.0) + assert openmc.data.decay_constant('H2') == 0.0 + assert openmc.data.decay_constant('U235') == pytest.approx(log(2.0)/2.22102e16) + assert openmc.data.decay_constant('Am242') == pytest.approx(log(2.0)/57672.0) + assert openmc.data.decay_constant('Am242_m1') == pytest.approx(log(2.0)/4449622000.0) diff --git a/tests/unit_tests/test_deplete_activation.py b/tests/unit_tests/test_deplete_activation.py index 0b82a5fbc..cb3b86b9c 100644 --- a/tests/unit_tests/test_deplete_activation.py +++ b/tests/unit_tests/test_deplete_activation.py @@ -92,7 +92,7 @@ def test_activation(run_in_tmpdir, model, reaction_rate_mode, reaction_rate_opts w = model.geometry.get_materials_by_name('tungsten')[0] atom_densities = w.get_nuclide_atom_densities() - atom_per_cc = 1e24 * atom_densities['W186'][1] # Density in atom/cm^3 + atom_per_cc = 1e24 * atom_densities['W186'] # Density in atom/cm^3 n0 = atom_per_cc * w.volume # Absolute number of atoms # Pick a random irradiation time and then determine necessary source rate to diff --git a/tests/unit_tests/test_filter_mesh.py b/tests/unit_tests/test_filter_mesh.py new file mode 100644 index 000000000..265642360 --- /dev/null +++ b/tests/unit_tests/test_filter_mesh.py @@ -0,0 +1,109 @@ +import numpy as np +import openmc +from uncertainties import unumpy + + +def test_spherical_mesh_estimators(run_in_tmpdir): + """Test that collision/tracklength estimators agree for SphericalMesh""" + + mat = openmc.Material() + mat.add_nuclide('U235', 1.0) + mat.set_density('g/cm3', 10.0) + + sphere = openmc.Sphere(r=10.0, boundary_type='vacuum') + cell = openmc.Cell(fill=mat, region=-sphere) + model = openmc.Model() + model.geometry = openmc.Geometry([cell]) + model.settings.particles = 1_000 + model.settings.inactive = 10 + model.settings.batches = 20 + + sph_mesh = openmc.SphericalMesh() + sph_mesh.r_grid = np.linspace(0.0, 5.0**3, 20)**(1/3) + tally1 = openmc.Tally() + tally1.filters = [openmc.MeshFilter(sph_mesh)] + tally1.scores = ['flux'] + tally1.estimator = 'collision' + + sph_mesh = openmc.SphericalMesh() + sph_mesh.r_grid = np.linspace(0.0, 5.0**3, 20)**(1/3) + tally2 = openmc.Tally() + tally2.filters = [openmc.MeshFilter(sph_mesh)] + tally2.scores = ['flux'] + tally2.estimator = 'tracklength' + + model.tallies = openmc.Tallies([tally1, tally2]) + + # Run OpenMC + sp_filename = model.run() + + # Get radial flux distribution + with openmc.StatePoint(sp_filename) as sp: + flux_collision = sp.tallies[tally1.id].mean.ravel() + flux_collision_unc = sp.tallies[tally1.id].std_dev.ravel() + flux_tracklength = sp.tallies[tally2.id].mean.ravel() + flux_tracklength_unc = sp.tallies[tally2.id].std_dev.ravel() + + # Construct arrays with uncertainties + collision = unumpy.uarray(flux_collision, flux_collision_unc) + tracklength = unumpy.uarray(flux_tracklength, flux_tracklength_unc) + delta = collision - tracklength + + # Check that difference is within uncertainty + diff = unumpy.nominal_values(delta) + std_dev = unumpy.std_devs(delta) + assert np.all(diff < 3*std_dev) + + +def test_cylindrical_mesh_estimators(run_in_tmpdir): + """Test that collision/tracklength estimators agree for CylindricalMesh""" + + mat = openmc.Material() + mat.add_nuclide('U235', 1.0) + mat.set_density('g/cm3', 10.0) + + cyl = openmc.model.RightCircularCylinder((0., 0., -5.), 10., 10.0, boundary_type='vacuum') + cell = openmc.Cell(fill=mat, region=-cyl) + model = openmc.Model() + model.geometry = openmc.Geometry([cell]) + model.settings.particles = 1_000 + model.settings.inactive = 10 + model.settings.batches = 20 + + cyl_mesh = openmc.CylindricalMesh() + cyl_mesh.r_grid = np.linspace(0.0, 5.0**3, 20)**(1/3) + cyl_mesh.z_grid = [-5., 5.] + tally1 = openmc.Tally() + tally1.filters = [openmc.MeshFilter(cyl_mesh)] + tally1.scores = ['flux'] + tally1.estimator = 'collision' + + cyl_mesh = openmc.CylindricalMesh() + cyl_mesh.r_grid = np.linspace(0.0, 5.0**3, 20)**(1/3) + cyl_mesh.z_grid = [-5., 5.] + tally2 = openmc.Tally() + tally2.filters = [openmc.MeshFilter(cyl_mesh)] + tally2.scores = ['flux'] + tally2.estimator = 'tracklength' + + model.tallies = openmc.Tallies([tally1, tally2]) + + # Run OpenMC + sp_filename = model.run() + + # Get radial flux distribution + with openmc.StatePoint(sp_filename) as sp: + flux_collision = sp.tallies[tally1.id].mean.ravel() + flux_collision_unc = sp.tallies[tally1.id].std_dev.ravel() + flux_tracklength = sp.tallies[tally2.id].mean.ravel() + flux_tracklength_unc = sp.tallies[tally2.id].std_dev.ravel() + + # Construct arrays with uncertainties + collision = unumpy.uarray(flux_collision, flux_collision_unc) + tracklength = unumpy.uarray(flux_tracklength, flux_tracklength_unc) + delta = collision - tracklength + + # Check that difference is within uncertainty + diff = unumpy.nominal_values(delta) + std_dev = unumpy.std_devs(delta) + assert np.all(diff < 3*std_dev) diff --git a/tests/unit_tests/test_material.py b/tests/unit_tests/test_material.py index 02e53a28d..fd0e4f624 100644 --- a/tests/unit_tests/test_material.py +++ b/tests/unit_tests/test_material.py @@ -38,6 +38,17 @@ def test_remove_nuclide(): assert m.nuclides[1].percent == 2.0 +def test_remove_elements(): + """Test removing elements.""" + m = openmc.Material() + for elem, percent in [('Li', 1.0), ('Be', 1.0)]: + m.add_element(elem, percent) + m.remove_element('Li') + assert len(m.nuclides) == 1 + assert m.nuclides[0].name == 'Be9' + assert m.nuclides[0].percent == 1.0 + + def test_elements(): """Test adding elements.""" m = openmc.Material() @@ -89,7 +100,7 @@ def test_add_elements_by_formula(): m.add_elements_from_formula('Li4SiO4') # checking the ratio of elements is 4:1:4 for Li:Si:O elem = defaultdict(float) - for nuclide, adens in m.get_nuclide_atom_densities().values(): + for nuclide, adens in m.get_nuclide_atom_densities().items(): if nuclide.startswith("Li"): elem["Li"] += adens if nuclide.startswith("Si"): @@ -106,7 +117,7 @@ def test_add_elements_by_formula(): 'O16': 0.443386, 'O17': 0.000168} nuc_dens = m.get_nuclide_atom_densities() for nuclide in ref_dens: - assert nuc_dens[nuclide][1] == pytest.approx(ref_dens[nuclide], 1e-2) + assert nuc_dens[nuclide] == pytest.approx(ref_dens[nuclide], 1e-2) # testing the correct nuclides are added to the Material when enriched m = openmc.Material() @@ -118,7 +129,7 @@ def test_add_elements_by_formula(): 'O16': 0.443386, 'O17': 0.000168} nuc_dens = m.get_nuclide_atom_densities() for nuclide in ref_dens: - assert nuc_dens[nuclide][1] == pytest.approx(ref_dens[nuclide], 1e-2) + assert nuc_dens[nuclide] == pytest.approx(ref_dens[nuclide], 1e-2) # testing the use of brackets m = openmc.Material() @@ -126,7 +137,7 @@ def test_add_elements_by_formula(): # checking the ratio of elements is 2:2:6 for Mg:N:O elem = defaultdict(float) - for nuclide, adens in m.get_nuclide_atom_densities().values(): + for nuclide, adens in m.get_nuclide_atom_densities().items(): if nuclide.startswith("Mg"): elem["Mg"] += adens if nuclide.startswith("N"): @@ -144,7 +155,7 @@ def test_add_elements_by_formula(): 'O16': 0.599772, 'O17': 0.000227} nuc_dens = m.get_nuclide_atom_densities() for nuclide in ref_dens: - assert nuc_dens[nuclide][1] == pytest.approx(ref_dens[nuclide], 1e-2) + assert nuc_dens[nuclide] == pytest.approx(ref_dens[nuclide], 1e-2) # testing non integer multiplier results in a value error m = openmc.Material() @@ -278,12 +289,21 @@ def test_get_nuclide_densities(uo2): def test_get_nuclide_atom_densities(uo2): - nucs = uo2.get_nuclide_atom_densities() - for nuc, density in nucs.values(): + for nuc, density in uo2.get_nuclide_atom_densities().items(): assert nuc in ('U235', 'O16') assert density > 0 +def test_get_nuclide_atoms(): + mat = openmc.Material() + mat.add_nuclide('Li6', 1.0) + mat.set_density('atom/cm3', 3.26e20) + mat.volume = 100.0 + + atoms = mat.get_nuclide_atoms() + assert atoms['Li6'] == pytest.approx(mat.density * mat.volume) + + def test_mass(): m = openmc.Material() m.add_nuclide('Zr90', 1.0, 'wo') @@ -330,7 +350,7 @@ def test_borated_water(): 'O16':2.4672e-02} nuc_dens = m.get_nuclide_atom_densities() for nuclide in ref_dens: - assert nuc_dens[nuclide][1] == pytest.approx(ref_dens[nuclide], 1e-2) + assert nuc_dens[nuclide] == pytest.approx(ref_dens[nuclide], 1e-2) assert m.id == 50 # Test the Celsius conversion. @@ -404,3 +424,30 @@ def test_mix_materials(): assert m3.density == pytest.approx(dens3) assert m4.density == pytest.approx(dens4) assert m5.density == pytest.approx(dens5) + + +def test_activity_of_stable(): + """Creates a material with stable isotopes to checks the activity is 0""" + m1 = openmc.Material() + m1.add_element("Fe", 1) + m1.set_density('g/cm3', 1) + m1.volume = 1 + assert m1.activity == 0 + + +def test_activity_of_tritium(): + """Checks that 1g of tritium has the correct activity""" + m1 = openmc.Material() + m1.add_nuclide("H3", 1) + m1.set_density('g/cm3', 1) + m1.volume = 1 + assert pytest.approx(m1.activity) == 3.559778e14 + + +def test_activity_of_metastable(): + """Checks that 1 mol of a Tc99_m1 nuclides has the correct activity""" + m1 = openmc.Material() + m1.add_nuclide("Tc99_m1", 1) + m1.set_density('g/cm3', 1) + m1.volume = 98.9 + assert pytest.approx(m1.activity, rel=0.001) == 1.93e19 diff --git a/tests/unit_tests/test_mesh_to_vtk.py b/tests/unit_tests/test_mesh_to_vtk.py new file mode 100644 index 000000000..26a393b41 --- /dev/null +++ b/tests/unit_tests/test_mesh_to_vtk.py @@ -0,0 +1,76 @@ +import numpy as np +from pathlib import Path +import pytest + +vtk = pytest.importorskip("vtk") +from vtk.util import numpy_support as nps + +import openmc + + +regular_mesh = openmc.RegularMesh() +regular_mesh.lower_left = (0, 0, 0) +regular_mesh.upper_right = (1, 1, 1) +regular_mesh.dimension = [30, 20, 10] + +rectilinear_mesh = openmc.RectilinearMesh() +rectilinear_mesh.x_grid = np.linspace(1, 2, num=30) +rectilinear_mesh.y_grid = np.linspace(1, 2, num=30) +rectilinear_mesh.z_grid = np.linspace(1, 2, num=30) + +cylinder_mesh = openmc.CylindricalMesh() +cylinder_mesh.r_grid = np.linspace(1, 2, num=30) +cylinder_mesh.phi_grid = np.linspace(0, np.pi, num=50) +cylinder_mesh.z_grid = np.linspace(0, 1, num=30) + +spherical_mesh = openmc.SphericalMesh() +spherical_mesh.r_grid = np.linspace(1, 2, num=30) +spherical_mesh.phi_grid = np.linspace(0, np.pi, num=50) +spherical_mesh.theta_grid = np.linspace(0, np.pi / 2, num=30) + +@pytest.mark.parametrize("mesh", [cylinder_mesh, regular_mesh, rectilinear_mesh, spherical_mesh]) +def test_write_data_to_vtk(mesh, tmpdir): + # BUILD + filename = Path(tmpdir) / "out.vtk" + + data = np.random.random(mesh.num_mesh_cells) + + # RUN + mesh.write_data_to_vtk(filename=filename, datasets={"label1": data, "label2": data}) + + # TEST + assert filename.is_file() + + # read file + reader = vtk.vtkStructuredGridReader() + reader.SetFileName(filename) + reader.Update() + + # check name of datasets + vtk_grid = reader.GetOutput() + array1 = vtk_grid.GetCellData().GetArray(0) + array2 = vtk_grid.GetCellData().GetArray(1) + + assert array1.GetName() == "label1" + assert array2.GetName() == "label2" + + # check size of datasets + assert nps.vtk_to_numpy(array1).size == data.size + assert nps.vtk_to_numpy(array2).size == data.size + +@pytest.mark.parametrize("mesh", [cylinder_mesh, regular_mesh, rectilinear_mesh, spherical_mesh]) +def test_write_data_to_vtk_size_mismatch(mesh): + """Checks that an error is raised when the size of the dataset + doesn't match the mesh number of cells + + Parameters + ---------- + mesh : openmc.StructuredMesh + The mesh to test + """ + right_size = mesh.num_mesh_cells + data = np.random.random(right_size + 1) + + expected_error_msg = "The size of the dataset label should be equal to the number of cells" + with pytest.raises(RuntimeError, match=expected_error_msg): + mesh.write_data_to_vtk(filename="out.vtk", datasets={"label": data}) \ No newline at end of file diff --git a/tests/unit_tests/test_model.py b/tests/unit_tests/test_model.py index 10417b20e..9b05ed2a5 100644 --- a/tests/unit_tests/test_model.py +++ b/tests/unit_tests/test_model.py @@ -391,16 +391,14 @@ def test_py_lib_attributes(run_in_tmpdir, pin_model_attributes, mpi_intracomm): assert openmc.lib.materials[1].get_density('atom/b-cm') == \ pytest.approx(0.06891296988603757, abs=1e-13) mat_a_dens = np.sum( - [v[1] for v in test_model.materials[0]. - get_nuclide_atom_densities().values()]) + list(test_model.materials[0].get_nuclide_atom_densities().values())) assert mat_a_dens == pytest.approx(0.06891296988603757, abs=1e-8) # Change the density test_model.update_densities(['UO2'], 2.) assert openmc.lib.materials[1].get_density('atom/b-cm') == \ pytest.approx(2., abs=1e-13) mat_a_dens = np.sum( - [v[1] for v in test_model.materials[0]. - get_nuclide_atom_densities().values()]) + list(test_model.materials[0].get_nuclide_atom_densities().values())) assert mat_a_dens == pytest.approx(2., abs=1e-8) # Now lets do the cell temperature updates. @@ -441,7 +439,7 @@ def test_deplete(run_in_tmpdir, pin_model_attributes, mpi_intracomm): test_model = openmc.Model(geom, mats, settings, tals, plots) initial_mat = mats[0].clone() - initial_u = initial_mat.get_nuclide_atom_densities()['U235'][1] + initial_u = initial_mat.get_nuclide_atom_densities()['U235'] # Note that the chain file includes only U-235 fission to a stable Xe136 w/ # a yield of 100%. Thus all the U235 we lose becomes Xe136 @@ -453,8 +451,8 @@ def test_deplete(run_in_tmpdir, pin_model_attributes, mpi_intracomm): operator_kwargs=op_kwargs, power=1., output=False) # Get the new Xe136 and U235 atom densities - after_xe = mats[0].get_nuclide_atom_densities()['Xe136'][1] - after_u = mats[0].get_nuclide_atom_densities()['U235'][1] + after_xe = mats[0].get_nuclide_atom_densities()['Xe136'] + after_u = mats[0].get_nuclide_atom_densities()['U235'] assert after_xe + after_u == pytest.approx(initial_u, abs=1e-15) assert test_model.is_initialized is False @@ -462,7 +460,7 @@ def test_deplete(run_in_tmpdir, pin_model_attributes, mpi_intracomm): mats[0].nuclides.clear() densities = initial_mat.get_nuclide_atom_densities() tot_density = 0. - for nuc, density in densities.values(): + for nuc, density in densities.items(): mats[0].add_nuclide(nuc, density) tot_density += density mats[0].set_density('atom/b-cm', tot_density) @@ -473,8 +471,8 @@ def test_deplete(run_in_tmpdir, pin_model_attributes, mpi_intracomm): operator_kwargs=op_kwargs, power=1., output=False) # Get the new Xe136 and U235 atom densities - after_lib_xe = mats[0].get_nuclide_atom_densities()['Xe136'][1] - after_lib_u = mats[0].get_nuclide_atom_densities()['U235'][1] + after_lib_xe = mats[0].get_nuclide_atom_densities()['Xe136'] + after_lib_u = mats[0].get_nuclide_atom_densities()['U235'] assert after_lib_xe + after_lib_u == pytest.approx(initial_u, abs=1e-15) assert test_model.is_initialized is True diff --git a/tests/unit_tests/test_stats.py b/tests/unit_tests/test_stats.py index 51a561bd3..b57f9578a 100644 --- a/tests/unit_tests/test_stats.py +++ b/tests/unit_tests/test_stats.py @@ -26,6 +26,21 @@ def test_discrete(): assert d2.p == [1.0] assert len(d2) == 1 + vals = np.array([1.0, 2.0, 3.0]) + probs = np.array([0.1, 0.7, 0.2]) + + exp_mean = (vals * probs).sum() + + d3 = openmc.stats.Discrete(vals, probs) + + # sample discrete distribution + n_samples = 1_000_000 + samples = d3.sample(n_samples, seed=100) + # check that the mean of the samples is within 3 std. dev. + # of the expected mean + std_dev = samples.std() / np.sqrt(n_samples) + assert np.abs(exp_mean - samples.mean()) < 3*std_dev + def test_merge_discrete(): x1 = [0.0, 1.0, 10.0] @@ -65,8 +80,17 @@ def test_uniform(): assert t.p == [1/(b-a), 1/(b-a)] assert t.interpolation == 'histogram' + exp_mean = 0.5 * (a + b) + n_samples = 1_000_000 + samples = d.sample(n_samples, seed=100) + # check that the mean of the samples is within 3 std. dev. + # of the expected mean + std_dev = samples.std() / np.sqrt(n_samples) + assert np.abs(exp_mean - samples.mean()) < 3*std_dev + + def test_powerlaw(): - a, b, n = 10.0, 20.0, 2.0 + a, b, n = 10.0, 100.0, 2.0 d = openmc.stats.PowerLaw(a, b, n) elem = d.to_xml_element('distribution') @@ -76,6 +100,17 @@ def test_powerlaw(): assert d.n == n assert len(d) == 3 + exp_mean = 100.0 * (n+1) / (n+2) + + # sample power law distribution + n_samples = 1_000_000 + samples = d.sample(n_samples, seed=100) + # check that the mean of the samples is within 3 std. dev. + # of the expected mean + std_dev = samples.std() / np.sqrt(n_samples) + assert np.abs(exp_mean - samples.mean()) < 3*std_dev + + def test_maxwell(): theta = 1.2895e6 d = openmc.stats.Maxwell(theta) @@ -85,6 +120,25 @@ def test_maxwell(): assert d.theta == theta assert len(d) == 1 + exp_mean = 3/2 * theta + + # sample maxwell distribution + n_samples = 1_000_000 + samples = d.sample(n_samples, seed=100) + # check that the mean of the samples is within 3 std. dev. + # of the expected mean + std_dev = samples.std() / np.sqrt(n_samples) + assert np.abs(exp_mean - samples.mean()) < 3*std_dev + + # A second sample with a different seed + samples_2 = d.sample(n_samples, seed=200) + # check that the mean of the samples is within 3 std. dev. + # of the expected mean + std_dev = samples_2.std() / np.sqrt(n_samples) + assert np.abs(exp_mean - samples_2.mean()) < 3*std_dev + + assert samples_2.mean() != samples.mean() + def test_watt(): a, b = 0.965e6, 2.29e-6 @@ -96,19 +150,59 @@ def test_watt(): assert d.b == b assert len(d) == 2 + # mean value form adapted from + # "Prompt-fission-neutron average energy for 238U(n, f ) from + # threshold to 200 MeV" Ethvignot et. al. + # https://doi.org/10.1016/j.physletb.2003.09.048 + exp_mean = 3/2 * a + a**2 * b / 4 + + # sample Watt distribution + n_samples = 1_000_000 + samples = d.sample(n_samples, seed=100) + # check that the mean of the samples is within 3 std. dev. + # of the expected mean + std_dev = samples.std() / np.sqrt(n_samples) + assert np.abs(exp_mean - samples.mean()) < 3*std_dev + def test_tabular(): - x = [0.0, 5.0, 7.0] - p = [0.1, 0.2, 0.05] + x = np.array([0.0, 5.0, 7.0]) + p = np.array([0.1, 0.2, 0.05]) d = openmc.stats.Tabular(x, p, 'linear-linear') elem = d.to_xml_element('distribution') d = openmc.stats.Tabular.from_xml_element(elem) - assert d.x == x - assert d.p == p + assert all(d.x == x) + assert all(d.p == p) assert d.interpolation == 'linear-linear' assert len(d) == len(x) + # test linear-linear sampling + d = openmc.stats.Tabular(x, p) + + n_samples = 100_000 + samples = d.sample(n_samples, seed=100) + diff = np.abs(samples - d.mean()) + # within_1_sigma = np.count_nonzero(diff < samples.std()) + # assert within_1_sigma / n_samples >= 0.68 + within_2_sigma = np.count_nonzero(diff < 2*samples.std()) + assert within_2_sigma / n_samples >= 0.95 + within_3_sigma = np.count_nonzero(diff < 3*samples.std()) + assert within_3_sigma / n_samples >= 0.99 + + # test histogram sampling + d = openmc.stats.Tabular(x, p, interpolation='histogram') + d.normalize() + + samples = d.sample(n_samples, seed=100) + diff = np.abs(samples - d.mean()) + # within_1_sigma = np.count_nonzero(diff < samples.std()) + # assert within_1_sigma / n_samples >= 0.68 + within_2_sigma = np.count_nonzero(diff < 2*samples.std()) + assert within_2_sigma / n_samples >= 0.95 + within_3_sigma = np.count_nonzero(diff < 3*samples.std()) + assert within_3_sigma / n_samples >= 0.99 + def test_legendre(): # Pu239 elastic scattering at 100 keV @@ -251,6 +345,7 @@ def test_point(): d = openmc.stats.Point.from_xml_element(elem) assert d.xyz == pytest.approx(p) + def test_normal(): mean = 10.0 std_dev = 2.0 @@ -264,6 +359,18 @@ def test_normal(): assert d.std_dev == pytest.approx(std_dev) assert len(d) == 2 + # sample normal distribution + n_samples = 10000 + samples = d.sample(n_samples, seed=100) + samples = np.abs(samples - mean) + within_1_sigma = np.count_nonzero(samples < std_dev) + assert within_1_sigma / n_samples >= 0.68 + within_2_sigma = np.count_nonzero(samples < 2*std_dev) + assert within_2_sigma / n_samples >= 0.95 + within_3_sigma = np.count_nonzero(samples < 3*std_dev) + assert within_3_sigma / n_samples >= 0.99 + + def test_muir(): mean = 10.0 mass = 5.0 @@ -278,3 +385,14 @@ def test_muir(): assert d.m_rat == pytest.approx(mass) assert d.kt == pytest.approx(temp) assert len(d) == 3 + + # sample muir distribution + n_samples = 10000 + samples = d.sample(n_samples, seed=100) + samples = np.abs(samples - mean) + within_1_sigma = np.count_nonzero(samples < d.std_dev) + assert within_1_sigma / n_samples >= 0.68 + within_2_sigma = np.count_nonzero(samples < 2*d.std_dev) + assert within_2_sigma / n_samples >= 0.95 + within_3_sigma = np.count_nonzero(samples < 3*d.std_dev) + assert within_3_sigma / n_samples >= 0.99 diff --git a/tests/unit_tests/test_tallies.py b/tests/unit_tests/test_tallies.py index aeeb0612d..bfff741a9 100644 --- a/tests/unit_tests/test_tallies.py +++ b/tests/unit_tests/test_tallies.py @@ -1,4 +1,5 @@ import numpy as np + import openmc