From 81fcd19ec60400658dea389cb80fbe4a6eefeef4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 26 May 2017 07:52:39 -0500 Subject: [PATCH 001/123] Don't copy _paths when cloning Cell or Material --- openmc/cell.py | 10 +++++++++- openmc/material.py | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/openmc/cell.py b/openmc/cell.py index 4496062f7..a06270201 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -527,8 +527,16 @@ class Cell(object): # If no nemoize'd clone exists, instantiate one if self not in memo: + # Temporarily remove paths + paths = self.paths + self._paths = None + clone = deepcopy(self) clone.id = None + + # Restore paths on original instance + self._paths = paths + if self.region is not None: clone.region = self.region.clone(memo) if self.fill is not None: @@ -542,7 +550,7 @@ class Cell(object): memo[self] = clone return memo[self] - + def create_xml_subelement(self, xml_element): element = ET.Element("cell") element.set("id", str(self.id)) diff --git a/openmc/material.py b/openmc/material.py index 202f46c1b..f7ca9c9fd 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -820,9 +820,18 @@ class Material(object): # If no nemoize'd clone exists, instantiate one if self not in memo: + # Temporarily remove paths -- this is done so that when the clone is + # made, it doesn't create a copy of the paths (which are specific to + # an instance) + paths = self.paths + self._paths = None + clone = deepcopy(self) clone.id = None + # Restore paths on original instance + self._paths = paths + # Memoize the clone memo[self] = clone From 26afc8246274ac8a7c995c6ee71b38601ce132f4 Mon Sep 17 00:00:00 2001 From: johnnyliu27 Date: Sat, 27 May 2017 22:55:53 -0400 Subject: [PATCH 002/123] Fix some typos and expired links in the example notebook of MGXS Part I --- examples/jupyter/mgxs-part-i.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/jupyter/mgxs-part-i.ipynb b/examples/jupyter/mgxs-part-i.ipynb index c05516a89..6fa0c02b1 100644 --- a/examples/jupyter/mgxs-part-i.ipynb +++ b/examples/jupyter/mgxs-part-i.ipynb @@ -89,7 +89,7 @@ "\n", "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", "\n", - "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](http://openmc.readthedocs.io/en/latest/usersguide/tallies.html#filters) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." ] }, { @@ -764,7 +764,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." + "Since the `openmc.mgxs` module uses [tally arithmetic](http://openmc.readthedocs.io/en/latest/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." ] }, { @@ -875,7 +875,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](http://openmc.readthedocs.io/en/latest/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." ] }, { @@ -1176,7 +1176,7 @@ "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", "sum_ratio = absorption_to_total + scattering_to_total\n", "\n", - "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "# The sum ratio is a derived tally which can generate Pandas DataFrames for inspection\n", "sum_ratio.get_pandas_dataframe()" ] } From 990bf0b78fc806f001c65347972f8279737765e8 Mon Sep 17 00:00:00 2001 From: johnnyliu27 Date: Sat, 27 May 2017 23:05:26 -0400 Subject: [PATCH 003/123] Fix some typos and expired links in the example notebook of MGXS Part II & III --- examples/jupyter/mgxs-part-ii.ipynb | 10 +++++----- examples/jupyter/mgxs-part-iii.ipynb | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/jupyter/mgxs-part-ii.ipynb b/examples/jupyter/mgxs-part-ii.ipynb index 3346027ee..b12cc4143 100644 --- a/examples/jupyter/mgxs-part-ii.ipynb +++ b/examples/jupyter/mgxs-part-ii.ipynb @@ -8,7 +8,7 @@ "\n", "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", - "* The use of **[tally precision triggers](http://openmc.readthedocs.io/en/latest/usersguide/input.html#trigger-element)** with multi-group cross sections\n", + "* The use of **[tally precision triggers](http://openmc.readthedocs.io/en/latest/io_formats/settings.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", "* The use of the **`openmc.data`** module to plot continuous-energy vs. multi-group cross sections\n", "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", @@ -254,7 +254,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10,000 particles." + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 10,000 particles." ] }, { @@ -350,7 +350,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we showcase the use of OpenMC's [tally precision trigger](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element) feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." + "Next, we showcase the use of OpenMC's [tally precision trigger](http://openmc.readthedocs.io/en/latest/io_formats/settings.html#trigger-element) feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." ] }, { @@ -962,7 +962,7 @@ }, "outputs": [], "source": [ - "# Extract the 16-group transport cross section for the fuel\n", + "# Extract the 8-group transport cross section for the fuel\n", "fine_xs = xs_library[fuel_cell.id]['transport']\n", "\n", "# Condense to the 2-group structure\n", @@ -973,7 +973,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Group condensation is as simple as that! We now have a new coarse 2-group `TransportXS` in addition to our original 16-group `TransportXS`. Let's inspect the 2-group `TransportXS` by printing it to the screen and extracting a Pandas `DataFrame` as we have already learned how to do." + "Group condensation is as simple as that! We now have a new coarse 2-group `TransportXS` in addition to our original 8-group `TransportXS`. Let's inspect the 2-group `TransportXS` by printing it to the screen and extracting a Pandas `DataFrame` as we have already learned how to do." ] }, { diff --git a/examples/jupyter/mgxs-part-iii.ipynb b/examples/jupyter/mgxs-part-iii.ipynb index bf871501c..5d16879c9 100644 --- a/examples/jupyter/mgxs-part-iii.ipynb +++ b/examples/jupyter/mgxs-part-iii.ipynb @@ -299,7 +299,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the assembly and then assign it to the root universe." ] }, { @@ -513,7 +513,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we will instantiate an `openmc.mgxs.Library` for the energy groups with our the fuel assembly geometry." + "Next, we will instantiate an `openmc.mgxs.Library` for the energy groups with the fuel assembly geometry." ] }, { @@ -524,7 +524,7 @@ }, "outputs": [], "source": [ - "# Initialize an 2-group MGXS Library for OpenMOC\n", + "# Initialize a 2-group MGXS Library for OpenMOC\n", "mgxs_lib = openmc.mgxs.Library(geometry)\n", "mgxs_lib.energy_groups = groups" ] From 83e1df46153c93f3980f63049b09d72729042f21 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 23 Mar 2017 12:59:52 -0500 Subject: [PATCH 004/123] Ability to read products/yields from files 9 and 10 --- openmc/data/reaction.py | 99 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 5 deletions(-) diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 627f3956c..ac3a049ab 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -94,7 +94,7 @@ def _get_products(ev, mt): # Get yield for this product params, yield_ = get_tab1_record(file_obj) - za = params[0] + za = int(params[0]) awr = params[1] lip = params[2] law = params[3] @@ -106,9 +106,8 @@ def _get_products(ev, mt): elif za == 1000: p = Product('electron') else: - z = za // 1000 - a = za % 1000 - p = Product('{}{}'.format(ATOMIC_SYMBOL[z], a)) + Z, A = divmod(za, 1000) + p = Product('{}{}'.format(ATOMIC_SYMBOL[Z], A)) p.yield_ = yield_ @@ -467,6 +466,93 @@ def _get_fission_products_endf(ev): return products, derived_products +def _get_activation_products(ev, rx): + """Generate activation products from an ENDF evaluation + + Parameters + ---------- + ev : openmc.data.endf.Evaluation + The ENDF evaluation + rx : openmc.data.Reaction + Reaction which generates activation products + + Returns + ------- + products : list of openmc.data.Product + Activation products + + """ + file_obj = StringIO(ev.section[8, rx.mt]) + + # Determine total number of states and whether decay chain is given in a + # decay sublibrary + items = get_head_record(file_obj) + n_states = items[4] + decay_sublib = (items[5] == 1) + + # Determine if file 9/10 are present + present = {9: False, 10: False} + for i in range(n_states): + if decay_sublib: + items = get_cont_record(file_obj) + else: + items, values = get_list_record(file_obj) + lmf = items[2] + if lmf == 9: + present[9] = True + elif lmf == 10: + present[10] = True + + products = [] + + for mf in (9, 10): + if not present[mf]: + continue + + file_obj = StringIO(ev.section[mf, rx.mt]) + items = get_head_record(file_obj) + n_states = items[4] + for i in range(n_states): + # Determine what the product is + items, xs = get_tab1_record(file_obj) + Z, A = divmod(items[2], 1000) + excited_state = items[3] + + # Get GND name for product + symbol = ATOMIC_SYMBOL[Z] + if excited_state > 0: + name = '{}{}_e{}'.format(symbol, A, excited_state) + else: + name = '{}{}'.format(symbol, A) + + p = Product(name) + if mf == 9: + p.yield_ = xs + else: + # Re-interpolate production cross section and neutron cross + # section to union energy grid + energy = np.union1d(xs.x, rx.xs['0K'].x) + prod_xs = xs(energy) + neutron_xs = rx.xs['0K'](energy) + idx = np.where(neutron_xs > 0) + + # Calculate yield as ratio + yield_ = np.zeros_like(energy) + yield_[idx] = prod_xs[idx] / neutron_xs[idx] + p.yield_ = Tabulated1D(energy, yield_) + + # Check if product already exists from MF=6 and if it does, just + # overwrite the existing yield. + for product in rx.products: + if name == product.particle: + product.yield_ = p.yield_ + break + else: + products.append(p) + + return products + + def _get_photon_products_ace(ace, rx): """Generate photon products from an ACE table @@ -653,7 +739,7 @@ def _get_photon_products_endf(ev, rx): photon = Product('photon') items, xs = get_tab1_record(file_obj) - # Re-interpolation photon production cross section and neutron cross + # Re-interpolate photon production cross section and neutron cross # section to union energy grid energy = np.union1d(xs.x, rx.xs['0K'].x) photon_prod_xs = xs(energy) @@ -1086,6 +1172,9 @@ class Reaction(EqualityMixin): else: rx.products.append(neutron) + if (8, mt) in ev.section: + rx.products += _get_activation_products(ev, rx) + if (12, mt) in ev.section or (13, mt) in ev.section: rx.products += _get_photon_products_endf(ev, rx) From 997247d5d5c84e9052a3ee76c0842b0f901d8b63 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sun, 28 May 2017 15:22:31 -0400 Subject: [PATCH 005/123] plot pin power normalization guide tube were making the mean wrong --- examples/jupyter/mg-mode-part-i.ipynb | 8 +++++--- examples/jupyter/mg-mode-part-ii.ipynb | 21 ++++++++++++++------- examples/jupyter/mg-mode-part-iii.ipynb | 9 ++++++--- examples/jupyter/mgxs-part-iii.ipynb | 7 ++++--- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/examples/jupyter/mg-mode-part-i.ipynb b/examples/jupyter/mg-mode-part-i.ipynb index b8fd33d49..5addb34ea 100644 --- a/examples/jupyter/mg-mode-part-i.ipynb +++ b/examples/jupyter/mg-mode-part-i.ipynb @@ -404,7 +404,8 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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 +PJQUS+LSJ7LT+LAUBV16jq\n6QBuAfCZUsyiSi1tEJHlIrJbRHa/8OsXYj8HISQxzicHVb3QU9dXAHwTwOcweFI4vXJuLoCna/Rv\nBrAZAN5+0jyrAyGEdE/btxXzKoeXAvhhsX8ngE8Uby3eC+AFVeWQgpAxom3M4VoReQeAVwE8CeDT\nRftdAC4BsB/AiwA+2bIfQkjHtHIOqrqkpl0BrGyjmxAyWjhDkhBihc6BEGJFBiOAfiAi/4dB7MLG\nSQCe69CcOmjHVGjHVPpgh8uGM1T1ZJeSXjmHJkRkt6pO0A7aQTu6sYHDCkKIFToHQoiVcXIOm0dt\nQAHtmArtmEof7Ehiw9jEHAgh3TJOTw6EkA7pvXPoS7UpEdkgIj8s+rpDRGZVzl1T2PG4iHwgsx1L\nReQxEXlVRCaMc13acXHRz34RuTpnX5a+t4jIsyKyt9I2W0TuEZEniu0JmW04XUTuE5F9xe/jr0Zk\nxxtE5Lsi8v3Cjr8v2s8SkYcKO24VkaODlatqr38AHF/Z/0sANxT7lwDYiUF6+HsBPJTZjj8FcFSx\nfx2A64r9cwB8H8AxAM4C8GMAMzLacTaAdwC4H8BEpb0zOwDMKPS/FcDRRb/ndPg3cT6A9wDYW2n7\nRwBXF/tXl7+fjDbMAfCeYv9NAH5U/A66tkMAHFfszwTwUHE/3AZgsmi/AcBfhOru/ZOD9qTalKp+\nS1VfKQ4fxCANvbRjm6q+rKo/xSDZ7NyMduxT1cctp7q041wA+1X1J6r6GwDbiv47QVUfAPC80bwY\nwNZifyuAD2W24RlVfaTY/yWAfRgUNOraDlXVXxWHM4sfBfB+AF9rY0fvnQMwqDYlIk8B+HO8Vqey\nrtpUFyzD4Kll1HZU6dKOvnzmKqdqURag2J7SVcciciaAd2PwX7tzO0Rkhog8CuBZAPdg8FR3uPLP\nLOr30wvnkLvaVCo7imvWAHilsGVkdtjEUtvRk756jYgcB2A7gL82nnI7Q1V/p4Miz3MxeKo723ZZ\nqN7WNSRToJmrTaWyQ0SuAPBBABdoMZgbhR01JLejJ335clBE5qjqM8Xw8tncHYrITAwcwy2q+vVR\n2VGiqodF5H4MYg6zROSo4ukh6vfTiyeHJvpSbUpELgawGsClqvpi5dSdACZF5BgROQuDcvzfzWVH\nA13a8T0A84qI+NEAJov+R8mdAK4o9q8AsCNnZyIiAG4CsE9VvzBCO04u35yJyLEALsQg/nEfgI+0\nsiNnJDVRNHY7gL0A9gD4dwCnVaK0mzAYX/0PKpH7THbsx2Cc/Wjxc0Pl3JrCjscBLMpsx4cx+M/9\nMoCDAO5j8QNEAAAAfklEQVQekR2XYBCh/zGANR3/TXwVg0rmvy2+i08BOBHAvQCeKLazM9vwxxg8\nqu+p/E1cMgI7FgD478KOvQDWFu1vxeCfw34AtwM4JlQ3Z0gSQqz0flhBCBkNdA6EECt0DoQQK3QO\nhBArdA6EECt0DoQQK3QOhBArdA6EECv/D8nj1UuvNoxlAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] @@ -657,7 +658,8 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS4AAAEICAYAAADhtRloAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX2cnVV177+LyRDIC8S8EEISSIQoIGKkkcTiC4pWiC9A\nL7bY+6HoB4nlaquW+7ngywVsayutSq1vGAoVqxexVTTaUI1cXsK1IAGHt0Qk6GCGxIQACQl5ncm6\nf5xnYOZkrz3nzJw5c57h9/18ns+cs/az197Pc85Zs5+99lrb3B0hhCgTB4x0B4QQol5kuIQQpUOG\nSwhROmS4hBClQ4ZLCFE6ZLiEEKVDhqvEmNnNZnb+SPdDiGZjWsfV2phZJzAd6AGeA5YDf+7u21tR\nrxDNQCOucvBOd58AnAS8Bvhki+utCzMbMxLtivIiw1Ui3P0J4GbgBAAzu83M3l+8fq+Z3WlmnzWz\nZ8zsN2Z2xiD1HmFmy8zsaTNba2YXFvKDzGynmU0t3n/SzLrN7JDi/d+Y2T8Wr8cWffmtmW00s6vN\n7OCi7FQz6zKzS8zsd8C/mNlUM/uRmW0p2l1pZvp+iiT6YpQIM5sNLAZ+EZyyEHgEmAr8PXCtmdkg\n9N4AdAFHAOcAf2tmp7n7LuAe4I3FeW8AHgdO6fP+9uL1lcDLgPnAMcBM4LI+zR4OTAaOApYAFxdt\nTqPyCPtxQPMYIokMVzn4vpltAe6kYhj+NjjvcXe/xt17gOuBGVSMQM16CyP2OuASd9/l7h3APwPn\nFXVuB95YPN6dCPxT8f4gKo+bKwtjeSHwUXd/2t23FX0+t0/b+4DL3X23u+8E9hb9Pcrd97r7StcE\nrAjQ3EI5OMvdf1rDeb/rfeHuO4rB1oR69JrZEUCvsenlcWBB8fp24PNU5sUeBFYA1wKLgLXuvtnM\nDgPGAff2GfAZ0NZH55PFCK6XfwCuAH5S1Fnq7p8Z6ILFixONuEQ164HJZjaxj+xI4Ini9c+AlwNn\nA7e7++qi/O288Ji4GdgJvMLdJxXHoYUjoJd+oyl33+buF7v7S4F3An9pZqc1+uLE6ECGS/TD3ddR\nMU5/V0zGnwhcAHyrKN8B3At8kBcM1c+AD/S+d/d9wDXAVcXoCzObaWZvi9o1s3eY2THFY+azVJZp\n9AzDJYpRgAyXSPEeYA6V0ddNVOaiVvQpvx1oB37e5/1E4I4+51wCrAXuMrNngZ9SGalFzCvO2Q78\nF/AVd79tqBciRidagCqEKB0acQkhSocMlxCidMhwCSFKhwyXEKJ0NHUB6tQx5nPaEwVtCdlA5Bzl\nUZDLwYF8d0ZX1LecyZ8YyPdk6hwYyFP3K9cGsHPM2KR8N2k5wM7g5oyhOynfxGGhrp7gpvXsiz/o\nfc8FX8V08/nPP7rPka6ByuptZ18gz/nB9gbyXMDWIQnZc534rs0DhnnlOMbMd9R47gb4sbufPpT2\nBkNTDdecdlh1TKJgfKZS1MOnMnUOCuQnBPLfZHRFfcv1+Y2BfF2mzuxAfkRa7JmlmQ9MPjIp72Ru\nWOdBXpmUT2FzUv5F/iLUtS2wqluemxTW2X7XtHRBuvnKoomIrkAe6YI+MQdV5H4hnYF8V53ywbaf\nMhfLFySE9bGDyqK8WriiEhfbdBTyI4Toh9H6hqHV+yeEaDIHEM+qtAoyXEKIfhjx1GqrIMMlhOiH\nHhWrOYhKRFo1uYnunwyinUDf3d9MyxfGc9YwJS3e8f/iKuO2BgXp+e8KmwJ54PG0jljVyxc+mpTv\nHD8urPNT0rP90UT7x8OUYHAjf5yUt42PXXc/O+2UpHwSzyTlO4mvpev+1JcM2BJWiSfac0R1InnO\nOTArkOemvlO3swERfBpxCSFKh0ZcQojSoRGXEKJ0yKsohCgdGnEJIUpJqxuGVu+fEKLJaMRVTTfw\ndEJ+d1zl0WCZwG2DaP7CINvrnZmtB18XLK0Ytz32O++dlNbXvj7uG2sCfX8Y9C0Tq3lQsLyje24c\n5Dw2iBjeEcx2rOb4UFdUZyLbknKAhcGX4Ie8Oyk/nvtCXQcc/lxS3vOqeN2NRXGED4VV8MsDXRfF\ndUKi2MtcfGO0hGKIyKsohCgdmpwXQpQOPSoKIUqHHhWFEKVDIy4hROnQiKuag0lmIX3qzrjKE4E8\n8hAC3Bh4CW8O5GcEMblAGOTsU2JPZHuU1filmXYWBfqiFMXfy0TT/t+0rulzo0humBK4KSMPYY43\nBT7fT/LZsM55XJOUn8UNSfm6594S6po4Ke29nNKTibLunhmXBdiXg4IgA6//MKPr7KAgThqbDsCO\nUoDXwagYcZnZQVR2KB5bnP/v7n65mc0Fvg1MBu4DznP3XFZ1IUQJMFrfq1jLLj+7gTe7+6uA+cDp\nZrYIuBK4yt3nAc8AFwxfN4UQzcKA9jG1HQPqMpttZrea2Roze9jMPpw451Qz22pmHcVx2UB6B2za\n3Z0Xlse1F4cDbwb+pJBfD1wBfHXgSxFCtDJmMKbWSaSBd0fqBi529/vMbCJwr5mtcPfVVeetdPd3\n1NrHmvZVNLM2M+ugku5uBfAYsMXde7vdBSQnCcxsiZmtMrNVT+6stVtCiJHCDNrbajsGwt03uPt9\nxettwBoCW1EPNRkud+9x9/lUggxOBo5LnRbUXeruC9x9wbRWf3AWQjw/4qrlAKb2DkyKY0ms1+YA\nryYd5PdaM7vfzG42s1cM1Me6vIruvsXMbgMWAZPMbEwx6poF5CLxhBAlwQza472Dq9ns7gNu5mhm\nE4DvAh9x92eriu8DjnL37Wa2GPg+6STvz1OLV3EasLcwWgcDb6EyMX8rcA4Vz+L5wA8G0sVWYPn+\n4u7MrsRR/PVtmcDoKLX7Ubl+BTwVBDPnJiYPSadPjzeqzfVhUSD/RGaz4uBrlFvaEOV23xL44xew\nKtQVBWB/lL8L62xjTlIe5ZafND5e2rB5a3qjgJ7uzIc2mIVB0cazweds78noir4buX4NU875Ri/k\nMrN2KkbrW+7+veryvobM3Zeb2VfMbKq7h1n6a+neDOB6M2uj8mj5HXf/kZmtBr5tZn8D/AK4ts7r\nEUK0Ig00XGZmVGzDGnf/fHDO4cBGd3czO5mKncntVV+TV/EBKs+l1fJfU5nvEkKMNho34joFOA94\nsHDwAXwcOBLA3a+m8uR2kZl1AzuBc4vVDE3onhBidGBADR7DWnD3OwuNuXO+BHypHr0yXEKI/pQg\nWLHFuyeEaDpGJcCvhWmu4WoHjthf/Oxv4iqXBI+6n854FVOLzACOD3TtmBDreiLweJ7YHT+CdwV9\nm5XbMfvXgb7Ie5jTdXZa1+yMV3ELLwnqrEvKo6BsgMu5Min/HyTnZgGYG2z/fBUfS8pfyT2hro3d\n05PyPVMOCetYtAI8s5O0XxzoSnc5u8rc/y3Q9b64zrChEZcQonTIcAkhSkmDJueHCxkuIUR/NOIS\nQpQOGS4hROmQV7E25iU8jb1EHrrckv3IdxR5D8dlwjlPDJxnudTNsxYHBbl5g/cF+k4Lzk+kwO5l\n13NpXavHnxTW2RPk/N1IlIc6ZiWXJOWP8PpM++lfykJuT8o7n4s3pN17W/obYIsyu6tuDoIFM1Xs\na0FB5D3MeBUtCrCdE9dJ9m1v5vxa0YhLCFE6ZLiEEKWjgSE/w4UMlxCiPxpxCSFKhybnhRClQyMu\nIUTpkOGqog0Yn5BnlkNMfy4tn5Ubyk5Oiz3ayDk4H4Cgfcv0mYWB/KH620neL8i61g8KgtZ7Tog/\n7rUck5RvCpZDzKcjKQdYx+ykfEy4LTdsIJ1ueUeQunl717RQV7hUpCuTO3t7IO+Mq4QB2NFnk/u1\nRV3LpftOldW0/U0NyHAJIUqFvIpCiNKhR0UhROmQV1EIUTo04hJClA4ZriragEMT8kfjKu1bgpTG\nx8VBzr/5ZVo+dxCpm8cF3kO7+/Kwjh/6qXRBFEgL8NngOpcHfct9ciekde3JBDlHG8IeEWxQPoVw\nr06uJH1v3p/ZyOVA9iTlP+Td6faPeSLUtWVzehPbfcf+Q1iH265IyzNePb8gLbfg4w89l4AHmajt\n7LhO8juQ3U+nRkpguAZ0nprZbDO71czWmNnDZvbhQn6FmT1hZh3FEeVEEEKUjbYajxGiFrvaDVzs\n7veZ2UTgXjNbUZRd5e6fHb7uCSGaTglGXLXsZL0B2FC83mZma4CZw90xIcQIUQKvYl3rbM1sDvBq\n4O5C9CEze8DMrjOz5P5WZrbEzFaZ2aondw+pr0KIZtA74qrlGCFqNlxmNgH4LvARd38W+CpwNDCf\nyojsc6l67r7U3Re4+4JpLW7FhRCUwnDV1LSZtVMxWt9y9+8BuPvGPuXXAD8alh4KIZrLaAj5MTMD\nrgXWuPvn+8hnFPNfAGeTDyHOc2SuLPDvZurMPTYomBnknI+CooEg9hc/IfJ5E2+l/cZMOzfVt2P1\nc8fFg+UdTEzKt2WWQ0REOecnsSWs807S2zI/RZwnPgrynsGvk/KnV7001BUuYbjrirjOnYH8d3GV\ncNlDVyBfm9EVfTTplR0VUtf5IlkOUUv3TgHOAx40s96UAB8H3mNm8wGnEkP/gWHpoRCiuRj5rBQt\nQC1exTtJ2/Hlje+OEGLEaeCjopnNBr4BHA7sA5a6+xeqzjHgC8BiYAfwXne/L6e3xQeEQoim09hH\nxeQ6UHdf3eecM4B5xbGQiuMvN4HTsLRjQojRRIO8iu6+oXf05O7bgNQ60DOBb3iFu4BJZjZjoO4J\nIcQL1PeoONXMVvV5v9TdlybV7r8OtJeZwLo+77sK2QYCmmu4ohW5udTJ0Q3M7D4d+jcDDyHTM7oi\nD2U69rhCKpAcINgVGwg9kc++sj0pb+uO0yD3BDdtS8ZFtS3wRG4P5OuJ/yFGunI8tTH94bSNCa5z\nVmaL6Z8GM8s5D130S4jSM0OcojlyuB6e0bUqU1Zv+0OlvkfFze6+YECV+68DrW6xmiDrQAWNuIQQ\n/WlwyE9qHWgVXdBvo4JZ5IcGmuMSQlTRwJXz0TrQKpYBf2oVFgFb+6wRTaIRlxCiP431KkbrQI8E\ncPerqSytWkxlie4O4H0DKZXhEkL0p4GGK7MOtO85DnywHr0yXEKI/Sl7rKIQ4kXGKIlVbBzjgZTj\n9CeZOrcEXtG3Z0afkUdkMLrWBfJrMt7af64/MJz5aX2HLAt0vSxWNf7YtD/+YM4K6+wMdoyOcsHP\nDm8MfJH/lZS/jR+EdV4+/ZGkfDUnpfv1VLVH/QX2HpNeDuGnhFWwHwcFwf4FAP7hQNeFQYUo+Brw\nYN8Fe2dcJ6kv/XHVRwkSCba4XRVCNB2NuIQQpUOGSwhROmS4hBBlxOVVFEKUCT8A9pQ9kWDDW0tl\nAs7t1vtHg8hF+7ZAfmF96ZEBOC2Q/1WmX9GO1cGu2AB01OeJfHZeOvgaYBW/n5Q/FsghDsA+jE2B\nrnSqZYBz+GZSvjFTJyJK3by3o/7UzfYfmYaitMqZWG67MiiIvIdxtmvsNUFBzoBMSMiyocm14Qbd\nbbVGA+4beoODQCMuIUQ/3IyeMbWahkasv6gfGS4hxH70tLX2JJcMlxCiH46FOd1aBRkuIUQ/HKNb\nhksIUSYcY0+Lx/w013BNAF6XkAdxWkC818fFGffJ5YGHLvoszsu0vzWQR95GiL2HuzN1IoI6h7TF\nk6Ibg5jENuJ0z1G65d3BTZvK5lDXM4GHsoNFYZ1Xck9SPibqc+6bG8UXZjyEYRrkTKxiMu4WwnTP\nfnOsyl4bFGQ8kclU0A0YKJXhUXFAn6eZzTazW81sjZk9bGYfLuSTzWyFmT1a/H3J8HdXCNEMemir\n6Rgpalms0bsv2nHAIuCDZnY8cClwi7vPA24p3gshSk7vHFctx0hRy07WGyi2CXL3bWbWuy/amcCp\nxWnXA7cBlwxLL4UQTaPyqNja09919a5qX7TpvQnt3X2DmaXWxGNmS4AlAEdWbwMphGg5KpPzB450\nN7LUbLiq90WrbN4xMMXmkEsBFpxoDQhIEEIMJw6jYzlEsC/aRjObUYy2ZkAQ1CaEKBmj4FExsy/a\nMuB84DPF3zgvb8HeA9v43ez9I0PHHbEjrHPI5L3pguWZEd/8QH52MOC7O6Mr2pV6YTx4/CVzkvIp\nma2sp7EtKX88GZUOKzkn1LWaE5Pyxzg6rLM2CICexDNJeW5X7KjsZdwf1ukJUkevC7Yst9wygeBb\n7Zl9ZOwLQcGsuE6kz34ayN8a6wrJBVmnlnA0Isi6BMshajGr0b5onwG+Y2YXAL8F3j08XRRCNJvS\nG64B9kXLLcMUQpSQ0TLiEkK8iHAsjJhoFWS4hBD90IhLCFE6ZLiq2Es76xMRyDvaDg7rTJ+fXmXR\nNj+KioWngijXOUEg8bqFx4W6Ig/ZbGaHdTYHnsAHw5zOAOmdPzfyrqS8I3SdkrzHEAdSA+zZnV5w\nOGZsOsh5bCZifGLgIX3kqZfHdSal60zq/l26wjGpCOOCh9Ji+1pche2BPAiYBrCLgoJUSmWA4FKA\nvPewnjqDyHSeYlSs4xJCvHgoQ8hPrRnxhRAvEnofFRuRHcLMrjOzTWaWHAeb2almttXMOorjslr6\n2NpmVQjRdCpexYbFKn4d+BLwjcw5K939HfUoleESQvSjkY+K7n5HkZyhoehRUQixH01OJPhaM7vf\nzG42s1fUUkEjLiFEP+pcDjHVzFb1eb+0yAhTK/cBR7n7djNbDHwfggDVPjTVcG3hUH6YcPvvCAJs\nAY5gfVKec+1HN/0wNiblOzPtrwuWPeTcxdEwO9IF8XV2BgHbuSDnR3anlx3s3hXPW+zqnJwuODYt\n3rYlvv/7toxPF8Rp6nm645B0QbS0ILd8YBC7UtMZyKP2IVx2EeaJzwWGR8sx4o853bcGbCxdp+Ha\n7O5R9v2B23J/ts/r5Wb2FTOb6u6Zb4tGXEKIKpoZ8mNmhwMb3d3N7GQq01dxGpUCGS4hRD8auXLe\nzG6gkuJ9qpl1AZcD7QDufjVwDnCRmXUDO4Fz3X3A5DwyXEKI/WiU4XL39wxQ/iUqyyXqQoZLCNEP\n7WQthCgdZQj5aWrvxtDDpIRrZTATgbmhbPTf4rEgPXFOV7T7c+o6enmEtFcvF5gceQ+ja8l5YqeM\nTc9tjhsbp8je9qp0MPvjPw7cirlvTuQPynnVopj5KDA5pyvyHkaeu1z7uZ2sozpR33L3bDC/xNR9\njnMP1IWyQwghSsWo2p5MCPHiQHNcQojSoTkuIUQp0RyXEKJUKHVzFVuYxLJErOKfEefU3cyUpDzy\n9kH9MYk5XVFeouNZHdaJ9OXiC6M+dzI3Kd8QpGeGOHVyFA8JcOvWU9MFUZfr3agUspurZr2EKQYT\nd5iNfgvI9TnyeEZZpbsyutIO7zyptNIN+EWXYY5rwLQ2qQyGZnaFmT3RJ2vh4uHtphCiWVS8imNr\nOkaKWvJxfR04PSG/yt3nF8fyxnZLCDFSNDJ183BRy07Ww5LBUAjRurT6HNdQMqB+yMweKB4lXxKd\nZGZLzGyVma3a8+TWITQnhGgGvXNctRwjxWAN11eBo4H5wAbgc9GJ7r7U3Re4+4IDpx06yOaEEM2i\ndx1XLcdIMaiW3f15F5iZXQP8qGE9EkKMKKM25MfMZrj7huLt2cRJbPuxg3F09Lx6P/ndbQvDOlHA\n8kLuDutE3o6/5CtJ+VncEOo6njVJ+Tu4Jazzdb6ZlEc7TAP8jDcn5X/M9Un50TwW6lq5+/Xp9sfG\n7e9aFaRujsh9c6LlABMy+eGmprdg9mDza/tBpv0gLtzfHlexK4OCzriOrwh0nRFUGMwSktyyjxfx\ncogBLzPIYHiqmc0HnMpH+4Fh7KMQosmUPuQnyGB47TD0RQjRAmjlvBCidMhwCSFKSennuIQQLy72\nccCIhvPUQlMNV8/Odp7+5cz95MtesX/gdS8v51dJ+Sf5bFgn8hJu5LKk/IhM8PO9/F5S/oWMP2Iz\nZwfydMA4wNtIu8l2BJ7Ilbw11HX02IeT8i09md1Fo6Jc6uKIlLcL8KPTnkMAuzeQ3x5UyAVMB967\n0HMI8XVmUiFbtH9N0L7fnNGV/spkvZpJj2MDNoSF1l85rxGXEKIfmuMSQpQOR3NcQojSodTNQoiS\noUdFIUTpcCzM/NsqyHAJIfqhXX6qcZIu3JdkEo5HQ9bTMgkpxgZrUO7m5KQ8yusOcZ72H/O2sE6U\nW34LYdoy1rOnLl1zMusUDgx8+JPa4vv8dPf+y1SA+ndrhnBpRbTkIasvF2QcEe1YndMVBUDndr+O\n6gRLNSwd+15hQiDP/UJT7Q8lw14f9KgohCgVZZjjapB9FkKMFhyjZ19bTcdApDbbqSo3M/snM1tb\nZFQ+qZY+asQlhOiH7zN272pYyM/XgS8B3wjKzwDmFcdCKtmV4wR9BTJcQoh+uBs93Y15VKxhs50z\ngW+4uwN3mdmkqkSlSWS4hBD9ceoxXFPNbFWf90vdfWkdrc0E1vV531XIWshwdVP3bsLL+cOkPOdV\n3MbEpDwKTJ7PXaGuaFfoqF8Ax3NfUj6OHWGdB3lNUn406YDp6cHO1xCngbbHMqmTI69e9HkFgdQA\nno5Lx26M64SByWcOQldnoOvyuIp9NKMvwL8a6IoCpqOdrwFfGejKeSJTn1m8KXvNuBvde2s2XJvd\nfcEQmktF3me+qBU04hJCVGHs62maaegCZvd5PwuCNUh9kFdRCNEfB7rbajuGzjLgTwvv4iJg60Dz\nW6ARlxCimn0GuxpjGoLNdtoB3P1qYDmwGFgL7ADeV4teGS4hxP5kEijWQ7DZTt9yBz5Yr14ZLiFE\nfyoJuVqaWvZVvA54B7DJ3U8oZJOBG4E5VHw4f+TuzwzYWuBVfGR3sOsncPCup4OS3w/r7No+Limf\nOOnJpHzH9leGuu7vWpTu1zFRv2DX2vTi30NPiN1K0XXuWvuKpPzXk44PdVnUzOY4dXJIvd5GwP4j\nKMjFCgbt2NcGoSv40dmnM3WiX0KmnbrTLWfiHm3/fZIr5H6hKX0N8CqWwXDVMjn/deD0KtmlwC3u\nPg+4pXgvhBgNOLC3xmOEGNBwufsdQPVw4Ex4fm/464GzGtwvIcRI4cDuGo8RYrBzXNN7XZbuvsHM\nDmtgn4QQI0kJHhWHfXLezJYASwCYcuRwNyeEGColMFyDXYC60cxmABR/N0UnuvtSd1/g7gs4ZNog\nmxNCNI1ew1XLMUIM1nAtA84vXp8PwW6mQojyUQLDVctyiNTK188A3zGzC4DfAu+uqbU9VCKTqtja\nNb3W/r7Aroxrf0La3bEjWCaxr3N8rCtIQ7yra3JcJ3Dtb+04vO52Qhf6QZnrz6Ubjqg3mDq3w/UJ\ngTxKTwz1/wg6M2X13kuorNtOUe9yhBw5XdGyk1wbqa9Tozx9Lf6oOKDhyqx8Pa3BfRFCtAL7GFyu\n/yailfNCiP6UYHJehksI0R8ZLiFE6ZDhEkKUEhmuPkSpmzMeQk/HGHPw1kyQc0fa49fzxvak3DpC\nVUkvKADnXBHX+VFQdmw84+kz07mLLcoqnfnkPNir1r4b1wm9Wp2BPOMg9f8etP+tTPvB9fj5abn9\n74yuKMj86iviOqcHZbn7vCItt9cGFTKb6PpvAl3xXsVpL20jcvtpxCWEKB37gJ0j3Yk8MlxCiP44\njUmPM4zIcAkh9kePikKIUqE5LiFE6ZDhEkKUDoX8VBEEWed2+LUomLc7E+Qc6LPow+iMVYWBwdGS\nB4gDlm8Ltmsm07coyDaX8/3KoCD3aUfLPqL2c/nTvxAUPJRpP7jP1hmcn/ +nOhMsOcktYovufu89R\n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\n", "text/plain": [ "" ] @@ -678,7 +680,7 @@ "fission_rates.shape = mesh.dimension\n", "\n", "# Normalize to the average pin power\n", - "fission_rates /= np.mean(fission_rates)\n", + "fission_rates /= np.mean(fission_rates[fission_rates > 0.])\n", "\n", "# Force zeros to be NaNs so their values are not included when matplotlib calculates\n", "# the color scale\n", diff --git a/examples/jupyter/mg-mode-part-ii.ipynb b/examples/jupyter/mg-mode-part-ii.ipynb index 7d3cf305c..d9a30cd9d 100644 --- a/examples/jupyter/mg-mode-part-ii.ipynb +++ b/examples/jupyter/mg-mode-part-ii.ipynb @@ -296,7 +296,8 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -925,7 +926,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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 +AotESBwBGIicrg5uOH8oT\n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 +PGGNMS+YlceSr6oc4\n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\n", "text/plain": [ "" ] @@ -935,7 +938,9 @@ }, { "data": { - "image/png": "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\nRU5ErkJggg==\n", + "image/png": "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\n/doAhwIfR/ +k7MCYqVsVk6opwVUz+b/azcG74AD8CzhURf8LIAzq4zyeq6lb3+UnAm6paAawXkY/B\nmTtaRF4Bfi4iI3ESxxURYuwBHAFMFBFwVghb5743DnhWRBrhLPf5lqqWR7poY2rDEoQxUOL+LOfA\n/wkBLlTVJYE7isixwJ7ATWGOOxIYCxTjJJFI7RUCLFDV46u/oar7RGQC8BOcksRvIhzLmFqzKiZj\ngvsAGC7uV3kROTrEfp8BF7ptEa2AAf43VPUHnPn47wZGeTjnEqCFiBzvnjNHRA4PeH8McAvOmskz\noroaY2rAEoSpK6q3QTwaYf8HgBzgGxGZ774O5j840y3PB/4BfAHsCHj/NWC1HljvOCRV3Y/TO+lP\nIjIXmAOcELDLh0Ab4N9q0zCbBLDpvo2pJRFpoKq73XWovwROVNX17ntPA1+r6oshPrsSKIrQzdVL\nDKOAcar6Vm2OY0wgK0EYU3vjRGQO8CnwQEBymAX0Bl4N89lNwKRwA+UiEZHXgFNx2jqMiRkrQRhj\njAnKShDGGGOCsgRhjDEmKEsQxhhjgrIEYYwxJihLEMYYY4KyBGGMMSao/wcNeDRljfvF4QAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] @@ -945,7 +950,8 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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 +ARKzZVMm54X649\nbk/6dmldQ3rljhqWbdjGbj06JSjStpHoK44KM7sWOA94PHzeIi37ubn7NHefWFpamupQRCTNFeXn\n8q0xg3nh+2O54sg9eOa9FRz5h5e46fmFVO5o+SNjlz8wlyP+8FKrjpHuYkkcZwJVBM9zrCDoNvv7\npEYlItJGigtyueroITx31eGMHdqDPzz7IUf98SWeendFi2ayfG7+SgA+W7c10aGmjWZ7VYUTN90P\nHBjOz/G6u7eqjSNZ1KtK6lnxjublkJgNIGjQ3ThwB5+s3cK2qTV8UJzP7j06UZAbexfeBwvWAtDz\nHyVQnJ1DpDT72zCzM4DXgdOBM4BZZnZasgNrCd2qkp32PQ1675vqKCQDlRbns1//UgZ168Cmyh28\ns3QjG7Ztb37HBrZXJ+Nxt/QQS+P428DR7r4qXO8BPOfujT3MmRbUHVdEEmHBigouf+BNFq3ezKWH\n787/O3oI+VGuPrZX1zLkJ08C8P2vDeHyI/Zoq1BbLdGN4zl1SSO0Nsb92pyZjTOzSRs3bkx1KCKS\nBYb2LuGxyw/lzPIB3PziR5w1aSafb9jW5PZrt1TtfL1yU1WT22W6WBLAU2b2tJldYGYXEEwb+0Ry\nw2oZ3aoSkUQrLsjlhlP348azR7BgRQXH/+UVnnp3RaPbropIFis2VbZViG2u2cTh7j8AbgX2A4YD\nk9z9mmQHJiKSTk4a3pfp3z2Ugbt04JL75vCjf8xj6/bqetusqggSR9cO+azM4sQRtVdV+MzG0+5+\nFPDPtglJRCQ9De7ekX9cejB/eu5DbnnpI978bD1/P3cku4cP+y1cVQEEI/POW7ohlaEmVdQrDnev\nIRhuJCPu/aiNQ0SSrSAvh2uO3ZN7LzqINZu3c9JNr/LEO8sBmLdkI4O6dWDP3iWsrqiiuiY7e1bF\n0sZRCbxjZneY2Y11S7IDawm1cYhIWzl0j+48fsWhDOldwmX3v8kFk1/nhQWrGL1rN3p1LqLWYc3m\n+LvxZoJYhlV/PFxERCRCn9JiHpo4hr++sIiHZy9hzz6dueKoPXh/2SYgaCDvXVqU4igTr8nEET6v\n0cPd725Qvg+wMtmBiYhkgoK8HK46eghXHT1kZ9nWqqDR/MOVFew/oEuqQkuaaLeqbiKYY7yhfsBf\nkhOOiEjm271HJ7p1LOClD1c3uc1Nzy/kew/ObcOoEida4tjX3V9qWOjuTxN0zRURkUbk5Bgn79+P\np99d0WS33D88+yH/fmsZtbX1R+/YUVPLjjRvVI+WOKINnZ6Ww6qrV5WIpIvzDx4EwA1PfhB1u4YP\nCh5w/bNaqhXLAAASSklEQVSM+OWzSYsrEaIljoVmdnzDQjM7DlicvJBaTr2qRCRdDOrWkcvG7s6/\n5n6+s7tunc1VXzw4+MnaLQA7rzwqKqvrvZ+OovWq+n/A9HB03DlhWTkwBjgx2YGJiGS67xxRxiuL\n1nD11LfpU1rEiIFdAfg0TBbB662s2LiUq6a+zQfXH5uqUOPS5BWHu38I7Au8BAwOl5eA/cL3REQk\nisK8XG49byQ9OxfyrTte5+0lwdPkH6+pnzj+/Fww1fXqiswYGLG5J8er3H2yu18dLne6e/YOwCIi\nkmA9S4qYMmE0XTrmc+4ds5j72Xo+XFGBGfTrUsyna7dQE96m2rB1R4qjjU0sDwCKiEgr9O1SzJQJ\nozn7tpmcOWkmeTnG8P5d6Nohn0/XbqUgL/gbft3WzHjSPC3n1Wgp9aoSkXTVv2sHHr3sEI4e1ose\nJYX8zwl7MahbRz5du2Xn1LQbMiRxNHvFYWYdgW3uXhuu5wBF7p52M7G7+zRgWnl5+YRUxyIi0lC3\nToX87ZwDdq4vWFHBlu01LFkffJ2u35IZiSOWK47ngQ4R6x2A55ITjohI+3H0sF6YwdbtNQCsj2jj\nGPyj9B0iMJbEUeTum+tWwtcdomwvIiIx6NW5iK8N67VzveGtKndvuEtaiCVxbDGznddWZjYSaHrS\nXRERidn1J+/DBQcPJsfqX3EAO3tbRVqybivn3TGL/X/5DP/5IDXjzcbSq+pK4GEzWxau9wHOTF5I\nIiLtR8/ORfz8pL35aPXmL80auKPGycutv/1XfvfCztffvns2i39zQluEWU8sc46/AewJXApcBuzl\n7nOi7yUiIvE4bWR/Pllbv8/RL6e/n6JoomsycZjZEeHPbwDjgCHAHsC4sExERBLkxP36MqxP53pl\n/5q7NEXRRBftiuPw8Oe4RhaNVSUikkC5Ocafz9q/XlnljvQcXr3JNg53vy78eWHbhdM6ZjYOGFdW\nVpbqUERE4jakVwlH7tmT5z9YBYBZ/fcrd9TUW09Vn6tm2zjMrJuZ3Whmb5rZHDP7i5l1a4vg4qVh\n1UUk0932rfKdryOnnf18wzb2/OlT9bZNVW/dWLrjPgisBk4FTgtfP5TMoERE2qucHOPdXxzDKfv3\n5e0lG1iwogKATyJG1E21WBLHLu5+vbt/HC6/ArJv9nURkTTRqTCP68btTafCPH7/dPQZBFMhlsTx\ngpmdZWY54XIGkL7PwouIZIGuHQu46NBdeW7+Kpas21rvttQFBw8GYN9+pfz8sfeY/ck6Rv3vc202\n1lUsieNi4AFge7g8CFxlZhVmtimZwYmItGcn7NsHgBkfra1X3qe0iKG9Snjn843c9donnHbLDFZV\nVDFz8drGDpNwzT457u4lbRGIiIjUV9azEwV5OfzwH/Pqlffv2oE9enViwcqKlMQV00ROZnYScFi4\n+qK7T09eSCIiAmBm1DYyXtVefUpYvnEb0+ctr1feVp2sYumOewPwPeD9cPleWCYiIklWHSaOq48e\nsrNs1+4dGT7gy32UcuxLRUkRyxXH8cD+ERM53Q3MBX6UzMBERAQOLevOq4vW8O2v7Mag7h0pH9QV\nM6NjwZe/vi+5700APrkhuQMfxjrneBdgXfhaT9eJiLSRP5wxnI9Wb6a4IJeThvfdWd6xMDfKXskV\nS+L4DTDXzF4AjKCt49qkRiUiIkAw2VOvzkVfKu/eqTAF0QRiGVZ9CjAa+Ge4jHH3B5MdmIiINK1j\nYR6Xjt09JeeOpXH868BWd3/M3f8NVJrZKckPbef5dzOzO8zskbY6p4hIJrjm2D05du/eXypvrCdW\nIsXyAOB17r6xbsXdNwDXxXJwM7vTzFaZ2bsNyo81swVmtsjMojayu/tidx8fy/lERNqbY/bp9aWy\n5z9YxX8XrUnaOWNJHI1tE2uj+l3AsZEFZpYL/A04DhgGnG1mw8xsXzOb3mDpGeN5RETapZOG92O3\nHh3rlU24ZzbfvH0Ws5L0JHksiWO2mf3RzHYPbxv9CYhp6lh3f5kvemPVGQUsCq8k6oYwOdnd33H3\nExssq2KtiJlNNLPZZjZ79erVse4mIpLRcnOM/1w9ttH3VlZUJeWcsSSO7xKMUfUQ8DBQCXynFefs\nByyJWF8aljUqnA/kFmCEmTXZm8vdJ7l7ubuX9+jRoxXhiYhknhe/P/ZLZVdMmcvGbTsSfq5Yxqra\nQviwX3ibqWNY1lKNPdvYZEuOu68FLmnF+UREst7g7h0bLb/s/jnccf6BFOUn7rmPWHpVPWBmnc2s\nI/AesMDMftCKcy4FBkSs9weWteJ4O5nZODObtHHjxuY3FhHJMo9fceiXyv67aC2H3PAf3J2bnl/I\ne8ta//0Yy62qYe6+CTgFeAIYCJzXinO+AexhZruaWQFwFvBYK463k6aOFZH2bO++jX/3rd2ynW/d\n+Tp/ePZDTrjxVbyVc87GkjjyzSyfIHH82913EOMgjGY2BZgBDDWzpWY23t2rgcuBp4H5wFR3f69l\n4X/pfLriEJF27Z6LRnHCvn146sqv1Ct/ZeEX3XMn3DO7VcnDmtvZzK4ArgHeBk4guOK4z92/EnXH\nFCovL/fZs2enOgwRkZSp3FHDnj99Kuo244b35aazRwBgZnPcvTyWYzebOBrdySwvvHJIS0ocIiJQ\nXVOLmfHJ2i0c+YeXADijvD9TZy/duc3bP/sapR3yE5s4zKyU4EnxuomcXgJ+Gfk0ebpR4hARqe+/\ni9awYEUFFx26KzW1zi0vfcTvn14AwE9O2IsJh+0ec+KIpY3jTqACOCNcNgGTWxh7UqmNQ0SkcYeU\ndeeiQ3cFgocGLz38iwESf/X4/LiOFUvi2N3drwuf9F7s7r8AdovrLG1EvapERGKTk2N8cP2x/O7U\n/eLfN4ZttpnZzs7BZnYIsC3uM4mISFopys/ljAMH8MC3D4prv1gGK7wEuCds6wBYD5wfZ3xtwszG\nAePKyspSHYqISMYwi2+y8qhXHGaWAwx19+HAfsB+7j7C3ee1PMTk0a0qEZH45cSXN6InDnevJXhY\nD3ffFD5BLiIiWSShVxyhZ83s+2Y2wMx2qVtaFp6IiKSbOPNGTG0cF4U/I4dSd9KwZ5XaOERE4pfQ\nW1UA7r5rI0vaJQ1QG4eISMsk+FaVmX3HzLpErHc1s8taEJmIiKShhF9xABPcfUPdiruvBybEdxoR\nEUlXyWgcz7GIo4azABbEGZeIiKSpisr4ppeNJXE8DUw1syPN7AhgChB9rN4U0VhVIiLxG7VrfB1l\nYxkdNwe4GDiSoAXlGeB2d69pYYxJp9FxRUTiE8+w6s12xw0fAvx7uIiISDvXbOIwsz2A3wDDgKK6\n8nTtkisiIskVSxvHZIKrjWrgq8A9wL3JDEpERNJXLImj2N2fJ2gP+dTdfw4ckdywREQkXcUy5Ehl\n2EC+0MwuBz4HeiY3LBERSVexXHFcCXQArgBGAueRxvNxqDuuiEhyNdsdNxOpO66ISHwS0h3XzB6L\ntqO7nxRvYCIikvmitXGMAZYQPCk+i3iHTxQRkawULXH0Bo4GzgbOAR4Hprj7e20RmIiIpKcmG8fd\nvcbdn3L384HRwCLgRTP7bptFJyIiaSdqd1wzKwROILjqGAzcCPwz+WGJiEi6itY4fjewD/Ak8At3\nf7fNohIRkbQV7YrjPGALMAS4InJKDsDdvXOSYxMRkTTUZOJw91geDkwrZjYOGFdWVpbqUEREslbG\nJYdo3H2au08sLS1NdSgiIlkrqxKHiIgknxKHiIjERYlDRETiosQhIiJxUeIQEZG4KHGIiEhclDhE\nRCQuShwiIhIXJQ4REYmLEoeIiMRFiUNEROKS9onDzE4xs9vM7N9m9rVUxyMi0t4lNXGY2Z1mtsrM\n3m1QfqyZLTCzRWb2o2jHcPdH3X0CcAFwZhLDFRGRGESdATAB7gL+CtxTV2BmucDfCOYzXwq8YWaP\nAbnAbxrsf5G7rwpf/yTcT0REUiipicPdXzazwQ2KRwGL3H0xgJk9CJzs7r8BTmx4DAtmkLoBeNLd\n32zqXGY2EZgIMHDgwITELyIiX5aKNo5+wJKI9aVhWVO+CxwFnGZmlzS1kbtPcvdydy/v0aNHYiIV\nEZEvSfatqsZYI2Xe1MbufiNwY/LCERGReKTiimMpMCBivT+wLBEHNrNxZjZp48aNiTiciIg0IhWJ\n4w1gDzPb1cwKgLOAxxJxYE0dKyKSfMnujjsFmAEMNbOlZjbe3auBy4GngfnAVHd/L0Hn0xWHiEiS\nmXuTzQsZq7y83GfPnp3qMEREMoaZzXH38li2Tfsnx0VEJL2koldV0pjZOGAcUGlmCbn9lWa6A2tS\nHUSSZGvdVK/Mk611a65eg2I9UFbeqjKz2bFecmWSbK0XZG/dVK/Mk611S2S9dKtKRETiosQhIiJx\nydbEMSnVASRJttYLsrduqlfmyda6JaxeWdnGISIiyZOtVxwiIpIkShwiIhIXJQ4REYlLu0ocZjbW\nzF4xs1vMbGyq40kkM9srrNcjZnZpquNJFDPbzczuMLNHUh1LImRbfepk6+cPsvd7w8y+EtbpdjN7\nLZ59MyZxJGL+coJ5PzYDRQTDu6eFBM3NPt/dLwHOANLi4aUE1Wuxu49PbqStE089M6E+deKsV9p9\n/qKJ87OZlt8bjYnz3+yV8N9sOnB3XCdy94xYgMOAA4B3I8pygY+A3YAC4G1gGLBv+MuIXHoCOeF+\nvYD7U12nRNYt3Ock4DXgnFTXKZH1Cvd7JNX1SUQ9M6E+La1Xun3+ElW3dP3eSMS/Wfj+VKBzPOfJ\nmLGqPAHzl0dYDxQmI86WSFTd3P0x4DEzexx4IHkRxybB/2ZpK556Au+3bXQtF2+90u3zF02cn826\nf7O0+t5oTLz/ZmY2ENjo7pviOU/GJI4mNDZ/+UFNbWxm3wCOAboAf01uaK0Wb93GAt8g+GA/kdTI\nWifeenUD/hcYYWbXhgkmEzRazwyuT52m6jWWzPj8RdNU3TLpe6Mx0f6fGw9MjveAmZ444p2//J/A\nP5MXTkLFW7cXgReTFUwCxVuvtcAlyQsnaRqtZwbXp05T9XqRzPj8RdNU3TLpe6MxTf4/5+7XteSA\nGdM43oSkzV+eBrK1btlar4aytZ7ZWi/I3rolvF6ZnjiSNn95GsjWumVrvRrK1npma70ge+uW+Hql\nuhdAHL0FpgDLgR0EGXR8WH488CFBr4H/SXWcqlv216u91DNb65XNdWuremmQQxERiUum36oSEZE2\npsQhIiJxUeIQEZG4KHGIiEhclDhERCQuShwiIhIXJQ5p18ysxszeiliaG5q/TZjZJ2b2jpk1OUS5\nmV1gZlMalHU3s9VmVmhm95vZOjM7LfkRS3uS6WNVibTWNnffP5EHNLM8d69OwKG+6u5rorz/T+D/\nzKyDu28Ny04DHnP3KuCbZnZXAuIQqUdXHCKNCP/i/4WZvRn+5b9nWN4xnCznDTOba2Ynh+UXmNnD\nZjYNeMbMcszsZjN7z8ymm9kTZnaamR1pZv+KOM/RZtbsAHpmNtLMXjKzOWb2tJn18WAo7JeBcRGb\nnkXw9LBI0ihxSHtX3OBW1ZkR761x9wOAvwPfD8v+B/iPux8IfBX4vZl1DN8bA5zv7kcQDDE+mGCC\nqm+H7wH8B9jLzHqE6xfSzLDWZpYP3ASc5u4jgTsJhmaHIEmcFW7XFxgCvBDn70AkLrpVJe1dtFtV\ndVcCcwgSAcDXgJPMrC6RFAEDw9fPuvu68PWhwMPuXgusMLMXIBij28zuBc41s8kECeVbzcQ4FNgH\neNbMIJjRbXn43nTgZjPrTDBt6yPuXtNcpUVaQ4lDpGlV4c8avvh/xYBT3X1B5IZmdhCwJbIoynEn\nA9OASoLk0lx7iAHvufuYhm+4+zYzewr4OsGVx/9r5lgiraZbVSLxeRr4roV/+pvZiCa2exU4NWzr\n6AWMrXvD3ZcRzIfwE+CuGM65AOhhZmPCc+ab2d4R708BriKYE3tmXLURaQElDmnvGrZx3NDM9tcD\n+cA8M3s3XG/MPwiGtX4XuBWYBWyMeP9+YIl/MZ91k9x9O0Fvqd+a2dvAW8DBEZs8A/QFHnINdy1t\nQMOqiySJmXVy983hPOOvA4e4+4rwvb8Cc939jib2/QQob6Y7biwx3AVMd/dHWnMckUi64hBJnulm\n9hbwCnB9RNKYA+wH3Bdl39XA89EeAGyOmd0PHE7QliKSMLriEBGRuOiKQ0RE4qLEISIicVHiEBGR\nuChxiIhIXJQ4REQkLkocIiISl/8PMcPiun1YM38AAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -1187,7 +1193,7 @@ "mg_fission_rates.shape = (17,17)\n", "\n", "# Normalize to the average pin power\n", - "mg_fission_rates /= np.mean(mg_fission_rates)" + "mg_fission_rates /= np.mean(mg_fission_rates[mg_fission_rates > 0.])" ] }, { @@ -1213,7 +1219,7 @@ "ce_fission_rates.shape = (17,17)\n", "\n", "# Normalize to the average pin power\n", - "ce_fission_rates /= np.mean(ce_fission_rates)" + "ce_fission_rates /= np.mean(ce_fission_rates[ce_fission_rates > 0.])" ] }, { @@ -1242,7 +1248,8 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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 +DBwI\n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\n", "text/plain": [ "" ] diff --git a/examples/jupyter/mg-mode-part-iii.ipynb b/examples/jupyter/mg-mode-part-iii.ipynb index 6150bb92c..3c71488e6 100644 --- a/examples/jupyter/mg-mode-part-iii.ipynb +++ b/examples/jupyter/mg-mode-part-iii.ipynb @@ -1389,7 +1389,8 @@ "outputs": [ { "data": { - "image/png": "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\nAajbsJNqTdi0AAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAEDCAYAAADXztd+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm8JGV56PHfwwyywwAzMMKwaDQYJFfUUdyiiOKGIjGo\nIKhoAE1E8WrCdbuKRkzizSW4xktQcWHRoBijuCWKijHogGhAwBAEZhiQYRlgQGR77h9vHeg5nHO6\n+5zz9lL8vp9Pf2a6q/p9n+pTT9XTVW9XRWYiSZIktdUGww5AkiRJqsmCV5IkSa1mwStJkqRWs+CV\nJElSq1nwSpIkqdUseCVJktRqFrwDEhEXRcTew45D0txFxM4RsS4iFgyp/2Mj4vMzTD8kIr49yJj0\n4BERh0XEOcOOYxAi4uyIOHzYcfQjIq6IiGfPMP0bEfHqQcY0Ch70BW9EvCIiVjQ7r2uaFeFpc2zz\n5Ih4f+drmfnozDx7TsEOULMMdzafy8Tj58OOS+3XbWPdYxtVd1KZeVVmbp6Z9/QZ12ERkRFx/KTX\nD2heP7nfWCJi1+a9CzviOyUzn9Plfcsj4msRcVNErI2IX0bEcRGxdb8xaHQ1uXBTRGw07FgAImLv\niLi3Y7+yKiK+GBFPGHZsNfXyJaH5W2VEPGbS619pXt97Fv0+4MtxZj4/Mz8zw3siIo6KiF9ExO0R\ncW0T20H99j9KHtQFb0S8BTgB+ACwPbAz8HHgxcOMa4R8sNmpTzwe0/0t/encSUuDMuT17r+Bl0+K\n4VXArwYVQEQ8BTgb+BHwqMxcBDwPuBuYMs/N1fETEbsCfwQksP9Qg1nf6szcHNgCeBJwCfDDiHjW\ncMMaCb+ibA8AiIhtKZ/RmgHG8GHgzcBbgW2BHYF3UbYRD9AUyKNfT2bmg/IBbAWsA146zfSNKMXw\n6uZxArBRM21vYBVlZbgOuAZ4TTPtSOAu4M6m/X9pXr8CeHbz/2OBLwKfBW4FLgKWd/SdwCM6np8M\nvL/j+RHAZcCNwFeBHZrXd23eu7Bj3rOBw5v/PwL4PnAzcD3whRk+n/X6nDRtop9XA1c1bb2zY/oG\nwNsoO/YbmmXdZtJ7/7R57w+a118FXNnM/78nPi9gKXA7sG1H+4+nJP+Gw16PfMz/Y1KuTLvOAk8B\nftpM+ynwlOb144B7gDuaHPxo83oCbwD+C/j1TG00084G/hr4STP9n6dYjxc2z7cBPk3ZVtwEfGWa\nZTsMOAf4JrBfx3uvBf4PcHLz2t7Aqhk+l2OBzzf/v6qJZV3zePJEPzN8xucAH+nydziMUhD/PWVb\n8/4mt9/V5Op1lG3YVn3EfAbwBcp273zgMcNe39r8AN7d/A2PB742adrJwMeArzd/j3OB3+uY/hzg\n0mbd/3iThxP7kvXWL+BRwHea9eRS4GUzxPSA9aR5/aPAil7abGL/RDP91ia2Xfp470zLvS+lAL+5\niem+5W6mvxa4mJLn35rUbwKvp2xjbmr6CeAPKNuje5ocXTvNZ3N28zdbBSxoXjsK+Ifmtb07luH9\n032m3L//fB6lFrmr6ffnHf0cPk0Mv9/EuXyq6ZNiPa5Zv35L2VbvQKlJbqTUKEdM+ty7xfx24JfN\nZ/dpYOP5zIfRr8jreTKwMXDmNNPfSflWtSfliMcTKRv6CUspRfOOlOLtYxGxdWaeCJzC/UdHXzRN\n+/sDpwOLKCvIR3sJOiL2oeyEXwY8lLLjOb2X9wJ/BXwb2BpYBnykx/dN52nAbsCzgHdHxB80r78J\nOAB4BiUBJhK/0zMoG4HnRsTulA3qIZRlmvhcycxrKYn1so73Hgqcnpl3zTF+jb4p19mI2Iayw/ow\n5QjE8cDXI2LbzHwn8EPgqCYHj+po7wBgL2D3mdromP9VlB3cDpSjnx+eJs7PAZsCjwa2oxSJM/ks\n9x/FOYhSTP+uy3um8/Tm30XN8v54ppkjYjPK9u9LPbS9F3A5ZZmOoxQ6hwHPBB4ObE6P267Gi4F/\nohT5pwJfiYgN+3i/+vMqyv7oFMq2dvtJ0w8G3kvJr8sof2MiYjHly8nbKblxKeXL4QM069N3KH/P\n7Zo2Px4Rj+4z1i8Dj4uIzXps8xDK9mExcEGzjL3GM9Nyf4myr19MOWjz1I5lPQB4B/ASYAllO3Pa\npOV4IfAESt3wMuC5mXkxpRD+cZOji2b4HFZTir6JIUmvomwv+paZ36Scwf5C9n6Wdh9gZWau6GHe\nV1IO8m1BqUVOoxTmOwAHAh/o86j9IcBzgd+jFN7vmnn2/jyYC95tgesz8+5pph8CvC8zr8vMNZTk\neGXH9Lua6Xdl5lmUb0+79dH/OZl5VpYxgJ9jmtOI08T1qcw8PzN/R9kgPbk5ddXNXcAulCPCd2Rm\ntx8d/EUztm/iMXnMz3sz87eZ+XPg5x3L8DrKEd9VTYzHAgdOOiV6bGbelpm/pSTGv2TmOZl5J+Ub\nbnbM+xlKkUvzI6GDKZ+Z2m+6dXY/4L8y83OZeXdmnkY5KjPdF8wJf52ZNzbrXS9tfC4zL8zM2yhn\nHl42+YdqEfFQ4PnA6zPzpmab8P0ucZwJ7B0RWzGHHdosbU3Z9l878UJEfLDJ8dsionMnszozP9J8\nPr+lbH+Oz8zLM3MdZftzUB/DHc7LzDOaL6vHUw46PGlelkrraX6Lsgvwxcw8j1K8vWLSbF/OzJ80\n+8FTKAd4AF4AXJSZX26mfZiO9WWSFwJXZOanm/XkfErReGCfIa+mHA1d1GObX8/MHzT7mHdS9oM7\n9fjemZb7lx3r6AmTlvt1lG3Ixc17PwDsGRG7dMzzN5m5NjOvAr7X0XY/Pgu8KiJ2o3yRnfFL7Dxb\nzKS/dTPOem1E3DFpWU/OzIuaz2Ip5SDY/2q21RcAJ7F+3dTNRzNzZWbeSPkScvDcFmV9D+aC9wZg\n8Qwb6h0o31gmXNm8dt/7JxXLt1OOdvSqc4W6Hdi4x53GenE1O50baI6IdnEMZYPykyhXjXgtQES8\no+MHBJ/omP/vMnNRx2PyrzonL8PE8u8CnDlRKFNO/9xDGSc9YeWkZbrveWbe3izThH+mHJF7OOV0\n082Z+ZMellfjb8p1lgfmJ83zbnkweb3r1sbKSdM2pOwQOu0E3JiZN3Xp+z5N8fh1miNJmfmjXt/b\nryny+ybgXsrZlIl4jmmOOp0JdG6HVq7f2pTbxYWsn9sz6czze7n/aJDm36uBb2fm9c3zU5vXOk23\nDZ+8TU7K32oquwB7dR4coXwxWhr3X81kXUSs6xLvjpQDHWtnarNj/s741lFOo+/Q43v7We7OHNgF\n+FBHuzdStk+d24zp2u7HlylHWt9I5YM7zXZ14m/0R5R970M758nMZZTt3kaU5Z0weXt6Y2be2vFa\nL9vkTpO3t/O6bXgw/wjhx5QxNQdQTt1Mtpqycl/UPN+5ea0X2X2WGd1OOT06YSn3b2wm4gLuO32z\nLXA1cFvz8qbALR3vLUGV4QFHNO97GvCvEfGDzPwA5ZvqfFkJvHaqnXjHkejOz+gaOo6OR8QmlGWa\niPuOiPgiZaP1KDy6+6Ax3TrLpDxo7EwZGwvT52Dn693agFLMdk67izKWuPP1lcA2EbEoM9fOuEDr\n+yzwXcrZo8luo2Mb0BxVXjJNOzNub6bK74g4l3Ja9ntdYpzc9uTPbGfKUI/fUHZO3WLeqWP6BpRh\nKr1uV9WjZhv6MmBBREwUYBsBiyLiMc1ZuZlcQ/nbTLQXnc8nWQl8PzP3nWZ6rwXfHwPnZ+ZtEdGt\nTVh/XdqcMkxmdQ/xzOSaSe0GD8z14zLzlFm03XNdkJm3R8Q3gD+jnN6fbL3tA+sX8331m5nrDT2J\niOuAj0bE8h6GNUzenm4TEVt0FL07U2qTXmOevL2d123Dg/YIb2beTDl1/rEolwTaNCI2jIjnR8QH\nKWNR3hURS5pxPe8Gpr3u5SS/oYxvm60LgFdExIKIeB5lvOuEU4HXRMSeUS4z8wHg3My8ohl6cTVw\naPPe19KRLBHx0oiY2GjdRFlZ+7qsUo8+ARw3ceqj+QxnuvLFGcCLIuIpEfEQSgEQk+b5LGXs4P70\n/nfQmJthnT0L+P0olxVcGBEvB3YHvtbM20sOdmsDSi7tHhGbAu8DzshJlyLLzGuAb1DGCW7dbEee\nTnffp5yxmGos/a8oZ332izLG9V2UgmUqayhHbPvZ5hwDvDYi3hYR2wE0n/PDurzvNOB/RsTDmiJj\nYnzg3T3G/PiIeElzNuvNlHHL/9FH3OrNAZQ82Z1ySn1Pym8mfkjHFQBm8HXgD5t940LKjz2nK6q+\nRsmjVzbr/oYR8YS4/zcd04pix4h4D3A4ZXxsr22+ICKe1uwz/oqyH1w5l3ia5X50xzr6pknL/Qng\n7dGMB46IrSLipT20C2WbtKyJtxfvAJ6RmVdMMe0CyvJvExFLKbk0U7+7Ro9XUcjMS4H/B5weEftG\nxCbNl9cpx3B3vG8l8O/AX0fExhHxPyi/b5r4ctBLzG+IiGVRfl/xDsoPXOfNg7bgBcjM44G3UDbM\nayjf3o4CvkL5RfIK4BfAf1J+Ufz+qVt6gE9STsGvjYivzCK0oynjCCdOxdzXRmb+G2Us4Zco30Z/\nj/KjlwlHAH9JOS3xaMoKOOEJwLlRTi19FTg6M389QxzHxPrX4b1+hnk7fahp/9sRcStlh7bXdDNn\n5kWUUzenN8t0K+UX4L/rmOdHlJ36+dNsANROU66zmXkDZazeWynr+jHACztO336IMm78poiY8odm\nPbQB5WzCyZTTlBtTdoBTeSXl6O8llHV3ph3QRP+Zmf/WjFebPO1m4M8pY+Amzt5MeUq5GQJ0HPCj\nZpvTdUxsMxZ6H8oP3n4V5fTsNyk/EJ3px6yfonwmPwB+TTlL9sY+Yv5n4OWULy+vBF6S/vi0hlcD\nn85yvehrJx6UHxgeEl2GzzU58FLgg5Tc2J2yP3zADyubo3nPoeyHVlNy5W+Z/gsawA5NTq+jXB3l\nDylXIPh2H22eCryHMqzg8ZR95Wzjmbzcf9Ms9yMpVyGYmH5m09bpEXELcCFl/H4vvks5Y3xtL/vS\nzFyd0//O5nOU381cQflR70yF4T81/94QEef3GOsbKOO2j6d8vqsoXypeTrkqzHQOplzBZjVleNR7\nMvM7fcR8ajPt8ubRa83VkyhDVKTR0Rw5Wgs8srMgj4jvAqdm5klDC04PGhFxNuXSX65v8yAijqVc\nbvHQYcei/jRHB1cBh2Rmt2Ewg4jnZMolreb1V/wanoi4gnKptH+t1ceD+givRkdEvKgZVrIZ8HeU\no+pXdEx/AvA45vkUhyTpgSLiuRGxqBk69w7KMDOHn2hsWfBqVLyY+2/y8UjgoOYXskS5HNq/Am+e\n9AtQSVIdT6Zcyux6yhC7A5qri0hjySENkiRJajWP8EqSJKnVLHgrifsvuL2g+9zTtrEuys0WJFVm\nzkrjw3xVvyx45ygiroiI3066fNcOzeVgNp98zc5+NO+/fD7jhQfEfG1EnNxcGaGX9+4aEdntsjbS\nqDJnpfFhvmq+WPDOjxc1iTPxGIc7B70oMzenXJD8scDbhxyPNEjmrDQ+zFfNmQVvJZO/pUXEYRFx\neUTcGhG/johDmtcfERHfj4ibI+L6iPhCRxsZEY9o/r9VRHw2ItZExJUR8a6JO6c0bZ8TEX/XXGj/\n1xHR08Wwm4uRf4uSlBP97hcRP4uIWyJiZXP9zAk/aP5d23x7fXLzntdGxMVN/9+K+++yFhHx9xFx\nXbOMv4iIPWb5sUrVmLPmrMaH+Wq+9suCdwCiXFv2w8DzM3MLyi36Lmgm/xXlziJbU+5VPt1djj4C\nbEW5fegzKLeHfE3H9L2AS4HFlLvjfDIiJt+ed6rYllHuFHNZx8u3Ne0vAvYD/iwiDmimTdwydVHz\nTfvHzbR3AC8BllBuX3laM99zmvf8ftPeyyl3sJFGljlrzmp8mK/ma08y08ccHpSbI6yj3BlsLfCV\n5vVdgQQWAps10/4E2GTS+z8LnAgsm6LtBB4BLKDc0nH3jmmvA85u/n8YcFnHtE2b9y7tEvOtzXz/\nRkmu6ZbxBODvJy9Xx/RvAH/a8XwD4HZgF8rtS38FPAnYYNh/Lx8+zFlz1sf4PMxX83W+Hh7hnR8H\nZOai5nHA5ImZeRvlW9frgWsi4usR8ahm8jGUO9j8JCIuiojXTtH+YuAhwJUdr10J7Njx/NqO/m5v\n/jvTIPkDsnwT3ht4VNMHABGxV0R8rzm1c3MT9+KpmwFK0n0oItZGxFrKvbcD2DEzv0u5f/vHgN9E\nxIkRseUMbUmDYM6asxof5qv5OmcWvAOSmd/KzH2BhwKXAP/YvH5tZh6RmTtQvlF+fGJMUYfrgbso\nK/2EnYGr5yGu7wMnU27nO+FU4KvATpm5FfAJSnJB+eY52UrgdR0bpEWZuUlm/nvTx4cz8/HAoymn\nXf5yrnFLtZmz5qzGh/lqvnZjwTsAEbF9ROzfjDP6HeVUxz3NtJc2Y3wAbqKs7OtdZiXLZVe+CBwX\nEVs0g9XfAnx+nkI8Adg3IiYG1W8B3JiZd0TEE4FXdMy7BriXMs5pwieAt0fEo5tl2ioiXtr8/wnN\nt9kNKeOW7pi8fNKoMWfNWY0P89V87YUF72BsALwVWE05FfEM4M+baU8Azo2IdZRvfEdn5q+naOON\nlJX5cuAcyjfET81HcJm5hjLO6X83L/058L6IuBV4N2VDMDHv7cBxwI+a0ytPyswzgb8FTo+IW4AL\nKYP0AbakfNO+iXKK6AbW/6YrjSJz1pzV+DBfzdeuInOqo+eSJElSO3iEV5IkSa1mwStJkqRWs+CV\nJElSq1nwSpIkqdUseCVJktRqC2s0GrFtlms217SgcvsD8JDK7W9WuX2A7et3seNmV1Vtf+nqNVXb\nBzjvGq7PzCXVO5qFiK1z/RsK1VBlUzPA9ql/eGAQ+bq0fhc7bXll95nmYLsrr6/aPsB5149yvi7O\ncvfZMTaIQ23uX3uy0yaV8/WqAeTrmt7ytdJeYmfg+3Wavs8WlduP7rPM1Q6V239S5fYB3ly/izft\n9caq7R/zno9WbR8g3kfdrcqc7EjHZSArqb3l3rZy+8Cmldvfq3L7AH9Rv4u3Pvd1Vds/+ogTq7YP\nECeNcr7uCvy0ch+V93+1cwlgWfdZ5qQl+9djHnN41faPOuqTVdsHiI/1lq8OaZAkSVKrWfBKkiSp\n1Sx4JUmS1GoWvJIkSWo1C15JkiS1mgWvJEmSWs2CV5IkSa3WteCNiN0i4oKOxy0RMYCrw0nql/kq\njRdzVhqMrjeeyMxLgT0BImIBcDVwZuW4JM2C+SqNF3NWGox+hzQ8C/jvzBzhu9BIapiv0ngxZ6VK\n+i14DwJOm2pCRBwZESsiYgXcMPfIJM1Vj/l644DDkjSNKXN2/XxdM4SwpPHXc8EbEQ8B9gf+aarp\nmXliZi7PzOUDua+9pGn1l6/bDDY4SQ8wU86un69LBh+c1AL9HOF9PnB+Zv6mVjCS5o35Ko0Xc1aq\nqJ+C92CmOT0qaeSYr9J4MWelinoqeCNiU2Bf4Mt1w5E0V+arNF7MWam+rpclA8jM23FgrjQWzFdp\nvJizUn3eaU2SJEmtZsErSZKkVrPglSRJUqtZ8EqSJKnVLHglSZLUaha8kiRJajULXkmSJLVaT9fh\n7d8CYIs6TU/YOOq2v7hu8wPpY2nl9gFW1e/i7L2eWbX9Y97w0artA/C++l3M3kJg+8p9VL7E6KK6\nzQOwrHL7u1ZuH+Da+l2cxQuqtn/00SdWbR+Ak+p3MTeV93+182kQ+Vp7/zqIZbisfhdnPObAqu0f\n9e5PVm0fgI/1NptHeCVJktRqFrySJElqNQteSZIktZoFryRJklrNgleSJEmtZsErSZKkVrPglSRJ\nUqv1VPBGxKKIOCMiLomIiyPiybUDkzQ75qs0XsxZqb5ebzzxIeCbmXlgRDwE2LRiTJLmxnyVxos5\nK1XWteCNiC2BpwOHAWTmncCddcOSNBvmqzRezFlpMHoZ0vBwYA3w6Yj4WUScFBGbVY5L0uyYr9J4\nMWelAeil4F0IPA74h8x8LHAb8LbJM0XEkRGxIiJWlNyVNASzyNcbBh2jpPt1zVn3r9Lc9VLwrgJW\nZea5zfMzKMm5nsw8MTOXZ+ZyWDKfMUrq3SzydduBBihpPV1z1v2rNHddC97MvBZYGRG7NS89C/hl\n1agkzYr5Ko0Xc1YajF6v0vBG4JTm16OXA6+pF5KkOTJfpfFizkqV9VTwZuYFwPLKsUiaB+arNF7M\nWak+77QmSZKkVrPglSRJUqtZ8EqSJKnVLHglSZLUaha8kiRJajULXkmSJLWaBa8kSZJardcbT/Qn\ngI2iStP3WVq3eRZXbh9gxT/Wbf/wI+q2D3DgF6p38cN1+1Rt/7+2W1a1/WLVAPqYrYVUv71w7Xxa\nVLl9gAsr5+uhA8jXw75avYt/P/ApVdtfs8fmVdsv1g2gj1laAGxRuY/a+bRx5fYBzjm5bvsHHFa3\nfYADv1S9i3PXPrNq+5dvV7tYA7i2p7k8witJkqRWs+CVJElSq1nwSpIkqdUseCVJktRqFrySJElq\nNQteSZIktZoFryRJklrNgleSJEmt1tONJyLiCuBW4B7g7sxcXjMoSbNnvkrjxZyV6uvnTmvPzMzr\nq0UiaT6Zr9J4MWelihzSIEmSpFbrteBN4NsRcV5EHDnVDBFxZESsiIgV5Jr5i1BSv/rLV8xXachm\nzNn18vVe81WajV6HNDw1M1dHxHbAdyLiksz8QecMmXkicCJAbLA85zlOSb3rL1/DfJWGbMacXS9f\nF5qv0mz0dIQ3M1c3/14HnAk8sWZQkmbPfJXGizkr1de14I2IzSJii4n/A88BLqwdmKT+ma/SeDFn\npcHoZUjD9sCZETEx/6mZ+c2qUUmaLfNVGi/mrDQAXQvezLwceMwAYpE0R+arNF7MWWkwvCyZJEmS\nWs2CV5IkSa1mwStJkqRWs+CVJElSq1nwSpIkqdUseCVJktRqFrySJElqtV5uPNG/DYGlVVq+3+LK\n7a/4x8odQOYR1fuoLZa/vHof6zb/TtX278kFVdsfeQuBRZX7qL09uNB87UXsvX/1PtZtfm7V9tdm\n7ZUVYN0A+pilDYFllfvYuHL7K06u3AFkHla9j9pizz+p3scdi86p2v7a3Lpq+8W1Pc3lEV5JkiS1\nmgWvJEmSWs2CV5IkSa1mwStJkqRWs+CVJElSq1nwSpIkqdUseCVJktRqPRe8EbEgIn4WEV+rGZCk\nuTNfpfFhvkr19XOE92jg4lqBSJpX5qs0PsxXqbKeCt6IWAbsB5xUNxxJc2W+SuPDfJUGo9cjvCcA\nxwD3VoxF0vwwX6XxYb5KA9C14I2IFwLXZeZ5XeY7MiJWRMQK7lkzbwFK6t2s8vVe81UaBvev0uD0\ncoT3qcD+EXEFcDqwT0R8fvJMmXliZi7PzOUsWDLPYUrqUf/5uoH5Kg2J+1dpQLoWvJn59sxclpm7\nAgcB383MQ6tHJqlv5qs0PsxXaXC8Dq8kSZJabWE/M2fm2cDZVSKRNK/MV2l8mK9SXR7hlSRJUqtZ\n8EqSJKnVLHglSZLUaha8kiRJajULXkmSJLWaBa8kSZJazYJXkiRJrWbBK0mSpFbr68YTPdsMeFKV\nlu+3tHL7hx9RuYN22GqPa6v3sSh3qts+a6u2P/I2Afas3Meulds/zHztxTbLr67ex6a5TdX2t7/n\nN1XbH3mbUj9fF1du/ +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\nAajbsJNqTdi0AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] @@ -1413,7 +1414,7 @@ " fiss_rates[-1].shape = mesh.dimension\n", " \n", " # Normalize the fission rates\n", - " fiss_rates[-1] /= np.mean(fiss_rates[-1])\n", + " fiss_rates[-1] /= np.mean(fiss_rates[-1][fiss_rates[-1] > 0.])\n", " \n", " # Set 0s to NaNs so they show as white\n", " fiss_rates[-1][fiss_rates[-1] == 0.] = np.nan\n", @@ -1457,7 +1458,9 @@ }, { "data": { - "image/png": "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\nkjRi/w9hvYqGSZgiKAAAAABJRU5ErkJggg==\n", + "image/png": "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 +HHgI8FhgK+AtgxxooPKStjt960HWlaT5\n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\nkjRi/w9hvYqGSZgiKAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] diff --git a/examples/jupyter/mgxs-part-iii.ipynb b/examples/jupyter/mgxs-part-iii.ipynb index 5d16879c9..c73214dda 100644 --- a/examples/jupyter/mgxs-part-iii.ipynb +++ b/examples/jupyter/mgxs-part-iii.ipynb @@ -1575,7 +1575,7 @@ "openmc_fission_rates.shape = (17,17)\n", "\n", "# Normalize to the average pin power\n", - "openmc_fission_rates /= np.mean(openmc_fission_rates)" + "openmc_fission_rates /= np.mean(openmc_fission_rates[openmc_fission_rates > 0.])" ] }, { @@ -1607,7 +1607,7 @@ "openmoc_fission_rates = np.fliplr(openmoc_fission_rates)\n", "\n", "# Normalize to the average pin fission rate\n", - "openmoc_fission_rates /= np.mean(openmoc_fission_rates)" + "openmoc_fission_rates /= np.mean(openmoc_fission_rates[openmoc_fission_rates > 0.])" ] }, { @@ -1636,7 +1636,8 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW0AAADDCAYAAABJYEAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8FFW2B/DfSQJhC8giq0AARRw07LgAQ8CVUcRtHERH\nUUcdt6fvuTvvDYFRwWV8jM64zIiK4MJzQXTmOaJiYEAMAUEGnygiCWgggCLLsCfn/VEV6ITuOpV0\n0t1Xft/PJ590V52ue6vq9unq6rp1RVVBRERuSEt2BYiIKDwmbSIihzBpExE5hEmbiMghTNpERA5h\n0iYicgiTdhKJyJMi8ps4Xn+PiPy5NutEVBdEZLCIfB7H6zuKyDYRkdqsl4tSKmmLyFgRWS4i/xKR\nEhF5QkSaJajsIhHZLSItqkxfKiLlItIpYtpAEfmbiGwRkc0i8rGIjI2x3CtEZL/f4Lb7/x8DAFW9\nXlXvr2mdVXWiql5b09fHUqXOP/jb4OxqvP45EZlQ2/VyhUPt+BQR+cDfz1tEZJaIHFfldVkiMllE\niv24VSLyaNXlR8SXR7Tz7SLyPQCo6nxVPS7aa8JQ1XWq2lTroGNJlTqvE5Hfh/1wEJGhIrKutusU\nJGWStojcBmAigNsANAVwEoDOAN4TkYwEVEEBrAFwSUSdjgfQ0J9XMe1kAB8A+BBAN1VtBeB6AGcG\nLPsjv8Fl+f//rS5WoJZV1PkIAE8CeEVEmia7UqnOsXb8LoCZANoB6AJgOYAFIpLtx9QDMAfAcQDO\nUNWmAE4GsBnAwIDycyLae9TknmIO1BnAUAC/AHBVyNcKIrZrQqhq0v8AZAHYDuDCKtMbA9gIYKz/\nfByAVwG8AmAbgMXwNnZFfDsAr/mvWQ3g5oh54wDMADDVf+0/AfSNmL8GwL0AFkVMexjAPQDKAHTy\np/0DwGPVWLcrAMyLMe85ABP8xy0BvA1gC4DvAMyNiLsLwDd+vT8HMCxinaZFxJ0LYAWA7+G92XpU\nWb/bAHzql/EygPph6gzvDV8OoF/EtP8BsN5fVj6A4/zp1wDYC2C3X99ZIfbNAACFALb6y3wk2W3y\nMGjH8wA8HmUd/hfA8/7jX/n7o2E1tkE5gK5Rpg8FsC5Em47aFuB98JUDSIvYRrP898qXAH4VdhtZ\ndfZf+3jE87EA/s9f1lcArvWnNwKwE8B+f79vA9AWXiK/24/d5O/nI/zXZAKYBu+DbwuAAgBHVqud\nJbuh+ytyJrw3elqUec8DeDFiZ+wBcD6AdHhJ6Gv/sfiN/zf+82x/o50e8dqdflkC4AEAC6s09uF+\nAzoW3reQtQA6+ju1E7zktR/A0GqsW9ik/QCAJ/xy0wEM8qd39+vRxn/eCUCXiHV6ISJuh78O6QDu\nALAKQEbE+n0MoA2AI/xGeK1VZ39ZN8JLwq2qNORGAOoBeBTA0mjr5T+39s1HAC6NeCMMTHabPFzb\nsb9fv/UfvwzguWpug6CkvTZEm47aFuAl7TIcTNrzADzut79e8D7gcsNso6A6A+gBoATAv0XMHwEg\n2388BMC/APSuul4R8bf469HOr9+TAF7y510L78Mm069bHwBNqrONU+X0SCsAm1W1PMq89f78CktU\ndaaqlsFLFpnwvoIOgJdU7lfVMlUtAvAMgNERr52vqu+qt/WmAciJUt40eEnrdHgNvyRiXnN4b4L1\n1Vy/k0Xke/+84fciEu2r5T74X1P9+i/wp5cBqA/geBHJUNW1qromyusvBvBXVZ3jb5tH4L05T4mI\n+YOqlqrqD/CO6ntbdQawC8BDAC5T1c0VM1X1eVXdqar7AEwA0EtEsmIsy9o3+wAcLSIt/WUuCqhX\nKnOlHbdA7HYcWc+WMWIsn0S09clR5ge16b0w2oKIdIR3muYuVd2nqp/C20aXR4SF2UZV67wD3sHM\nh/ASLQBAVd/x9wNU9R8AZsNL3rFcB+A3qro+4v1xkYikwWvrLQF0V89SVd1h1K2SVEnamwG08leq\nqnb+/AoHTvr7O+RbAO3hfRJ38BvK9yKyBd5XwtYRr90Q8XgngAZRypwOYAy8I44XqszbAu9TuV3I\n9aqwUFVbqGpz/3+0pPQwvK/Cs0XkKxG5y1/H1QBuBZAHoFREXhKRtlFe3x5AccUTf9usA9AhIqY0\n4vFOAE2sOsM7Kn8LwE8rZohImohM8uv5A7yjO0XlpBTJ2jdXwTsqXCkiBdX50TPF/BjacWQ9v4sR\nY+kT0dZvrTozRpuuKOdq2G2hHYDvVXVnxLRiVG7rYbZR1To3gXfwcyK8U1oAABEZISILReQ7f3+M\nQOy2Dnj7cGbFPoT3QbAP3rfcafB+S3hFRL7x30fpAcs6RKok7YXwvi5eEDlRRJrA20DvR0zuGDFf\nABwF7yhiHYCv/YZSkSCbqerI6lREVdfCS0IjALxRZd4uv64XVmeZIcvdoaq3q2o3eOem/0NEhvnz\nXlHVIfAaAwA8GGURJRHzK3SEd94wnnrtBHADgF+KSC9/8hgAIwEMV++Hymx4X/UqfnHXKosJ3Deq\nulpVx6jqkfCO6l8TkYbx1DtJXGnHO/26/jzKSy+OqOf7AM6swb4wr7yI0qYn+dPDtIUSAC1EpHHE\ntE7wPvhqSvzyX4N3GnEcAIhIfXi/LzwE79xzcwDvIHZbB7xTPyOq7MPG/pH3flX9nar2hPcteCQq\nf0MwpUTSVtVt8L5CPC4iZ4pIhv8L9gx4G2B6RHg/ETnP/3T6d3jnWj8GsAjAdhG5U0QaiEi6iPQU\nkf4BRcdqXFfBS0i7osy7E8BYEbmt4rInEeklIi+HX+MoFRE5W0S6+U+3wzvnWC4i3UVkmN949sI7\nXRHt6/f/ADjbj80QkdvhbZuF8dQLAFR1C7yvn+P8SVnwktMW/40zEZUbbymArhHPA/eNiFwqIhVH\nLlv9ZUVbx5TmWDu+G8AVInKTiDQRkeYich+8UzQVl2tOg/ch8rqIHCueluL1DzgrxCaJXtmANm20\nhYrE+g28c8YTRSRTRHLgHaFPCyq2GlWcBOAaEWkN7zROffinvURkBIAzImJLAbSUyldWPQ3gAfEv\nrxSRI0XkXP9xrogc7x/174B3BF6ttp4SSRsAVPVheL96PwJvZy2E95XnNP+8UIVZ8C7J2QLgUgDn\n++f+ygGcA+887Rp4P0z8Bd5lVzGLjfZYVdeo6icx5i2E90PPqQBWi8hmAE8B+Fu1VvhQxwB4X0S2\nA1gA4E+qOhfeuc5J8H6FLgFwJLyvy5VXRPVLAJcB+KMfezaAkaq6v+o61NBkACPEu3zsBXhJ6Ft4\nV6t8VCV2CoCe/tfDN0Lsm7MAfCYi2wD8N4BfqOqeOOubFA614wXwfqi7EN556zXwftAb5J++gKru\nBXAagJUA3vPX52N452QLQtQllqA2HdQWIpd9CbzLFEsAvA7gv1T1w4Ayg+pVaZ6qrgAwF8Ad/vnm\nWwC86p/qGA1v31XEfgHvB9uv/fbeFsAf/JjZIrIV3vuj4nestvCO3LcC+Aze+fOgD5tDiHc6zQ0i\nMg7etdHV+jpBlErYjikeKXOkTURENiZtIiKHOHV6hIjocMcjbSIih8R1Axv/sp/J8JL/FFU95Pph\nEeGhPNUpVa3123WybVMqiNa2a3x6xL/O8Et4l76VwLvJy2hVXVklTh/R6w88fzevEGfmDai0rD/p\njWZ5a874iRnT4LXvzZiMjDIzpmPjynda3JT3NI7Mu67StL74BJbZlS7njFEW1gbOP0rtvjF/3Xho\nv4vyhx9A2h33Hnh+SWv7MvIXn/iVGdPmhmg96Csr/VlXMwa3RJk2PQ+4LO/g81/ai8FmqfWkXZ22\nXbmX9yMAbo94/pRd2El5dszd9nu057mLzZivtnY7ZNr+SQ8i4+67DjzfU9zcLivHLuuz5UGXlce5\nnCfzgOvzDjxtkG2/77s1/doua9YAMwaTQuTLgvFVJuQDyK0y7XoEGTq0HubObRm1bcdzemQggFWq\nWuxff/oKgFFxLI8oVbBtU8qKJ2l3QMT9E+B1l+4QI5bIJWzblLIScVN2vJtXeOBxgyPqJ6LIWtUo\nt1+yq1BtckrQTchSVE6uHbM3H9iXX8cVqY5HIh67N0ZE2uBBya5C9fXPTXYNqik7ZNwCVHQuLiqK\nfQ+peJL2t/Bu0lLhKMS4YUvVc9iuaZxrn59LNTLoR5q06+d6fxV2VT1/WCtCt+3K57DdkzZ4cLKr\nUH0DcpNdg2rKDhk3yP8DsrProbj4oahR8ZweKYR339vO/o1fRsO7hSeR69i2KWXV+EhbVctE5CZ4\nNwSvuCyqxqMtE6UKtm1KZXGd01bVv8O7YTnRjwrbNqWqhPwQuQeZgfN/JvZdTU+YHe2+/5U9gtvM\nmK9mW6MOAV/0bmTG9Gu9xIz5eo99vXKjOcHXfab33G0uI4wuYl+nOvMG+xbJi2H/KHt/7v1mTEb/\n7WbM/qUhfrTuaIfUraBrsU+1X77bvu637bn2vuskwdf7A8AHzez6vJ5zgRmzPeaocgedl2OPE/Km\n2FdRZuX8yYy5sPIYD1GNlefNmM3ntjRjSvO6mDGh9vvB0cxiqDqeyUHsxk5E5BAmbSIihzBpExE5\nhEmbiMghTNpERA5h0iYicgiTNhGRQ5i0iYgcUudjRIqIXlM+OTDmmQ43m8tZVWLfGfNdnGnGTC0f\na8Z8LEPNGGyyP+/mtDrZjBkuCwLn90aBuYwd2sSM+Up6mjGFYnc8egD3mDHX6l/MmJEb3zZjhrbO\nN2M+TBtZJyPXhCEiihPLYwfsCbGQc+yQ8nPstqbf2ptAzrcHAPk0RCfQnMVf2WX1t8vCEnu9lvXr\nbsb0xkozBm+G2Ibt7G2Y/teA/V3hryFyaoPg2UP7AHOfSqv1QRCIiCjBmLSJiBzCpE1E5BAmbSIi\nhzBpExE5hEmbiMghTNpERA5JyHXaWBZ8bePAnLnmcuZtHW7G1G9mXxuqRfbnVEF2LzMmjKtlihnT\nW5cFzv9Qcs1ljMHLZkyG7jdj3oR9U/qV6G3G3CH3mTGd1L5p/y1r7RvgIzszuddpz4zdtsMMXvBt\nwTF2OSfZ7Xp7Q7tdN8mxN9OiRSeYMdlaZMa0XmkPclHawx69vjhgMIAKAwf+04zZvsIMQdOdIfJH\nQexR0iu0H2hfx176VvAAKUNbAnN/KrxOm4jIdUzaREQOYdImInIIkzYRkUOYtImIHMKkTUTkECZt\nIiKHMGkTETkkIyGl5AfPvqnXH81F7GiWacZs1C5mTIeO9iqfNOVTM+bfr37AjPnqu6PNmGktfhk4\nf/qKa8xl/O34YWZMd1llxryEMWZMkbY1Y0pgb5vj8LkZg2/q2TFJ1nPU4pjzOsHuQCTr7c5t2xra\nHTp2hxhwocnXdlnH6JdmTItXd5sxMtWuT9uxW82Y+hfZ9UGI9dptVxloZG/npi/ZZfVJC+4wBwDr\nRn0XOD8bWYjV5ZBH2kREDmHSJiJyCJM2EZFDmLSJiBzCpE1E5BAmbSIihzBpExE5hEmbiMghcY1c\nIyJFALYCKAewT1UHRonRept+CFzOXS0fNMuagPvNmGK0NmPWpQdf1A4Ag8vsESzuxTgz5sFT88yY\nsg+CRxMpxRHmMlovs0cJkd72OmGJ/Rm+92h79JMwIwil/dauDqaHGJCmKProHvEK27Yb/rAp5jLW\nNA0enQQAWsPuYIIB9n4pX2NvgrTNIdrAHSGO45aE2Nxz7LJkWIj1GmCXJQ+FGHGmVYj16hqirEV2\nWRvRzIzJ3rYmcP6Q9Ay8l3VE1LYdb4/IcgC5qrolzuUQpRq2bUpJ8Z4ekVpYBlEqYtumlBRvo1QA\n74lIoYjYN8kgcgfbNqWkeE+PDFLV9SJyJLwG/rmqzq+NihElGds2paS4kraqrvf/bxKRmQAGAjik\nYZc9NPHAYxk0GGmDhsRTLB3OduUDu/PrvJiwbXvfxIcOPE4bPAjpQwbVed3ox6nsH/NRPn8BAGB1\nWuyTIDVO2iLSCECaqu4QkcYAzgAwPlps+p331LQYosoa5np/FbZGbXJxqU7brnfPnbVePh2e0ocM\nRvqQwQCAbukZ+Hpi9Kvq4jnSbgNgpoiov5wXVXV2HMsjShVs25Syapy0VXUNgN61WBeilMC2Taks\nISPXjGn5YuD88WdNDJwPAOPfm2TGdCm7yIy5fOqrZozOsUewuPLUDmbMDx/YHWN+rcEX8LyuK8xl\n3Np7shlzmbYxY7KbmiGoP8nujDVs4t/NmAHjG5kxhfcNtSuUZLuKWsac90av883Xn6zHmjG7C3PM\nmO76hRlzxJ12u/7HwwPMmEy1h8kZ2M8uq2CJvV571B6xakiI9dqyuYEZswrdzZhM9DBjFuICM2Z3\nUYvA+Xsbx57H61CJiBzCpE1E5BAmbSIihzBpExE5hEmbiMghTNpERA5h0iYicgiTNhGRQxLSuWaZ\n9Amc/+A7t5jL+O3VfzBjeuF2M+bKpq+YMaOHP2fGnKIfmTG/32nXp613X6KYfpjXzlzG0yN+acZ0\num+zGZN29b/MmK8nZpsxp8n7Zszp8p4Zc3X5FDPmsyQfdhyfUxhz3nbNMl/fa8kqM2ZDP3sklOav\n2R1eELuqB2TCXs6JVyw3YyYstcv6bYjlFEy1O+CkFdodvlq8ttuM6XxRsRnTdok90tDs/meYMT1z\nFgfOz0YW5saYxyNtIiKHMGkTETmESZuIyCFM2kREDmHSJiJyCJM2EZFDmLSJiBzCpE1E5BBRtS9M\nj6sAEcXfywNjLjnjWXM5L+IqM2aM2J1iiss7mzELZLgZ8zBuNmNuL3jCjJETy4LnL7A/V8szxS6n\nf3A5AKCf2iOAvNXrdDNmFOyRa/ZutctqcLNdZ0xPg6raG6AOiIjKsth1/Dwn21xGd9gdOrAyxLHV\nHSE2wdshtmdfu6zxn9pljSuzy5oQMOJ4hf/qE6JtL7HLknNCvI8eCVFWD7usL2HnmB7Lg/f70MbA\n3GOit20eaRMROYRJm4jIIUzaREQOYdImInIIkzYRkUOYtImIHMKkTUTkECZtIiKHJGTkmpwzCgLn\n70GmuYxm/9poxqxqcqsZc2JacF0A4A/6azNmCU42Y9Iy7Y5L+kxwJxPdZC4CM+4Zacb84mW7M0vJ\nJc3NmIVir/eb+qQZc2GzYWYMxtkhmB4ipg4FjUAyC+ear799sb1fNvZvasa0vXybGVM+3C5r0RJ7\npJhxl9sjzoxPt8sad5kZgoKpJ5gxJ4ZYL73eLmtjD3ukodYh9tebA240YzhyDRHRYYJJm4jIIUza\nREQOYdImInIIkzYRkUOYtImIHMKkTUTkECZtIiKHmJ1rRGQKgHMAlKpqjj+tOYAZADoDKAJwsapu\njbWMltgcWMYbyy81K/pYzjVmzAV4w4x5XG8yY86ZN8eMua7fn80YnWeGYP8VwR1wMuw+RTgVdn1l\nnt3R5/UxF5ox/4efmDFnyGwzJk/zzBg8bYfEozba9orlA2IuP6vXn8w6/LN/NzNmlzQyY+r//Asz\npvmiPWbMnjS7o1vBCyE64Hxmd8AJs5wwHe/Qz27b3/+8gRlTJNlmzIb+u8yYLN1uxny2vH/g/FaN\nY88Lc6T9HIAzq0y7G8D7qnosgDkA7gmxHKJUw7ZNzjGTtqrOB7ClyuRRAKb6j6cCOK+W60VU59i2\nyUU1PafdWlVLAUBVNwBoXXtVIkoqtm1KabX1Q2TdDulOlDxs25RSanqXv1IRaaOqpSLSFkDgz2Vr\n8l468PiI3BPQPNe+cxdRVGvzgXX5dVlCtdo2nsw7+Lh/LjAgtw6rRj9qhfnA4nwAQFH92GFhk7b4\nfxXeAjAWwIMArgAwK+jFXfLGhCyGyNAp1/ursHBCvEuMq23j+rx4yyfyDMg98KGf3Rgofjx62zZP\nj4jISwA+AtBdRNaKyJUAJgE4XUS+AHCq/5zIKWzb5CLzSFtVYx0mn1bLdSFKKLZtcpGo1u3vLCKi\nkOAhSHrtr3qp7KGWyklmzMs434wZPfctM0aGlpkxeMz+Dbfw5uPNmAES3AnhYkwzlzFj5FgzRt62\n1+mbdHudOjwhZoxcZ5eVDbszyNobepgxeEqgqnal6oCIaIMtsTuOFTXrYi6jNWL22zlooL1fytfY\nmyBtU4h2fYddli4J0QbmhChrWIiyBoQo6yG7LD0yxDUXXUOUVWCXtRHNzJjOW4sC5w9Jz8D7TZtF\nbdvsxk5E5BAmbSIihzBpExE5hEmbiMghTNpERA5h0iYicgiTNhGRQ5i0iYgckpjONXeXB8ZcPfGP\n5nIuK59uxvz0rkIzJvehd8yYp3GdGbNLG5oxfX690ox59ulLggNCdBvppGvNmL5YYsaUId2M2Ql7\nFJV7MdGMaSZ2p5J8zTVjVqb1S2rnmp7li2LO74xicxlvv3GxGbPjUvs9usselAatWtqbaeumgDsV\n+Vq8ahemL4TYJZfb67XlInvkmmZH7jVjNn9vl9UwxCA5TV6y1+ucC141Y9Zqp8D5/ZGFqWnHsXMN\nEZHrmLSJiBzCpE1E5BAmbSIihzBpExE5hEmbiMghTNpERA5h0iYickhiOtdcZJQx2q6DpNsxZaPs\nC991tN2BZPCM98yY77SFGVNYNtCMabJkf+D8y058xlzG5fqCGTN82zwzpqBpXzNmMBabMY/iRjPm\n9uLJZgxerGfH/GdaUjvX4M3YHcfanbvaXMa3Bd3tgk60R0vZ3tA+/so6wS6qoDDHjMnWIjOmzcpt\nZsyGHvYIL8XobMacOCB49CcA2LbCbiJNd4UYbWeRvZ3bD/zKjNnwVtfA+UNbAnOHRG/bPNImInII\nkzYRkUOYtImIHMKkTUTkECZtIiKHMGkTETmESZuIyCFM2kREDslISCk/GPN72IsY9JP37aDnzzJD\nZIK9mAU63A663v680+H2Bf3y8+BRfX6n7c1ldJleapdzWXA5ANBIepoxvTT2SC0VToddZ9xpd5zp\nMWOpGbPyP+2i6tSk2Pt4/fhu5svTzw7uXAWEG1GoyYsh+hddYHceaah2Z5/Wi7fbZfW321vbJfZ7\nqLTfLrusQruspjNDvF8/trdz+v/aZeHXdggaGPurT+xZPNImInIIkzYRkUOYtImIHMKkTUTkECZt\nIiKHMGkTETmESZuIyCFM2kREDjE714jIFADnAChV1Rx/2jgA1wDY6Ifdq6p/j7WM22b/LrCMCTvG\nmRVtnF5sxqQvtDsqfNLd7skzEqvMmMwn7dEyJuMWM6aeDg2c/4u9n5jL2PpGWzNGOoYYoegYe1Sa\nKzs8a8aUhOhcM2iG3Vlqu2SZMfGojbaNj/MCSjjNrINikBnTYcKXZkwfLDNjnoU9UsxHcr4Z827/\nM82YUSFGnJnVzx7hKEvsjjzt1F6vK89/zYxZqr3NGNxgh2DZ/BBBHwTPzoy9/cIcaT8HINpeelRV\n+/p/sRs1Uepi2ybnmElbVecD2BJlVlLG5SOqLWzb5KJ4zmnfJCLLROQZEbG/nxC5g22bUlZNbxj1\nBIAJqqoich+ARwFcHSv4o7w5Bx53zO2CjrldalgsHe525H+CHfn2ef44VKttA/kRj7P9P6KaKPL/\ngKKi2McKNUraqrop4ulfALwdFH9KXoi75hGF0CS3L5rk9j3wfOP4KbW6/Oq2bSC3Vsunw1k2Kj70\ns7M7o7j4rahRYU+PCCLO84lI5OUKFwBYUYMaEqUCtm1ySphL/l6CdzjRUkTWAhgHYJiI9AZQDu94\n/ro6rCNRnWDbJheZSVtVx0SZ/Fwd1IUoodi2yUUJGbnm9+n1g+efaY+ogcfsEA1xTft5A2eZMd80\nPsZekN2fBTNWjzZj3tERgfNvzZxsLmN840lmjA63R4GRErvj0bPX2x0icJQdcsdv7CGEVsMe+cXu\n4lTXgoYpecp+eeZgM2T9W/Z2aHFutCsXK8veusaM2V3cwow5PqfQjLl7uf2G7Zljd+Za8ekAM+a2\n7N+bMV2b2uu+4a2uZgwy7RCz4wwAe3ib2CM7sRs7EZFDmLSJiBzCpE1E5BAmbSIihyQ+aevqhBcZ\nt7L8ZNeg+krzk12Dalubb/9YlNo+SnYFqq1sfpg70qWYwvxk16Caimp1aUk40v468UXGqzw/2TWo\nPgeT9rr8omRXIU7uJe3y+QuSXYXqW5yf7BpUU1GtLo2nR4iIHJKQ67T79m1z4HFJSRO0b9+mcsDR\nIRZyZIiYvXZIOzQwY1pWuRd6yTqgfccqQa3ssrJDBOUEXI8JAO3QwVxG3+xDp5WsBdpHTu/byFyO\nZNif4Vp1O0TTxg7pgHaHTMtCVqXpCvua4WTr2/fgW6ikJA3t20e+pQ5dx0McG6KQEPcZ7AZ7/zZN\nTz9k2jpJQ8eI6Xsa1k5ZmSGW0zXEcupHWU5JPaB9xPTMtEPXq6qjwtQ5zP0cw+yvfZX3u5fzqraF\n4NTbvXsG5s6NPk9UQ4xoEgcRqdsC6LCnqkm5/zXbNtW1aG27zpM2ERHVHp7TJiJyCJM2EZFDEpq0\nReQsEVkpIl+KyF2JLLumRKRIRD4VkaUisijZ9YlGRKaISKmILI+Y1lxEZovIFyLybioNmxWjvuNE\n5BsR+cT/OyuZdawOtuu64Vq7BhLTthOWtEUkDcAf4Y1+3RPAJSJi31Yu+coB5KpqH1UdmOzKxBBt\nVPG7AbyvqscCmAPgnoTXKrYfzSjobNd1yrV2DSSgbSfySHsggFWqWqyq+wC8AmBUAsuvKUGKn0aK\nMar4KABT/cdTAZyX0EoF+JGNgs52XUdca9dAYtp2IndaBwDrIp5/409LdQrgPREpFJFrkl2Zamit\nqqUAoKobALROcn3CcHEUdLbrxHKxXQO12LZT+pM2RQxS1b4AfgbgRhGx71qfmlL92s4nAHRV1d4A\nNsAbBZ3qDtt14tRq205k0v4WQKeI50f501Kaqq73/28CMBPe12EXlIpIG+DAYLUbk1yfQKq6SQ92\nGvgLAHvIktTAdp1YTrVroPbbdiKTdiGAo0Wks4jUBzAaQPQx4lOEiDQSkSb+48YAzkDqjs5daVRx\neNt2rP/4CgD2OGuJ9WMZBZ3tum651q6BOm7bCbn3CACoapmI3ARgNrwPiymq+nmiyq+hNgBm+t2V\nMwC8qKpFrFblAAAAXUlEQVSzk1ynQ8QYVXwSgFdF5CoAxQAuTl4NK/sxjYLOdl13XGvXQGLaNrux\nExE5hD9EEhE5hEmbiMghTNpERA5h0iYicgiTNhGRQ5i0iYgcwqRNROQQJm0iIof8P5PTpB3yNquM\nAAAAAElFTkSuQmCC\n", + "image/png": "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\n/ro6rCNRnWDbJheZSVtVx0SZ/ +Fwd1IUoodi2yUUJGbnm9+n1g+efaY+ogcfsEA1xTft5A2eZMd80\nPsZekN2fBTNWjzZj3tERgfNvzZxsLmN840lmjA63R4GRErvj0bPX2x0icJQdcsdv7CGEVsMe+cXu\n4lTXgoYpecp+eeZgM2T9W/Z2aHFutCsXK8veusaM2V3cwow5PqfQjLl7uf2G7Zljd+Za8ekAM+a2\n7N+bMV2b2uu+4a2uZgwy7RCz4wwAe3ib2CM7sRs7EZFDmLSJiBzCpE1E5BAmbSIihyQ+aevqhBcZ\nt7L8ZNeg+krzk12Dalubb/9YlNo+SnYFqq1sfpg70qWYwvxk16Caimp1aUk40v468UXGqzw/2TWo\nPgeT9rr8omRXIU7uJe3y+QuSXYXqW5yf7BpUU1GtLo2nR4iIHJKQ67T79m1z4HFJSRO0b9+mcsDR\nIRZyZIiYvXZIOzQwY1pWuRd6yTqgfccqQa3ssrJDBOUEXI8JAO3QwVxG3+xDp5WsBdpHTu/byFyO\nZNif4Vp1O0TTxg7pgHaHTMtCVqXpCvua4WTr2/fgW6ikJA3t20e+pQ5dx0McG6KQEPcZ7AZ7/zZN\nTz9k2jpJQ8eI6Xsa1k5ZmSGW0zXEcupHWU5JPaB9xPTMtEPXq6qjwtQ5zP0cw+yvfZX3u5fzqraF\n4NTbvXsG5s6NPk9UQ4xoEgcRqdsC6LCnqkm5/zXbNtW1aG27zpM2ERHVHp7TJiJyCJM2EZFDEpq0\nReQsEVkpIl+KyF2JLLumRKRIRD4VkaUisijZ9YlGRKaISKmILI+Y1lxEZovIFyLybioNmxWjvuNE\n5BsR+cT/OyuZdawOtuu64Vq7BhLTthOWtEUkDcAf4Y1+3RPAJSJi31Yu+coB5KpqH1UdmOzKxBBt\nVPG7AbyvqscCmAPgnoTXKrYfzSjobNd1yrV2DSSgbSfySHsggFWqWqyq+wC8AmBUAsuvKUGKn0aK\nMar4KABT/cdTAZyX0EoF+JGNgs52XUdca9dAYtp2IndaBwDrIp5/409LdQrgPREpFJFrkl2Zamit\nqqUAoKobALROcn3CcHEUdLbrxHKxXQO12LZT+pM2RQxS1b4AfgbgRhGx71qfmlL92s4nAHRV1d4A\nNsAbBZ3qDtt14tRq205k0v4WQKeI50f501Kaqq73/28CMBPe12EXlIpIG+DAYLUbk1yfQKq6SQ92\nGvgLAHvIktTAdp1YTrVroPbbdiKTdiGAo0Wks4jUBzAaQPQx4lOEiDQSkSb+48YAzkDqjs5daVRx\neNt2rP/4CgD2OGuJ9WMZBZ3tum651q6BOm7bCbn3CACoapmI3ARgNrwPiymq+nmiyq+hNgBm+t2V\nMwC8qKpFrFblAAAAXUlEQVSzk1ynQ8QYVXwSgFdF5CoAxQAuTl4NK/sxjYLOdl13XGvXQGLaNrux\nExE5hD9EEhE5hEmbiMghTNpERA5h0iYicgiTNhGRQ5i0iYgcwqRNROQQJm0iIof8P5PTpB3yNquM\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] From 323d41a413fa5c99247e2784b27dbd10c40c72d8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 30 May 2017 14:05:08 -0500 Subject: [PATCH 006/123] Force excited state for Am242_m1 to be 2 --- openmc/data/endf.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openmc/data/endf.py b/openmc/data/endf.py index 292d73ae3..0fa75ded8 100644 --- a/openmc/data/endf.py +++ b/openmc/data/endf.py @@ -353,8 +353,9 @@ class Evaluation(object): # Information about target/projectile items = get_head_record(file_obj) - self.target['atomic_number'] = items[0] // 1000 - self.target['mass_number'] = items[0] % 1000 + Z, A = divmod(items[0], 1000) + self.target['atomic_number'] = Z + self.target['mass_number'] = A self.target['mass'] = items[1] self._LRP = items[2] self.target['fissionable'] = (items[3] == 1) @@ -370,10 +371,14 @@ class Evaluation(object): self.target['excitation_energy'] = items[0] self.target['stable'] = (int(items[1]) == 0) self.target['state'] = items[2] - self.target['isomeric_state'] = items[3] + self.target['isomeric_state'] = m = items[3] self.info['format'] = items[5] assert self.info['format'] == 6 + # Set correct excited state for Am242_m1, which is wrong in ENDF/B-VII.1 + if Z == 95 and A == 242 and m == 1: + self.target['state'] = 2 + # Control record 2 items = get_cont_record(file_obj) self.projectile['mass'] = items[0] From 3dd03a35ba6d1e9e90123c7369f0b35248eb5fed Mon Sep 17 00:00:00 2001 From: Giud Date: Tue, 30 May 2017 15:20:55 -0400 Subject: [PATCH 007/123] Update mg-mode-part-i.ipynb --- examples/jupyter/mg-mode-part-i.ipynb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/jupyter/mg-mode-part-i.ipynb b/examples/jupyter/mg-mode-part-i.ipynb index 5addb34ea..cdd56db03 100644 --- a/examples/jupyter/mg-mode-part-i.ipynb +++ b/examples/jupyter/mg-mode-part-i.ipynb @@ -404,8 +404,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQcAAAD8CAYAAAB6iWHJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX/sX1V5x9/PSkEislJ+WSkDjNWAXaf2GyJxIZnApMRQ\nXS18dVGwJq1Lzba4skKa1K1LDayNyzYr0ISOmqAFrKRM6RAZjJgUtDDsihWpPwgdpIxiUQOiyLM/\nPveW+z2fc+/5cc+5n/vh+34l39x7z73Pc57P5/u9z/ee557nOaKqIIQQk98btQGEkH5C50AIsULn\nQAixQudACLFC50AIsULnQAixQudACLFC50AIsULnQAixctSoDajy+284Xs88YSYA4KXfzgYAHDvz\n+SnHtrbQ465kUuqoth2eezwAYNaBXzQe+1zzetRBmnni0P7nVPVk13W9cg5nnjATd39y0ZHjvQcv\nx/xTb/U+tuEj49IToyPGdh+Z7RsWoYklV+2cco3rOEamLzpsLLlqZ+N5Aly05dInfa4b62GFyzF0\nrSdEZ44+Y3HdcK+XPkkYvXIO1cfvvQcvb9yW+67jrnRUcelouqZJBpj6n3HJVTuHjm3X1rX76HDp\ndp3rg+0kDmmblSkibwDwAIBjMBimfE1VPyciZwHYBmA2gEcAfFxVf9Ok6+0nzdMvLf5CK3sIIc1c\ntOXSh1V1wnVdipjDywDer6q/EpGZAL4jIjsBfBbAP6nqNhG5AcCnAFzfpOjYmc8fedwu/2O6xuA+\n1+TW0WW/5hgcACaX7TrStm3LecHHbXWMqt9Sh+07Ie1p7Rx08Ojxq+JwZvGjAN4P4GNF+1YAfweH\nc6gy/9Rbhx6pbdf4tOXW4as3dR/bNyzC7fvWttJh3uRdkaLfyWW7sPTsdQmsITaSxBxEZIaIPArg\nWQD3APgxgMOq+kpxyQEAp7n02GIOTfjGC2xydTK28z46ms772h7Kkqt2HvnvGUJVZtuW85LoiJFP\noYNPCvloHXOYokxkFoA7AKwF8G+q+rai/XQAd6nqH1pklgNYDgCnvPHkhbdcflMyewghw3QZcziC\nqh4WkfsBvBfALBE5qnh6mAvg6RqZzQA2A4OApCvmUG3zPd64acERHatW7gmSMa8P6afNZynbbDLl\nGNuMOfiO420ypu0+OszvyCVj+z2ksN38PkgaWg8rROTk4okBInIsgAsB7ANwH4CPFJddAWCHS1d1\nNmDdmLzaPv/UW53HMTqqf8TV/SYdMed9bDWpBt+2b1g05ebxHcebMnWfsQmf78gln8J28/sg6UgR\nc5gD4D4R2QPgewDuUdVvAFgN4LMish/AiQCSjxds8YIUOsr/am31tjnvQ2zMocq2Lecl+byhrFq5\nJ4ntfFrIR2vnoKp7VPXdqrpAVeer6rqi/Seqeq6qvk1Vl6rqyy5dL/12tnPSUd3koLKterOX2/KP\nv9y6dPjIVLd1ziXks/heWzc5CHjtMTt0a7Pdde2qlXum/PjYYXNCKWxu+k5IPL2aIQnEveK7cu16\nXLl2faOOm9etCdbrI1Pt6+Z1a5wyVTttOnyGQi5sj+gTC1cMPf5Xr1u69gEsXfvAlPPX7Th76Lja\n9uSJh/HkiYdrz9t0mP2Ytm7ctAATC1d4fSaSl6RvK9ryR3NO1JDEK2D4ZjNvTh8dLmImQdl01AUs\nffuxJV6Z8xx8AoHmjWbewGccmjXlpncdx8qsXrxvyPaQwCiAoXkOfHpw4/u2ondPDq8XUsQUuuKM\nQ7OmRZ8kjF45h6ZJUHXJS9Vx7KqVe1pPgoqdSFV3rnpsjrljJkGZiUYxE4maZHxv2up1MTIuO+ow\nZZh4lY9e1XOw4TMMKIcSe1F/I/tMx/axo+0Twc3r1njP/qz2G0M1EPja4/igzRxKuLANC5qu9cW0\nY/fDNwKYGoBkvGE09OrJwTbPoW5rXlfu24J7TTps+lLosB3H6DDbzZhD01yB8thsr97k5g1f5wCa\nrsuho872ps/LeQ5p6ZVzCGW6F3tJdTP4PhGkJFWfdAj56JVziIk5hMQL2ugISc7y0eFrq0mKmIMZ\nL/CJH5jtTTI+Onz7NWHMoTt69SqTxV4Iyc9IEq/a4lPspSmJqrzGJeNTdCVExpV4VWdXjIxPsRdT\np2v+gc2OEJny9+CSsf3uQmVY7KU7ejWsqOIzJt+4aYEzGOjTjynjk0gUknhVJx+TsFTFTLyK4ckT\nD48s8apt3MFMvCJp6ZVzCC32Ys5rMOV8XxnGJF65+vFJvDLnaISSIvHqjEOzovpua/uqlXtaT4Ri\n4lVeGHMgZJoxljEHwF2ExeeaHAVjUuiI6SdFsRdbvKBscx3HyKTQUbax2Mvo6NWwoqnYS93EoRzF\nXmJ0mOeaJlKF9GOSotiLOfmoaTJSXXvbSVC+/Zqw2Et39Mo5hGKLF8TqaTpOoTP0vA8pYg7A+CZe\nMeaQl145h5AVr+qCgE2Tj+omI5k6bMcxOkI+g8+ELcCv2It5HDOBqW7btY66z1SFxV7y0CvnAHTz\nX9vnuhgdsbaHZoG6qHuaaJqh6EuKWY6mPh8dKZ6QSBi9elsRU+zFRVc6XHpjdLgmQQF+xV5SF2rp\nUgeLvaSHxV4IIa3olXPwmQTVJvHKR4ftvI+OpvN1xAxJciRexTAqHUy86o5eOQcbtsDclWvXB43B\n9x683CrTdFPvPXg53vevv260w6QsdBsSiDSL49b1VxeYtDGxcAUmFq6oDUjauH3d+bh93fnewUQA\n+Pz1O/D564eXI2nSUfbjohqQLD9PHXQKeeiVc/Ap9lLO47fN56+bO2DKVHXWzadYcdvWKduQQi22\nfpo+i+3z1MmUMQfbO31bJWcgbI6CKWNuS8rvxdxvkjU/o89ciaaK2SVN3wmJp1fOIRRb4lUMpg7z\njz2FztDzPqRIvALiEqf60CcTr/LSK+fgU+zFVVC2bcxh78HLceNlVxw5ru436fA5b7bFJC/liDnE\n2OHzHZmY/TDm0G9av8osVtD+MoA3A3gVwGZV/WcRmQ3gVgBnAvgZgMtU9edNuph4RUh+uky8egXA\n36jqIyLyJgAPi8g9AK4EcK+qXisiVwO4GoP1MxuJSUSquyaFDh+ZLnX4FHtpk3hVtvkUe+lCh8+q\n2yz2kocUa2U+o6qPFPu/xGCF7dMALAZQDt63AviQS5fPKttVmgKKqXQ0yTVd7xNziEm8qhIbc2hK\ngIrVESPfVgdjDnlJGnMQkTMBvBvAQwBOVdVngIEDAXBKjcxyEdktIrsPvTj86rAJ1xwFH1Lp8Glz\n9RtKqmIvKaZRd9VvFSZe5SXZ9GkROQ7AfwFYr6pfF5HDqjqrcv7nqnpCkw7GHAjJT6fFXkRkJoDt\nAG5R1a8XzQdFZI6qPiMicwA866MrR7GXsi2FjhCZXIVqQou9AN0Wakmpg8VeRkfrYYWICICbAOxT\n1eq//TsBlO+4rgAwPJXOIFexF9cEphAdNvtyFHupi0HEFHtxTYLqY7GXOh0s9tIdKWIO7wPwcQDv\nF5FHi59LAFwL4CIReQLARcVxUlKkd6fUE6IzRZ+p/lOOa7EXgE8LOUnxtuI7qiqqukBV31X83KWq\nh1T1AlWdV2yfd+kKXfHKPK6bBNWUp2DTl0JHjO0+MubN0DQJqk2xF5NR6Wgq9mKeo6NIS6/qOTAg\nSUh+xrL6dHXFK8A+Ccick3/zujWNOk0Zc1UpWz9mlqRrJSqffnw+S+iKV4C92EvI6lVlW+iKVzbb\nQ1ev8in20rTiFcBiLznpVW7FqEiRBNWFzlyMa+IVyUuvnEPbFa9SJF6Vel2EJF7VMaoVr5oSr3xJ\nveJVTICSk6Dy0suYg21OQshxjIzv3Igc/Ybq2L5h0ZSbYnLZriEnYbbZrqlizi8o25qO6/S4dJj9\nmPjYbraZ3wmpxzfm0CvnEFpg1jZRyCRGh4+MK26RS0dM4lVIIlbZ1kWBWVu/oZ8FYOJVKGMZkAwl\nR6GXnHpT97F9w6KhgGQobVe6HmW/k8t2DQUkSTrGLubgijGkiDnE6Gg6Xyfv049JjmIvfUi8YrGX\n/tGrYQXnORCSn7EdVsQUailfi5VRc5/kJd9+Uugoj8139jE6mmIOdYlXtn5NmVEVezHtaJrX4Eq8\nqn4npD29GlbEFHsxKzj7FFBpSoCynffR0XS+jtTFXnwLv5gyoyr2ksJ2Jlvlo1fOIZS9By8fesce\nmtDkijm0sS3FNU2kKPaybct5I0u8SmE7nxTy0cuYQ8zcAJO+6vA5H9OPiTkPYOOmBcGTlXzmNeTQ\nYdrqmqNBwhjbtTJ9H69DaiMAw/kSLh0bNy2wyjTp2LhpwZRhju9wI3QYs33DoimP05PLdjkf0Xc/\nfOPQNdVj0/bJZbuwevG+KTp8ZMy+Vy/eFyQzuWwXdj9845D9Tbab3wdJQ6+cg8+KVzGFWupWvKqT\nsa1E5bKjSl3so7p1OTRbP0BYsZfyuK693G9aeatORwqZFLaz2Es+euUcQkkRG0ipJ0Rnjj5jicmN\nGMc+SRi9cg65ir2UlH+QriIrtqSikIlSdUHSmMlWJikmQTXJ1N20TdeZMnV2NF0XazsnQeWjlwFJ\nQkg+xnISlE+xF1fykklMwlMKHV0kXgH2Yi8hyUsxMn3RAbDYS056NawIJUXyUko9ITpz9BlLipW6\nx6FPEkavnENosZfYpKkQHU1yTdeHJl7FkGoSVIyOmHhBin5NHXxSyAdjDoRMM8Y+5hCSeNVmrD9K\nHTEytiQjsy30uK2OUfVbp4OkoVfOoYrv1GSfti502KZAh/YbSopJP6OaODTOtk8XehVzCCXXJKgu\nEq9S9LHkqp1J/lOO4r9tKrv5pJCPJDEHEdkC4IMAnlXV+UXbbAC3AjgTwM8AXKaqP2/Sw5gDIfnp\nOuZwM4AvAvhype1qAPeq6rUicnVxvNqlyFwxuWmMGXrclY6yLaWO6jV1cZmYOE0OHaPqt09T0l8P\nJBlWqOoDAMy1MBcD2FrsbwXwIZeew3OPP7JfN540E21cx13pCD3ve41JaDaqj466c7E6fGRS6Ij9\n/MSPnDGHU1X1GQAotqfYLhKR5SKyW0R2v3TouaAOUow5bTrGZRyfYq7EODPdP39uRh6QVNXNqjqh\nqhNzXjr6SHt5c7m2Vcob3Ve2Tkfots65hPTvq6Muict2zmfrSnBrShqr/rTREWN7U38kDTmdw0ER\nmQMAxfbZWEVm/oDtuNo2uWyXl0yTDl+Z6jTgWB3VNpuOVKR+7DYf61PpJP0g2QxJETkTwDcqbys2\nADhUCUjOVtW/bdJxyrsW6pL/fOjI8ZKrdjoTb1z4JO+k0OHSG5t4ZAYk2yaapUhWS5F4ltN20kyn\nZeJE5KsAdgF4h4gcEJFPAbgWwEUi8gSAi4rjacM41TwcxQ3Fm7j/pHpb8VFVnaOqM1V1rqrepKqH\nVPUCVZ1XbM23GUPMOvCLI/t1AT0z4cd13JWOJsrz5nUxyUtmwldMwZgmmRQ6fGRS6Ij9/MQPJl4R\nMs0Yy8Srw3OPHxpjhxb/MLGt+OQa608sXDHlvG3lJZsO12pNqWMOKZLGyjbTdpcOs6hsqIx5fYzt\ndZ+fpGHkrzLbkKpgSI7CIy6dKfpM9bbAvNG7IEWfOd6WkNforXPwmURkKxgSGgi06QitjGzr0ycO\n0TZomWIS0N6Dw6uGdcGqlXuS2M4nhXww5kDINGMsYw7AcCKSa9wOuFdmDlkxuu6amFWmQ1a7rvt8\nKWIOrniCj44UiVc+/YbGPmw6SBp65RzMxCvX0GJy2a6h4GHoWN62QrTPqtHmKtPmepAuOzZuWmBd\n9i2EFOPtWB1mwlPoTTlK24kfvY05+JBqolGOVaZdtqUY5+cqdtMF42z7dIExB0KmGa+7mEP1P7HZ\nZh67YgFN19Qdx8jYdLhsd8UcgNEUewmRSaGjje0kDb0aVjQVe7Gtumxbvt2MBdhouubJEw9bz9uu\na9JhO3atGO3DqIq9hBRqSaGjDhZ76Y5eOYdQxim5KQfT/T3/dP/8uemVc7AlXplJS3Xbcr/6CF/u\n123N/fI4hQ7b1mV7lfLYfGPTdDO4iq7YrnMlXrXR4au7jQ7fcyScXjkHwG9mpPn68rodZ0+5uWxv\nH25fd/5Qm3mDm8c2GZcOl8x1O86ecjyxcIVXdmb1e2mqvlTuX7l2/ZAOV0ZjVabuRovJiqy2X7l2\nfbAOm4ypn44hPb16W+FT7MWck7907QONOs84NGtoYo1rHoN5g5sy5qQoWz+mXbaJVLbkpRTFXkIm\nEsXIdJl45ZIxoZNw02mxFzLejGviFclLr5yDT7GXKqtW7nEODWw0yZR6bftNOprO1+HTj0mKYiem\nTMyErBjbTXkWe+k3vRpWcBIUIfkZy0lQMcVegOZciNAkKl8ZW8whVEefir2Mqw7b5ydp6JVzCGVy\n2a6h6H8osYlXMXpT95Fq0s8oJg8x8ar/9CrmEIo5ryEGW8whRSKWS8cZh2b1ptjLqBKvxtX26QJj\nDoRMM8Yy5gDEFXupG9vHJF6ZOuqOU+kITbzqY6GWvuiotpH29GpY4bPKdhUz0QpoToiqu8aVOOWj\no+l8HTGJV1ViC6w2JS/F6oiRT62DpCW7cxCRi0XkcRHZXyyL1ztyFHvJoTMXo4o5kH6TNeYgIjMA\n/AiD5fAOAPgegI+q6g9s1zPmQEh++hJzOBfAflX9CQCIyDYAiwFYnQPgV+ylnHpbzszzKbKycdOC\nKTP5XDIrbtsKALjxsiumyDQVf3HZ5SNjft6YYi+2Qra+Mub1TTLmd+RT7KWun5SfhaQh97DiNABP\nVY4PFG1WfIq9mHPym+IH5X4pU25dhVrKP3rgtRvALPrSpKPOxqbrTJm6GERMwZQQmbqcB/M623fk\nssPU3bZgjK8MiSO3cxBL25RxjIgsF5HdIrL7pUPPZTaHEOJLbudwAMDpleO5AJ6uXqCqm1V1QlUn\n5rx09JF2M/GqfMw2k3x8Eq9KmXLrKtRSHUqU+yHFXupsDEnwqpsgFVIwJUamLonKvM72HbnsMHWH\nFJ1pI0PiyB2QPAqDgOQFAP4Xg4Dkx1T1Mdv1DEgSkp9eBCRV9RUR+QyAuwHMALClzjEA4YlXwHBl\nJZOYpKkUOrpIvLIxTklTbXXY4NNDOrLPkFTVuwDclbufNqRIgupCZy7GNfGK5KVXMyRDi73YEq9S\nFHvxmcCUotiLT+3IJmITj5oKpsTqiJFPrYOkhYlXhEwzehFzCGW6FXsBulllOyZ5aVSFWph41R96\n5RxCGfdiL6sX72vVxzgXTBln26cLvYo5hDLuxV7akmrMPa6JV4w55IUxB0KmGWMZcwDcxV5siTiu\nJKoQmbKtLokqpB+fmENd4lX5eVMkXvkkUYUuamOzPXRRm6bPEiPDp4i09GpYEVrsZeOmBV6JVyau\nYi9NCVF1OprO1+HTj0lToRbfMbgpE7PATIztpnwK29sWjCH19Mo5kNEQsyjNOPZJwuhlzGH7hkVT\nJkFNLts1VM/BrM1gBvjMNh8ZE5eMTUeojHm97fOa34fJ/FNvHXqkNvXarjFxyfjocMnYPq9Lh03G\nxxZiZ2zXyvQZTux++MYpx6sX75syVrc90tsW3HUNSVyL9Np0uGTM15e7H77Rq5Zk9Xux1U40H69v\nXrdmSIfrkbwq41tPIbSexM3r1gTrsMmY+jmkSE+vnIMt5lDeLK5tuW+LBYQUaqmLW4TqsG1dtlcp\nj01n2XQT1DmMkGIvKXX46m6jw/ccCad3bytCiKnY/Hpiut8M0/3z56ZXTw5NiVflGNxMVjKPYxKv\nzHO28yEJXnXHZnJVTOJVU9KU7xi8bZGVLnTUkeLzEz96GZAkhORjLCdBxSReme/YzWDlti3njazY\ni2sCV4pVtn0SoJomONXJjKrYS8hkrDq9JA29GlaEkirmkKMwi8u2mIlDJqnG3ONc7IVxh3z0yjnE\nFHvxLcxaR65iLy47Vq3cM9arbPehUAsTr/LCmAMh04yxjzmErLIdEpcwx/p1OlwyNh0xMn0p9hKa\neGUOi0JlfJO1WOxldPTKOVRxTRkG7OP60DiE7frQeIA53dnHjhTxklQFU65cu761nlA2blpgncUZ\nAuMNeelVzCGUtmP21HpCdKboM9WYe1wTrxhzyAtjDoRMM8Yy5gC4i71U20KPu9JRttlWCA/tJ6bY\nS8g4PYeOUfXLp4i09GpY4VPsxUxWch13paMJW6JVqI6SHMVe6s7F6vCRSaGDxV7y0so5iMhSEXlM\nRF4VkQnj3DUisl9EHheRD7Qzc/wYp6SwcZ4ERfLR9slhL4A/AzCliIGInANgEsA7AVwM4EsiMsOl\nzDYJyky4qm5tiVe2ZKYYHT6yZj+pdVS/h3JbPjqXwTjbZKS6re26tjpc+ut0mH3n0EHa0SrmoKr7\nAEBEzFOLAWxT1ZcB/FRE9gM4F0DUv9OlZ68DsNNxjCNtr43VXTL1Onxlqq9bY3VUZWw6UpH65slx\nM9ryJ8hoyBVzOA3AU5XjA0VbI7aYg2tbZfuGRUd+2ugI3Zp6Yvr31VFXBMV2zmfrKrLSVHSl+tNG\nR4ztTf2RNDifHETk2wDebDm1RlV31IlZ2qzvTEVkOYDlAHDc3D9wmTMFn5JyMTpy6U3NdL8Zpvvn\nz43zyUFVL1TV+ZafOscADJ4UTq8czwXwdI3+zao6oaoTc146+kh73ezIavuSq3Y6j7vSEXre9xqT\nURV7CdHhI5NCB4u95CXJJCgRuR/AKlXdXRy/E8BXMIgzvAXAvQDmqervmvRwEhQh+emk+rSIfFhE\nDgA4D8A3ReRuAFDVxwDcBuAHAP4DwEqXYyCE9Iu2byvuAHBHzbn1ALrP6CGEJKFXMyQJIf2BzoEQ\nYoXOgRBihc6BEGKFzoEQYoXOgRBihc6BEGKFzoEQYoXOgRBihc6BEGKFzoEQYoXOgRBihc6BEGKF\nzoEQYoXOgRBihc6BEGKFzoEQYoXOgRBihc6BEGKFzoEQYoXOgRBihc6BEGKFzoEQYoXOgRBihc6B\nEGKl7XJ4G0TkhyKyR0TuEJFZlXPXiMh+EXlcRD7Q3lRCSJe0fXK4B8B8VV0A4EcArgEAETkHwCSA\ndwK4GMCXRGRGy74IIR3Syjmo6rdU9ZXi8EEAc4v9xQC2qerLqvpTAPsxWHGbEDImpIw5LAOws9g/\nDcBTlXMHijZCyJjgXGVbRL4N4M2WU2tUdUdxzRoArwC4pRSzXK81+pcDWA4Ap7zxZA+TCSFd4HQO\nqnph03kRuQLABwFcoKqlAzgA4PTKZXMBPF2jfzOAzQDw9pPmWR0IIaR72r6tuBjAagCXquqLlVN3\nApgUkWNE5CwA8wB8t01fhJBucT45OPgigGMA3CMiAPCgqn5aVR8TkdsA/ACD4cZKVf1dy74IIR3S\nyjmo6tsazq0HsL6NfkLI6OAMSUKIFToHQogVOgdCiBU6B0KIFToHQogVOgdCiBU6B0KIFToHQogV\nOgdCiBU6B0KIFToHQogVOgdCiBU6B0KIFToHQogVOgdCiBU6B0KIFToHQogVOgdCiBU6B0KIFToH\nQogVOgdCiBU6B0KIFToHQogVOgdCiBU6B0KIlbZrZf6DiOwRkUdF5Fsi8paiXUTkX0Rkf3H+PWnM\nJYR0Rdsnhw2qukBV3wXgGwDWFu2LMFg8dx6A5QCub9kPIaRjWjkHVf1F5fCNALTYXwzgyzrgQQCz\nRGROm74IId3SdpVtiMh6AJ8A8AKAPymaTwPwVOWyA0XbM237I4R0g/ -PJQUS+LSJ7LT+LAUBV16jq\n6QBuAfCZUsyiSi1tEJHlIrJbRHa/8OsXYj8HISQxzicHVb3QU9dXAHwTwOcweFI4vXJuLoCna/Rv\nBrAZAN5+0jyrAyGEdE/btxXzKoeXAvhhsX8ngE8Uby3eC+AFVeWQgpAxom3M4VoReQeAVwE8CeDT\nRftdAC4BsB/AiwA+2bIfQkjHtHIOqrqkpl0BrGyjmxAyWjhDkhBihc6BEGJFBiOAfiAi/4dB7MLG\nSQCe69CcOmjHVGjHVPpgh8uGM1T1ZJeSXjmHJkRkt6pO0A7aQTu6sYHDCkKIFToHQoiVcXIOm0dt\nQAHtmArtmEof7Ehiw9jEHAgh3TJOTw6EkA7pvXPoS7UpEdkgIj8s+rpDRGZVzl1T2PG4iHwgsx1L\nReQxEXlVRCaMc13acXHRz34RuTpnX5a+t4jIsyKyt9I2W0TuEZEniu0JmW04XUTuE5F9xe/jr0Zk\nxxtE5Lsi8v3Cjr8v2s8SkYcKO24VkaODlatqr38AHF/Z/0sANxT7lwDYiUF6+HsBPJTZjj8FcFSx\nfx2A64r9cwB8H8AxAM4C8GMAMzLacTaAdwC4H8BEpb0zOwDMKPS/FcDRRb/ndPg3cT6A9wDYW2n7\nRwBXF/tXl7+fjDbMAfCeYv9NAH5U/A66tkMAHFfszwTwUHE/3AZgsmi/AcBfhOru/ZOD9qTalKp+\nS1VfKQ4fxCANvbRjm6q+rKo/xSDZ7NyMduxT1cctp7q041wA+1X1J6r6GwDbiv47QVUfAPC80bwY\nwNZifyuAD2W24RlVfaTY/yWAfRgUNOraDlXVXxWHM4sfBfB+AF9rY0fvnQMwqDYlIk8B+HO8Vqey\nrtpUFyzD4Kll1HZU6dKOvnzmKqdqURag2J7SVcciciaAd2PwX7tzO0Rkhog8CuBZAPdg8FR3uPLP\nLOr30wvnkLvaVCo7imvWAHilsGVkdtjEUtvRk756jYgcB2A7gL82nnI7Q1V/p4Miz3MxeKo723ZZ\nqN7WNSRToJmrTaWyQ0SuAPBBABdoMZgbhR01JLejJ335clBE5qjqM8Xw8tncHYrITAwcwy2q+vVR\n2VGiqodF5H4MYg6zROSo4ukh6vfTiyeHJvpSbUpELgawGsClqvpi5dSdACZF5BgROQuDcvzfzWVH\nA13a8T0A84qI+NEAJov+R8mdAK4o9q8AsCNnZyIiAG4CsE9VvzBCO04u35yJyLEALsQg/nEfgI+0\nsiNnJDVRNHY7gL0A9gD4dwCnVaK0mzAYX/0PKpH7THbsx2Cc/Wjxc0Pl3JrCjscBLMpsx4cx+M/9\nMoCDAO5j8QNEAAAAfklEQVQekR2XYBCh/zGANR3/TXwVg0rmvy2+i08BOBHAvQCeKLazM9vwxxg8\nqu+p/E1cMgI7FgD478KOvQDWFu1vxeCfw34AtwM4JlQ3Z0gSQqz0flhBCBkNdA6EECt0DoQQK3QO\nhBArdA6EECt0DoQQK3QOhBArdA6EECv/D8nj1UuvNoxlAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -658,8 +657,7 @@ PJQUS+LSJ7LT+LAUBV16jq\n6QBuAfCZUsyiSi1tEJHlIrJbRHa/8OsXYj8HISQxzicHVb3QU9dXAHwT "outputs": [ { "data": { - "image/png": "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 -nOhMsOcktYovufu89R\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS4AAAEICAYAAADhtRloAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX2cnVV177+LyRDIC8S8EEISSIQoIGKkkcTiC4pWiC9A\nL7bY+6HoB4nlaquW+7ngywVsayutSq1vGAoVqxexVTTaUI1cXsK1IAGHt0Qk6GCGxIQACQl5ncm6\nf5xnYOZkrz3nzJw5c57h9/18ns+cs/az197Pc85Zs5+99lrb3B0hhCgTB4x0B4QQol5kuIQQpUOG\nSwhROmS4hBClQ4ZLCFE6ZLiEEKVDhqvEmNnNZnb+SPdDiGZjWsfV2phZJzAd6AGeA5YDf+7u21tR\nrxDNQCOucvBOd58AnAS8Bvhki+utCzMbMxLtivIiw1Ui3P0J4GbgBAAzu83M3l+8fq+Z3WlmnzWz\nZ8zsN2Z2xiD1HmFmy8zsaTNba2YXFvKDzGynmU0t3n/SzLrN7JDi/d+Y2T8Wr8cWffmtmW00s6vN\n7OCi7FQz6zKzS8zsd8C/mNlUM/uRmW0p2l1pZvp+iiT6YpQIM5sNLAZ+EZyyEHgEmAr8PXCtmdkg\n9N4AdAFHAOcAf2tmp7n7LuAe4I3FeW8AHgdO6fP+9uL1lcDLgPnAMcBM4LI+zR4OTAaOApYAFxdt\nTqPyCPtxQPMYIokMVzn4vpltAe6kYhj+NjjvcXe/xt17gOuBGVSMQM16CyP2OuASd9/l7h3APwPn\nFXVuB95YPN6dCPxT8f4gKo+bKwtjeSHwUXd/2t23FX0+t0/b+4DL3X23u+8E9hb9Pcrd97r7StcE\nrAjQ3EI5OMvdf1rDeb/rfeHuO4rB1oR69JrZEUCvsenlcWBB8fp24PNU5sUeBFYA1wKLgLXuvtnM\nDgPGAff2GfAZ0NZH55PFCK6XfwCuAH5S1Fnq7p8Z6ILFixONuEQ164HJZjaxj+xI4Ini9c+AlwNn\nA7e7++qi/O288Ji4GdgJvMLdJxXHoYUjoJd+oyl33+buF7v7S4F3An9pZqc1+uLE6ECGS/TD3ddR\nMU5/V0zGnwhcAHyrKN8B3At8kBcM1c+AD/S+d/d9wDXAVcXoCzObaWZvi9o1s3eY2THFY+azVJZp\n9AzDJYpRgAyXSPEeYA6V0ddNVOaiVvQpvx1oB37e5/1E4I4+51wCrAXuMrNngZ9SGalFzCvO2Q78\nF/AVd79tqBciRidagCqEKB0acQkhSocMlxCidMhwCSFKhwyXEKJ0NHUB6tQx5nPaEwVtCdlA5Bzl\nUZDLwYF8d0ZX1LecyZ8YyPdk6hwYyFP3K9cGsHPM2KR8N2k5wM7g5oyhOynfxGGhrp7gpvXsiz/o\nfc8FX8V08/nPP7rPka6ByuptZ18gz/nB9gbyXMDWIQnZc534rs0DhnnlOMbMd9R47gb4sbufPpT2\nBkNTDdecdlh1TKJgfKZS1MOnMnUOCuQnBPLfZHRFfcv1+Y2BfF2mzuxAfkRa7JmlmQ9MPjIp72Ru\nWOdBXpmUT2FzUv5F/iLUtS2wqluemxTW2X7XtHRBuvnKoomIrkAe6YI+MQdV5H4hnYF8V53ywbaf\nMhfLFySE9bGDyqK8WriiEhfbdBTyI4Toh9H6hqHV+yeEaDIHEM+qtAoyXEKIfhjx1GqrIMMlhOiH\nHhWrOYhKRFo1uYnunwyinUDf3d9MyxfGc9YwJS3e8f/iKuO2BgXp+e8KmwJ54PG0jljVyxc+mpTv\nHD8urPNT0rP90UT7x8OUYHAjf5yUt42PXXc/O+2UpHwSzyTlO4mvpev+1JcM2BJWiSfac0R1InnO\nOTArkOemvlO3swERfBpxCSFKh0ZcQojSoRGXEKJ0yKsohCgdGnEJIUpJqxuGVu+fEKLJaMRVTTfw\ndEJ+d1zl0WCZwG2DaP7CINvrnZmtB18XLK0Ytz32O++dlNbXvj7uG2sCfX8Y9C0Tq3lQsLyje24c\n5Dw2iBjeEcx2rOb4UFdUZyLbknKAhcGX4Ie8Oyk/nvtCXQcc/lxS3vOqeN2NRXGED4VV8MsDXRfF\ndUKi2MtcfGO0hGKIyKsohCgdmpwXQpQOPSoKIUqHHhWFEKVDIy4hROnQiKuag0lmIX3qzrjKE4E8\n8hAC3Bh4CW8O5GcEMblAGOTsU2JPZHuU1filmXYWBfqiFMXfy0TT/t+0rulzo0humBK4KSMPYY43\nBT7fT/LZsM55XJOUn8UNSfm6594S6po4Ke29nNKTibLunhmXBdiXg4IgA6//MKPr7KAgThqbDsCO\nUoDXwagYcZnZQVR2KB5bnP/v7n65mc0Fvg1MBu4DznP3XFZ1IUQJMFrfq1jLLj+7gTe7+6uA+cDp\nZrYIuBK4yt3nAc8AFwxfN4UQzcKA9jG1HQPqMpttZrea2Roze9jMPpw451Qz22pmHcVx2UB6B2za\n3Z0Xlse1F4cDbwb+pJBfD1wBfHXgSxFCtDJmMKbWSaSBd0fqBi529/vMbCJwr5mtcPfVVeetdPd3\n1NrHmvZVNLM2M+ugku5uBfAYsMXde7vdBSQnCcxsiZmtMrNVT+6stVtCiJHCDNrbajsGwt03uPt9\nxettwBoCW1EPNRkud+9x9/lUggxOBo5LnRbUXeruC9x9wbRWf3AWQjw/4qrlAKb2DkyKY0ms1+YA\nryYd5PdaM7vfzG42s1cM1Me6vIruvsXMbgMWAZPMbEwx6poF5CLxhBAlwQza472Dq9ns7gNu5mhm\nE4DvAh9x92eriu8DjnL37Wa2GPg+6STvz1OLV3EasLcwWgcDb6EyMX8rcA4Vz+L5wA8G0sVWYPn+\n4u7MrsRR/PVtmcDoKLX7Ubl+BTwVBDPnJiYPSadPjzeqzfVhUSD/RGaz4uBrlFvaEOV23xL44xew\nKtQVBWB/lL8L62xjTlIe5ZafND5e2rB5a3qjgJ7uzIc2mIVB0cazweds78noir4buX4NU875Ri/k\nMrN2KkbrW+7+veryvobM3Zeb2VfMbKq7h1n6a+neDOB6M2uj8mj5HXf/kZmtBr5tZn8D/AK4ts7r\nEUK0Ig00XGZmVGzDGnf/fHDO4cBGd3czO5mKncntVV+TV/EBKs+l1fJfU5nvEkKMNho34joFOA94\nsHDwAXwcOBLA3a+m8uR2kZl1AzuBc4vVDE3onhBidGBADR7DWnD3OwuNuXO+BHypHr0yXEKI/pQg\nWLHFuyeEaDpGJcCvhWmu4WoHjthf/Oxv4iqXBI+6n854FVOLzACOD3TtmBDreiLweJ7YHT+CdwV9\nm5XbMfvXgb7Ie5jTdXZa1+yMV3ELLwnqrEvKo6BsgMu5Min/HyTnZgGYG2z/fBUfS8pfyT2hro3d\n05PyPVMOCetYtAI8s5O0XxzoSnc5u8rc/y3Q9b64zrChEZcQonTIcAkhSkmDJueHCxkuIUR/NOIS\nQpQOGS4hROmQV7E25iU8jb1EHrrckv3IdxR5D8dlwjlPDJxnudTNsxYHBbl5g/cF+k4Lzk+kwO5l\n13NpXavHnxTW2RPk/N1IlIc6ZiWXJOWP8PpM++lfykJuT8o7n4s3pN17W/obYIsyu6tuDoIFM1Xs\na0FB5D3MeBUtCrCdE9dJ9m1v5vxa0YhLCFE6ZLiEEKWjgSE/w4UMlxCiPxpxCSFKhybnhRClQyMu\nIUTpkOGqog0Yn5BnlkNMfy4tn5Ubyk5Oiz3ayDk4H4Cgfcv0mYWB/KH620neL8i61g8KgtZ7Tog/\n7rUck5RvCpZDzKcjKQdYx+ykfEy4LTdsIJ1ueUeQunl717RQV7hUpCuTO3t7IO+Mq4QB2NFnk/u1\nRV3LpftOldW0/U0NyHAJIUqFvIpCiNKhR0UhROmQV1EIUTo04hJClA4ZriragEMT8kfjKu1bgpTG\nx8VBzr/5ZVo+dxCpm8cF3kO7+/Kwjh/6qXRBFEgL8NngOpcHfct9ciekde3JBDlHG8IeEWxQPoVw\nr06uJH1v3p/ZyOVA9iTlP+Td6faPeSLUtWVzehPbfcf+Q1iH265IyzNePb8gLbfg4w89l4AHmajt\n7LhO8juQ3U+nRkpguAZ0nprZbDO71czWmNnDZvbhQn6FmT1hZh3FEeVEEEKUjbYajxGiFrvaDVzs\n7veZ2UTgXjNbUZRd5e6fHb7uCSGaTglGXLXsZL0B2FC83mZma4CZw90xIcQIUQKvYl3rbM1sDvBq\n4O5C9CEze8DMrjOz5P5WZrbEzFaZ2aondw+pr0KIZtA74qrlGCFqNlxmNgH4LvARd38W+CpwNDCf\nyojsc6l67r7U3Re4+4JpLW7FhRCUwnDV1LSZtVMxWt9y9+8BuPvGPuXXAD8alh4KIZrLaAj5MTMD\nrgXWuPvn+8hnFPNfAGeTDyHOc2SuLPDvZurMPTYomBnknI+CooEg9hc/IfJ5E2+l/cZMOzfVt2P1\nc8fFg+UdTEzKt2WWQ0REOecnsSWs807S2zI/RZwnPgrynsGvk/KnV7001BUuYbjrirjOnYH8d3GV\ncNlDVyBfm9EVfTTplR0VUtf5IlkOUUv3TgHOAx40s96UAB8H3mNm8wGnEkP/gWHpoRCiuRj5rBQt\nQC1exTtJ2/Hlje+OEGLEaeCjopnNBr4BHA7sA5a6+xeqzjHgC8BiYAfwXne/L6e3xQeEQoim09hH\nxeQ6UHdf3eecM4B5xbGQiuMvN4HTsLRjQojRRIO8iu6+oXf05O7bgNQ60DOBb3iFu4BJZjZjoO4J\nIcQL1PeoONXMVvV5v9TdlybV7r8OtJeZwLo+77sK2QYCmmu4ohW5udTJ0Q3M7D4d+jcDDyHTM7oi\nD2U69rhCKpAcINgVGwg9kc++sj0pb+uO0yD3BDdtS8ZFtS3wRG4P5OuJ/yFGunI8tTH94bSNCa5z\nVmaL6Z8GM8s5D130S4jSM0OcojlyuB6e0bUqU1Zv+0OlvkfFze6+YECV+68DrW6xmiDrQAWNuIQQ\n/WlwyE9qHWgVXdBvo4JZ5IcGmuMSQlTRwJXz0TrQKpYBf2oVFgFb+6wRTaIRlxCiP431KkbrQI8E\ncPerqSytWkxlie4O4H0DKZXhEkL0p4GGK7MOtO85DnywHr0yXEKI/Sl7rKIQ4kXGKIlVbBzjgZTj\n9CeZOrcEXtG3Z0afkUdkMLrWBfJrMt7af64/MJz5aX2HLAt0vSxWNf7YtD/+YM4K6+wMdoyOcsHP\nDm8MfJH/lZS/jR+EdV4+/ZGkfDUnpfv1VLVH/QX2HpNeDuGnhFWwHwcFwf4FAP7hQNeFQYUo+Brw\nYN8Fe2dcJ6kv/XHVRwkSCba4XRVCNB2NuIQQpUOGSwhROmS4hBBlxOVVFEKUCT8A9pQ9kWDDW0tl\nAs7t1vtHg8hF+7ZAfmF96ZEBOC2Q/1WmX9GO1cGu2AB01OeJfHZeOvgaYBW/n5Q/FsghDsA+jE2B\nrnSqZYBz+GZSvjFTJyJK3by3o/7UzfYfmYaitMqZWG67MiiIvIdxtmvsNUFBzoBMSMiyocm14Qbd\nbbVGA+4beoODQCMuIUQ/3IyeMbWahkasv6gfGS4hxH70tLX2JJcMlxCiH46FOd1aBRkuIUQ/HKNb\nhksIUSYcY0+Lx/w013BNAF6XkAdxWkC818fFGffJ5YGHLvoszsu0vzWQR95GiL2HuzN1IoI6h7TF\nk6Ibg5jENuJ0z1G65d3BTZvK5lDXM4GHsoNFYZ1Xck9SPibqc+6bG8UXZjyEYRrkTKxiMu4WwnTP\nfnOsyl4bFGQ8kclU0A0YKJXhUXFAn6eZzTazW81sjZk9bGYfLuSTzWyFmT1a/H3J8HdXCNEMemir\n6Rgpalms0bsv2nHAIuCDZnY8cClwi7vPA24p3gshSk7vHFctx0hRy07WGyi2CXL3bWbWuy/amcCp\nxWnXA7cBlwxLL4UQTaPyqNja09919a5qX7TpvQnt3X2DmaXWxGNmS4AlAEdWbwMphGg5KpPzB450\nN7LUbLiq90WrbN4xMMXmkEsBFpxoDQhIEEIMJw6jYzlEsC/aRjObUYy2ZkAQ1CaEKBmj4FExsy/a\nMuB84DPF3zgvb8HeA9v43ez9I0PHHbEjrHPI5L3pguWZEd/8QH52MOC7O6Mr2pV6YTx4/CVzkvIp\nma2sp7EtKX88GZUOKzkn1LWaE5Pyxzg6rLM2CICexDNJeW5X7KjsZdwf1ukJUkevC7Yst9wygeBb\n7Zl9ZOwLQcGsuE6kz34ayN8a6wrJBVmnlnA0Isi6BMshajGr0b5onwG+Y2YXAL8F3j08XRRCNJvS\nG64B9kXLLcMUQpSQ0TLiEkK8iHAsjJhoFWS4hBD90IhLCFE6ZLiq2Es76xMRyDvaDg7rTJ+fXmXR\nNj+KioWngijXOUEg8bqFx4W6Ig/ZbGaHdTYHnsAHw5zOAOmdPzfyrqS8I3SdkrzHEAdSA+zZnV5w\nOGZsOsh5bCZifGLgIX3kqZfHdSal60zq/l26wjGpCOOCh9Ji+1pche2BPAiYBrCLgoJUSmWA4FKA\nvPewnjqDyHSeYlSs4xJCvHgoQ8hPrRnxhRAvEnofFRuRHcLMrjOzTWaWHAeb2almttXMOorjslr6\n2NpmVQjRdCpexYbFKn4d+BLwjcw5K939HfUoleESQvSjkY+K7n5HkZyhoehRUQixH01OJPhaM7vf\nzG42s1fUUkEjLiFEP+pcDjHVzFb1eb+0yAhTK/cBR7n7djNbDHwfggDVPjTVcG3hUH6YcPvvCAJs\nAY5gfVKec+1HN/0wNiblOzPtrwuWPeTcxdEwO9IF8XV2BgHbuSDnR3anlx3s3hXPW+zqnJwuODYt\n3rYlvv/7toxPF8Rp6nm645B0QbS0ILd8YBC7UtMZyKP2IVx2EeaJzwWGR8sx4o853bcGbCxdp+Ha\n7O5R9v2B23J/ts/r5Wb2FTOb6u6Zb4tGXEKIKpoZ8mNmhwMb3d3N7GQq01dxGpUCGS4hRD8auXLe\nzG6gkuJ9qpl1AZcD7QDufjVwDnCRmXUDO4Fz3X3A5DwyXEKI/WiU4XL39wxQ/iUqyyXqQoZLCNEP\n7WQthCgdZQj5aWrvxtDDpIRrZTATgbmhbPTf4rEgPXFOV7T7c+o6enmEtFcvF5gceQ+ja8l5YqeM\nTc9tjhsbp8je9qp0MPvjPw7cirlvTuQPynnVopj5KDA5pyvyHkaeu1z7uZ2sozpR33L3bDC/xNR9\njnMP1IWyQwghSsWo2p5MCPHiQHNcQojSoTkuIUQp0RyXEKJUKHVzFVuYxLJErOKfEefU3cyUpDzy\n9kH9MYk5XVFeouNZHdaJ9OXiC6M+dzI3Kd8QpGeGOHVyFA8JcOvWU9MFUZfr3agUspurZr2EKQYT\nd5iNfgvI9TnyeEZZpbsyutIO7zyptNIN+EWXYY5rwLQ2qQyGZnaFmT3RJ2vh4uHtphCiWVS8imNr\nOkaKWvJxfR04PSG/yt3nF8fyxnZLCDFSNDJ183BRy07Ww5LBUAjRurT6HNdQMqB+yMweKB4lXxKd\nZGZLzGyVma3a8+TWITQnhGgGvXNctRwjxWAN11eBo4H5wAbgc9GJ7r7U3Re4+4IDpx06yOaEEM2i\ndx1XLcdIMaiW3f15F5iZXQP8qGE9EkKMKKM25MfMZrj7huLt2cRJbPuxg3F09Lx6P/ndbQvDOlHA\n8kLuDutE3o6/5CtJ+VncEOo6njVJ+Tu4Jazzdb6ZlEc7TAP8jDcn5X/M9Un50TwW6lq5+/Xp9sfG\n7e9aFaRujsh9c6LlABMy+eGmprdg9mDza/tBpv0gLtzfHlexK4OCzriOrwh0nRFUGMwSktyyjxfx\ncogBLzPIYHiqmc0HnMpH+4Fh7KMQosmUPuQnyGB47TD0RQjRAmjlvBCidMhwCSFKSennuIQQLy72\nccCIhvPUQlMNV8/Odp7+5cz95MtesX/gdS8v51dJ+Sf5bFgn8hJu5LKk/IhM8PO9/F5S/oWMP2Iz\nZwfydMA4wNtIu8l2BJ7Ilbw11HX02IeT8i09md1Fo6Jc6uKIlLcL8KPTnkMAuzeQ3x5UyAVMB967\n0HMI8XVmUiFbtH9N0L7fnNGV/spkvZpJj2MDNoSF1l85rxGXEKIfmuMSQpQOR3NcQojSodTNQoiS\noUdFIUTpcCzM/NsqyHAJIfqhXX6qcZIu3JdkEo5HQ9bTMgkpxgZrUO7m5KQ8yusOcZ72H/O2sE6U\nW34LYdoy1rOnLl1zMusUDgx8+JPa4vv8dPf+y1SA+ndrhnBpRbTkIasvF2QcEe1YndMVBUDndr+O\n6gRLNSwd+15hQiDP/UJT7Q8lw14f9KgohCgVZZjjapB9FkKMFhyjZ19bTcdApDbbqSo3M/snM1tb\nZFQ+qZY+asQlhOiH7zN272pYyM/XgS8B3wjKzwDmFcdCKtmV4wR9BTJcQoh+uBs93Y15VKxhs50z\ngW+4uwN3mdmkqkSlSWS4hBD9ceoxXFPNbFWf90vdfWkdrc0E1vV531XIWshwdVP3bsLL+cOkPOdV\n3MbEpDwKTJ7PXaGuaFfoqF8Ax3NfUj6OHWGdB3lNUn406YDp6cHO1xCngbbHMqmTI69e9HkFgdQA\nno5Lx26M64SByWcOQldnoOvyuIp9NKMvwL8a6IoCpqOdrwFfGejKeSJTn1m8KXvNuBvde2s2XJvd\nfcEQmktF3me+qBU04hJCVGHs62maaegCZvd5PwuCNUh9kFdRCNEfB7rbajuGzjLgTwvv4iJg60Dz\nW6ARlxCimn0GuxpjGoLNdtoB3P1qYDmwGFgL7ADeV4teGS4hxP5kEijWQ7DZTt9yBz5Yr14ZLiFE\nfyoJuVqaWvZVvA54B7DJ3U8oZJOBG4E5VHw4f+TuzwzYWuBVfGR3sOsncPCup4OS3w/r7No+Limf\nOOnJpHzH9leGuu7vWpTu1zFRv2DX2vTi30NPiN1K0XXuWvuKpPzXk44PdVnUzOY4dXJIvd5GwP4j\nKMjFCgbt2NcGoSv40dmnM3WiX0KmnbrTLWfiHm3/fZIr5H6hKX0N8CqWwXDVMjn/deD0KtmlwC3u\nPg+4pXgvhBgNOLC3xmOEGNBwufsdQPVw4Ex4fm/464GzGtwvIcRI4cDuGo8RYrBzXNN7XZbuvsHM\nDmtgn4QQI0kJHhWHfXLezJYASwCYcuRwNyeEGColMFyDXYC60cxmABR/N0UnuvtSd1/g7gs4ZNog\nmxNCNI1ew1XLMUIM1nAtA84vXp8PwW6mQojyUQLDVctyiNTK188A3zGzC4DfAu+uqbU9VCKTqtja\nNb3W/r7Aroxrf0La3bEjWCaxr3N8rCtIQ7yra3JcJ3Dtb+04vO52Qhf6QZnrz6Ubjqg3mDq3w/UJ\ngTxKTwz1/wg6M2X13kuorNtOUe9yhBw5XdGyk1wbqa9Tozx9Lf6oOKDhyqx8Pa3BfRFCtAL7GFyu\n/yailfNCiP6UYHJehksI0R8ZLiFE6ZDhEkKUEhmuPkSpmzMeQk/HGHPw1kyQc0fa49fzxvak3DpC\nVUkvKADnXBHX+VFQdmw84+kz07mLLcoqnfnkPNir1r4b1wm9Wp2BPOMg9f8etP+tTPvB9fj5abn9\n74yuKMj86iviOqcHZbn7vCItt9cGFTKb6PpvAl3xXsVpL20jcvtpxCWEKB37gJ0j3Yk8MlxCiP44\njUmPM4zIcAkh9kePikKIUqE5LiFE6ZDhEkKUDoX8VBEEWed2+LUomLc7E+Qc6LPow+iMVYWBwdGS\nB4gDlm8Ltmsm07coyDaX8/3KoCD3aUfLPqL2c/nTvxAUPJRpP7jP1hmcn/nOhMsOcktYovufu89R\nnvio/Vz++mjZQ+46U/esUZPqGnEJIUqFHhWFEKWjd7OMFkaGSwjRH63jEkKUDj0qCiFKh6OQn370\nkPa4dGbq1OttgzgAuF7PWa79SFeuTu6/WJiieRDtR+3krrPee5O7lownLiRKnRy1k/vmRvc/5+LP\npZVuVDu5+xJdT+4+p35LjdrJWo+KQohSoUdFIUTpKIHhGuz2ZEKI0Urvcohajhows9PN7BEzW2tm\nlybK32tmT5pZR3G8fyCdGnEJIfanQXNcZtYGfBl4K5WZ1HvMbJm7r6469UZ3/1CtemW4hBD9aWys\n4snAWnf/NYCZfRs4E6g2XHUxJMNlZp3ANir2udvdFwxFnxCiBahv5fxUM1vV5/1Sd1/a5/1MYF2f\n913AwoSe/2ZmbwB+BXzU3dclznmeRoy43uTutTnAo+UQmUBS/0Rans1fHujziwNdUVAwhAGzfnlc\nxaJ9vY+N6/hVga5PBRUyk6f+14Gui+I6df+HzbV/TdD+hRl9cwJdXwx0vTOjK1jC4f8VV7HjgoLc\ndT4a6JoXVMh9zwNDYZkNy5PLKxoxqV7fcojNAwxYUlfgVe9/CNzg7rvN7M+A64E35xrV5LwQYn+6\nazwGpguY3ef9LGB93xPc/Sl33128vQb4vYGUDtVwOfATM7vXzJYMUZcQohXoXQ7RGMN1DzDPzOaa\n2YHAucCyvieY2Yw+b98FrBlI6VAfFU9x9/Vmdhiwwsx+6e53VHVqCVAxagceOcTmhBDDTgMn5929\n28w+BPyYyuZp17n7w2b2V8Aqd18G/IWZvYuKKXwaeO9AeodkuNx9ffF3k5ndRMWDcEfVOUuBpQA2\nYUH1s60QotVo8AJUd18OLK+SXdbn9ceAj9Wjc9CPimY23swm9r4G/oB8jkshRFlo3KPisDCUEdd0\n4CaruD3GAP/H3f8zW6OHtMcnl7r5fUHBpEw7wTDX/jw4v95AVsA+Wn+d3E7G4XVGQda5lMKRVzNH\nFEwd9TkTlGznBQW5x4/geuytwflRUDaE3+rQc5ipk/3MZgQFuXTLkS6L1h9kfqJjEg67PfW3vR+j\nOZFgsaDsVQ3sixCiFVB2CCFE6ShBkLUMlxCiP/tQIkEhRAnRo6IQonS0+MKl5hqufaS9VzkPUeC9\n8n+Jq4RerTmBvCPT/iA29wzr5CI66/Tq+cpYlb02005EI9MQR33OxQq+PiiIPHS5+x99q+P9eOPr\nybVT5zyQZ4xB7FXMuPe2j6uvA6MIxSoKIUqHDJcQonRojksIUUXruxVluIQQVbT+0nkZLiFEFa2/\nAlWGSwggJk2gAAAFY0lEQVRRhUZc/Yny/OR6UW/wbaaO/2ug600ZXYE73G+Kq9irg4LOuE60VMDO\nCOSD6HP2PmeCiZPkdsUOlrBkl2kESxU8SCkXBjhD/Jllspjb3KAgc50eTAOZPVuXfPCkOtCo3M0y\nXEKIUuFocl4IUTI0xyWEKB16VBRClA6NuIQQpUMjrv4cQNp7lEvDHHl1cv8QDk+Lw5TGmTTEUd/s\n7Prr5Ag3OI2CjHMBw1HZYP6JRrpy9yyq05WpMzUtDjdXzV1/Z6BrYqZOROaexZu1Rj/69kxDO2rr\nz4Dsa4AOjbiEEKVDIT9CiNKhR0UhRCnRo6IQolRoxCWEKB2tb7iGlEjQzE43s0fMbK2ZXdqoTgkh\nRpJer2LrbmU96BGXmbUBXwbeSsXRfY+ZLXP31WGlKcB7E/Kcm/yEQN6ZqTMrkA/GTR+5/XN3LqqT\n+5yjsjmBPBfkPJjlEAsCeZSLPacruv7oc4E4MDxYJpENCh/M9UdLWDozdcK8+1MylSIatRyiEQ9R\no9ureDKwttjRGjP7NnAmEBsuIUQJaP1HxaEYrplA30QhXcDCoXVHCDHyjO4FqKl1w/ttwGRmS4Al\nABx65BCaE0I0h9YfcQ1lcr4LmN3n/SxgffVJ7r7U3Re4+wLGTRtCc0KI5jCKJ+eBe4B5ZjYXeAI4\nF/iThvRKCDGCtP7kvHlue92BKpstBv4RaAOuc/dPD3D+k8Djxdup5PdDHm7Uvtofje0f5e5DerQx\ns/8k9udWs9ndTx9Ke4NhSIZrSA2brXL3yAmv9tW+2hch2slaCFE6ZLiEEKVjJA3X0hFsW+2r/Rd7\n+6VmxOa4hBBisOhRUQhROmS4hBClY0QM10inwzGzTjN70Mw6zGxVE9q7zsw2mdlDfWSTzWyFmT1a\n/H1Jk9u/wsyeKO5BR7Embzjanm1mt5rZGjN72Mw+XMibcv2Z9pt1/QeZ2c/N7P6i/U8V8rlmdndx\n/Tea2YHD0f6oxd2belBZrPoY8FLgQOB+4Pgm96ETmNrE9t4AnAQ81Ef298ClxetLgSub3P4VwP9s\nwrXPAE4qXk8EfgUc36zrz7TfrOs3YELxuh24G1gEfAc4t5BfDVzUrO/jaDhGYsT1fDocd98D9KbD\nGbW4+x3A01XiM4Hri9fXA2c1uf2m4O4b3P2+4vU2YA2VzCJNuf5M+03BK/RmT2svDgfeDPx7IR/W\nz380MhKGK5UOp2lfpAIHfmJm9xbZK0aC6e6+ASo/LuCwEejDh8zsgeJRctgeVXsxsznAq6mMOpp+\n/VXtQ5Ou38zazKwD2ASsoPLEscXde6OUR+I3UGpGwnDVlA5nmDnF3U8CzgA+aGZvaHL7rcBXgaOB\n+cAG4HPD2ZiZTQC+C3zE3Z8dzrZqbL9p1+/uPe4+n0oGlZOB41KnDVf7o5GRMFw1pcMZTtx9ffF3\nE3ATlS9Ts9loZjMAir+bmtm4u28sflD7gGsYxntgZu1UjMa33P17hbhp159qv5nX34u7bwFuozLH\nNcnMerOzNP03UHZGwnA9nw6n8KScCyxrVuNmNt6sshm7mY0H/gB4KF9rWFgGnF+8Ph/4QTMb7zUa\nBWczTPfAzAy4Fljj7p/vU9SU64/ab+L1TzOzScXrg4G3UJlnuxU4pzit6Z9/6RkJjwCwmIp35zHg\nE01u+6VUPJn3Aw83o33gBiqPI3upjDgvoLKjwi3Ao8XfyU1u/1+BB4EHqBiRGcPU9uuoPAY9AHQU\nx+JmXX+m/WZd/4nAL4p2HgIu6/M9/DmwFvg3YOxwfw9H06GQHyFE6dDKeSFE6ZDhEkKUDhkuIUTp\nkOESQpQOGS4hROmQ4RJClA4ZLiFE6fj/bGZR578SvHsAAAAASUVORK5CYII=\n", "text/plain": [ "" ] From 9995cdc467fc61256934c27e3080e9ac956444ac Mon Sep 17 00:00:00 2001 From: Giud Date: Tue, 30 May 2017 15:21:19 -0400 Subject: [PATCH 008/123] Update mgxs-part-iii.ipynb --- examples/jupyter/mgxs-part-iii.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/jupyter/mgxs-part-iii.ipynb b/examples/jupyter/mgxs-part-iii.ipynb index c73214dda..65d8a069f 100644 --- a/examples/jupyter/mgxs-part-iii.ipynb +++ b/examples/jupyter/mgxs-part-iii.ipynb @@ -1636,8 +1636,7 @@ }, { "data": { - "image/png": "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\n/ro6rCNRnWDbJheZSVtVx0SZ/ -Fwd1IUoodi2yUUJGbnm9+n1g+efaY+ogcfsEA1xTft5A2eZMd80\nPsZekN2fBTNWjzZj3tERgfNvzZxsLmN840lmjA63R4GRErvj0bPX2x0icJQdcsdv7CGEVsMe+cXu\n4lTXgoYpecp+eeZgM2T9W/Z2aHFutCsXK8veusaM2V3cwow5PqfQjLl7uf2G7Zljd+Za8ekAM+a2\n7N+bMV2b2uu+4a2uZgwy7RCz4wwAe3ib2CM7sRs7EZFDmLSJiBzCpE1E5BAmbSIihyQ+aevqhBcZ\nt7L8ZNeg+krzk12Dalubb/9YlNo+SnYFqq1sfpg70qWYwvxk16Caimp1aUk40v468UXGqzw/2TWo\nPgeT9rr8omRXIU7uJe3y+QuSXYXqW5yf7BpUU1GtLo2nR4iIHJKQ67T79m1z4HFJSRO0b9+mcsDR\nIRZyZIiYvXZIOzQwY1pWuRd6yTqgfccqQa3ssrJDBOUEXI8JAO3QwVxG3+xDp5WsBdpHTu/byFyO\nZNif4Vp1O0TTxg7pgHaHTMtCVqXpCvua4WTr2/fgW6ikJA3t20e+pQ5dx0McG6KQEPcZ7AZ7/zZN\nTz9k2jpJQ8eI6Xsa1k5ZmSGW0zXEcupHWU5JPaB9xPTMtEPXq6qjwtQ5zP0cw+yvfZX3u5fzqraF\n4NTbvXsG5s6NPk9UQ4xoEgcRqdsC6LCnqkm5/zXbNtW1aG27zpM2ERHVHp7TJiJyCJM2EZFDEpq0\nReQsEVkpIl+KyF2JLLumRKRIRD4VkaUisijZ9YlGRKaISKmILI+Y1lxEZovIFyLybioNmxWjvuNE\n5BsR+cT/OyuZdawOtuu64Vq7BhLTthOWtEUkDcAf4Y1+3RPAJSJi31Yu+coB5KpqH1UdmOzKxBBt\nVPG7AbyvqscCmAPgnoTXKrYfzSjobNd1yrV2DSSgbSfySHsggFWqWqyq+wC8AmBUAsuvKUGKn0aK\nMar4KABT/cdTAZyX0EoF+JGNgs52XUdca9dAYtp2IndaBwDrIp5/409LdQrgPREpFJFrkl2Zamit\nqqUAoKobALROcn3CcHEUdLbrxHKxXQO12LZT+pM2RQxS1b4AfgbgRhGx71qfmlL92s4nAHRV1d4A\nNsAbBZ3qDtt14tRq205k0v4WQKeI50f501Kaqq73/28CMBPe12EXlIpIG+DAYLUbk1yfQKq6SQ92\nGvgLAHvIktTAdp1YTrVroPbbdiKTdiGAo0Wks4jUBzAaQPQx4lOEiDQSkSb+48YAzkDqjs5daVRx\neNt2rP/4CgD2OGuJ9WMZBZ3tum651q6BOm7bCbn3CACoapmI3ARgNrwPiymq+nmiyq+hNgBm+t2V\nMwC8qKpFrFblAAAAXUlEQVSzk1ynQ8QYVXwSgFdF5CoAxQAuTl4NK/sxjYLOdl13XGvXQGLaNrux\nExE5hD9EEhE5hEmbiMghTNpERA5h0iYicgiTNhGRQ5i0iYgcwqRNROQQJm0iIof8P5PTpB3yNquM\nAAAAAElFTkSuQmCC\n", + "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] From 9357f272c1abe60c921aa998f193ec9fd07bcbc9 Mon Sep 17 00:00:00 2001 From: Giud Date: Tue, 30 May 2017 15:22:03 -0400 Subject: [PATCH 009/123] Update mg-mode-part-iii.ipynb --- examples/jupyter/mg-mode-part-iii.ipynb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/jupyter/mg-mode-part-iii.ipynb b/examples/jupyter/mg-mode-part-iii.ipynb index 3c71488e6..055389131 100644 --- a/examples/jupyter/mg-mode-part-iii.ipynb +++ b/examples/jupyter/mg-mode-part-iii.ipynb @@ -1389,8 +1389,7 @@ "outputs": [ { "data": { - "image/png": "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\nN1XbH3mbUj9fF1du/ -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\nAajbsJNqTdi0AAAAAElFTkSuQmCC\n", + "image/png": "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\nAajbsJNqTdi0AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] @@ -1458,9 +1457,7 @@ }, { "data": { - "image/png": "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 -HHgI8FhgK+AtgxxooPKStjt960HWlaT5\n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\nkjRi/w9hvYqGSZgiKAAAAABJRU5ErkJggg==\n", + "image/png": "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\nkjRi/w9hvYqGSZgiKAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] From e300bbafebbf496c43958516d103a6e9aff9362f Mon Sep 17 00:00:00 2001 From: Giud Date: Tue, 30 May 2017 15:23:35 -0400 Subject: [PATCH 010/123] Update mg-mode-part-ii.ipynb --- examples/jupyter/mg-mode-part-ii.ipynb | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/examples/jupyter/mg-mode-part-ii.ipynb b/examples/jupyter/mg-mode-part-ii.ipynb index d9a30cd9d..7a2b029de 100644 --- a/examples/jupyter/mg-mode-part-ii.ipynb +++ b/examples/jupyter/mg-mode-part-ii.ipynb @@ -296,8 +296,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -926,9 +925,7 @@ nDDEmpjMMIzuWQAzDEDMJMV3qgJjLpsTvWUm9StlIYsnhR+KjlJ9l72cuRp9AfMt5N6xKE9Nds3JT\nV "outputs": [ { "data": { - "image/png": "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 -AotESBwBGIicrg5uOH8oT\n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 -PGGNMS+YlceSr6oc4\npZNlqvpX4LD4hhUdaxw3xpj485I4Kt1Zcn8QkatE5CSgS5zjioo1jhtjTPx5SRy/AQqAXwN7Aedi\n63EYY0yr5aVX1TT3x63AhfENp3msV5UxxsRfyMThTjwYkqqeEPtwmkdVJwITS0pKmjMlijHGmDDC\nlThG4cwpNQH4iuBThRhjjGllwiWOnXCmPj8TOAt4C5gQq8F6xhhjWqaQjeOqWquq76jq+cC+wCLg\nExG5OmHRRci64xpjTPyF7VUlIrkicjLwLM48VfcDryQisGhYd1xjjIm/cI3jTwPDgLeBm1V1Tqhj\njTHGtB7h2jjOBcqBQcCvRerbxgVQVW0X59iMMcakoJCJQ1W9DA5MKTaOwxhj4q/FJYdwrI3DGGPi\nL60ShzHGmPizxGGMMSYiljiMMcZExBKHMcaYiKRV4rCR48YYE39plTisV5UxxsRfWiUOY4wx8WeJ\nwxhjTEQscRhjjImIJQ5jjDERscRhjDEmIpY4jDHGRCStEoeN4zDGmPhLq8Rh4ziMMSb+0ipxGGOM\niT9LHMYYYyJiicMYY0xELHEYY4yJiCUOY4wxEbHEYYwxJiKWOIwxxkTEEocxxpiIiKomO4aYE5Et\nwIJkxxEHnYENyQ4iTtL13uy+Wp50vbem7quPqhZ7OVFWbOJJOQtUtSTZQcSaiExPx/uC9L03u6+W\nJ13vLZb3ZVVVxhhjImKJwxhjTETSNXE8luwA4iRd7wvS997svlqedL23mN1XWjaOG2OMiZ90LXEY\nY4yJE0scxhhjImKJwxhjTERaVeIQkUNEZIqIPCoihyQ7nlgSkV3d+3pJRH6V7HhiRUT6i8iTIvJS\nsmOJhXS7H590ff9B+n5uiMiB7j09ISKfR/LaFpM4RGSciKwTkTkB248RkQUiskhEbmziNApsBfKA\nFfGKNVKxuDdVnaeqlwOnAykxeClG97VEVS+Ob6TNE8l9toT78YnwvlLu/RdOhO/NlPzcCCbCv9kU\n92/2JvB0RBdS1RbxAA4C9gTm+G3LBBYD/YEcYBYwBNjN/WX4P7oAGe7rugLPJfueYnlv7mtOAD4H\nzkr2PcXyvtzXvZTs+4nFfbaE+4n2vlLt/Rere0vVz41Y/M3c/f8D2kVynRYz5YiqThaRvgGbRwKL\nVHUJgIg8D4xR1TuA0WFOtwnIjUec0YjVvanqG8AbIvIW8N/4RexNjP9mKSuS+wTmJja66EV6X6n2\n/gsnwvem72+WUp8bwUT6NxOR3kCpqpZFcp0WkzhC6AEs93u+Atgn1MEicjJwNNAeeDC+oTVbpPd2\nCHAyzht7Ulwja55I76sTcBuwh4j8wU0wLUHQ+2zB9+MT6r4OoWW8/8IJdW8t6XMjmHD/5y4Gnor0\nhC09cUiQbSFHNKrqK8Ar8QsnpiK9t0+AT+IVTAxFel8bgcvjF07cBL3PFnw/PqHu6xNaxvsvnFD3\n1pI+N4IJ+X9OVW+K5oQtpnE8hBVAL7/nPYFVSYol1tL13tL1vgKl632m631B+t5bzO+rpSeOacBA\nEeknIjnAGcAbSY4pVtL13tL1vgKl632m631B+t5b7O8r2b0AIugtMAFYDVTjZNCL3e3HAQtxeg38\nKdlx2r2l/321lvtM1/tK53tL1H3ZJIfGGGMi0tKrqowxxiSYJQ5jjDERscRhjDEmIpY4jDHGRMQS\nhzHGmIhY4jDGGBMRSxymVRORWhH51u/R1NT8CSEiS0XkOxEJOUW5iFwgIhMCtnUWkfUikisiz4nI\nzyJyavwjNq1JS5+rypjmqlDVEbE8oYhkqWpNDE51qKpuCLP/FeAuESlQ1W3utlOBN1R1O3C2iIyP\nQRzGNGAlDmOCcL/x3ywi37jf/Hdxtxe6i+VME5GZIjLG3X6BiLwoIhOB90QkQ0QeFpHvReRNEZkk\nIqeKyOEi8qrfdY4UkSYn0BORvUTkUxGZISLvikg3dabCngwc73foGTijh42JG0scprXLD6iq+qXf\nvg2quifwCHCdu+1PwEequjdwKPBPESl0940CzlfVw3CmGO+Ls0DVJe4+gI+AXUWk2H1+IU1May0i\n2cADwKmquhcwDmdqdnCSxBnucd2BQcDHEf4OjImIVVWZ1i5cVZWvJDADJxEAHAWcICK+RJIH9HZ/\nfl9Vf3Z/PgB4UVXrgDUi8jE4c3SLyDPAOSLyFE5COa+JGAcDw4D3RQScFd1Wu/veBB4WkXY4y7a+\npKq1Td20Mc1hicOY0La7/9ay4/+KAKeo6gL/A0VkH6Dcf1OY8z4FTAQqcZJLU+0hAnyvqqMCd6hq\nhYi8A5yEU/L4bRPnMqbZrKrKmMi8C1wt7ld/EdkjxHGfAae4bR1dgUN8O1R1Fc56CH8Gxnu45gKg\nWERGudfMFpGhfvsnANfirIn9ZUR3Y0wULHGY1i6wjePOJo6/BcgGZovIHPd5MC/jTGs9B/g38BVQ\n6rf/OWC57ljPOiRVrcLpLfV3EZkFfAvs53fIe0B34AW16a5NAti06sbEiYi0UdWt7jrjXwP7q+oa\nd9mylfkAAAB7SURBVN+DwExVfTLEa5cCJU10x/USw3jgTVV9qTnnMcaflTiMiZ83ReRbYApwi1/S\nmAEMB54N89r1wIfhBgA2RUSeAw7GaUsxJmasxGGMMSYiVuIwxhgTEUscxhhjImKJwxhjTEQscRhj\njImIJQ5jjDERscRhjDEmIv8PVlN3HymW/GgAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -938,9 +935,7 @@ PGGNMS+YlceSr6oc4\npZNlqvpX4LD4hhUdaxw3xpj485I4Kt1Zcn8QkatE5CSgS5zjioo1jhtjTPx5S }, { "data": { - "image/png": "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\n/doAhwIfR/ -k7MCYqVsVk6opwVUz+b/azcG74AD8CzhURf8LIAzq4zyeq6lb3+UnAm6paAawXkY/B\nmTtaRF4Bfi4iI3ESxxURYuwBHAFMFBFwVghb5743DnhWRBrhLPf5lqqWR7poY2rDEoQxUOL+LOfA\n/wkBLlTVJYE7isixwJ7ATWGOOxIYCxTjJJFI7RUCLFDV46u/oar7RGQC8BOcksRvIhzLmFqzKiZj\ngvsAGC7uV3kROTrEfp8BF7ptEa2AAf43VPUHnPn47wZGeTjnEqCFiBzvnjNHRA4PeH8McAvOmskz\noroaY2rAEoSpK6q3QTwaYf8HgBzgGxGZ774O5j840y3PB/4BfAHsCHj/NWC1HljvOCRV3Y/TO+lP\nIjIXmAOcELDLh0Ab4N9q0zCbBLDpvo2pJRFpoKq73XWovwROVNX17ntPA1+r6oshPrsSKIrQzdVL\nDKOAcar6Vm2OY0wgK0EYU3vjRGQO8CnwQEBymAX0Bl4N89lNwKRwA+UiEZHXgFNx2jqMiRkrQRhj\njAnKShDGGGOCsgRhjDEmKEsQxhhjgrIEYYwxJihLEMYYY4KyBGGMMSao/wcNeDRljfvF4QAAAABJ\nRU5ErkJggg==\n", + "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] @@ -950,8 +945,7 @@ k7MCYqVsVk6opwVUz+b/azcG74AD8CzhURf8LIAzq4zyeq6lb3+UnAm6paAawXkY/B\nmTtaRF4Bfi4i }, { "data": { - "image/png": "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 -ARKzZVMm54X649\n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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -1248,8 +1242,7 @@ ARKzZVMm54X649\nbk/6dmldQ3rljhqWbdjGbj06JSjStpHoK44KM7sWOA94PHzeIi37ubn7NHefWFpa }, { "data": { - "image/png": "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 -DBwI\n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\n", + "image/png": "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\n", "text/plain": [ "" ] From 8b6abad60ec223f3f28069b719e2758ffc7b786e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 31 May 2017 07:11:11 -0500 Subject: [PATCH 011/123] Allow determine_paths() to be called only to get number of instances --- openmc/cell.py | 6 ++++-- openmc/geometry.py | 18 +++++++++++++----- openmc/material.py | 11 ++++------- openmc/universe.py | 16 ++++++++++------ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index a06270201..033972a38 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -104,6 +104,7 @@ class Cell(object): self._temperature = None self._translation = None self._paths = [] + self._num_instances = None self._volume = None self._atoms = None @@ -229,7 +230,7 @@ class Cell(object): @property def num_instances(self): - return len(self.paths) + return self._num_instances @id.setter def id(self, cell_id): @@ -528,11 +529,12 @@ class Cell(object): # If no nemoize'd clone exists, instantiate one if self not in memo: # Temporarily remove paths - paths = self.paths + paths = self._paths self._paths = None clone = deepcopy(self) clone.id = None + clone._num_instances = None # Restore paths on original instance self._paths = paths diff --git a/openmc/geometry.py b/openmc/geometry.py index 27fee6573..642b3ce96 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -258,7 +258,7 @@ class Geometry(object): lattices[cell.fill.id] = cell.fill return lattices - + def get_all_surfaces(self): """ Return all surfaces used in the geometry @@ -270,11 +270,11 @@ class Geometry(object): """ surfaces = OrderedDict() - + for cell in self.get_all_cells().values(): surfaces = cell.region.get_surfaces(surfaces) return surfaces - + def get_materials_by_name(self, name, case_sensitive=False, matching=False): """Return a list of materials with matching names. @@ -482,22 +482,30 @@ class Geometry(object): lattices.sort(key=lambda x: x.id) return lattices - def determine_paths(self): + def determine_paths(self, instances_only=False): """Determine paths through CSG tree for cells and materials. This method recursively traverses the CSG tree to determine each unique path that reaches every cell and material. The paths are stored in the :attr:`Cell.paths` and :attr:`Material.paths` attributes. + Parameters + ---------- + instances_only : bool + If true, this method will only determine the number of instances of + each cell and material. + """ # (Re-)initialize all cell instances to 0 for cell in self.get_all_cells().values(): cell._paths = [] + cell._num_instances = 0 for material in self.get_all_materials().values(): material._paths = [] + material._num_instances = 0 # Recursively traverse the CSG tree to count all cell instances - self.root_universe._determine_paths() + self.root_universe._determine_paths(instances_only=instances_only) def clone(self): """Create a copy of this geometry with new unique IDs for all of its diff --git a/openmc/material.py b/openmc/material.py index f7ca9c9fd..f4c30da81 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -98,6 +98,7 @@ class Material(object): self._density_units = '' self._depletable = False self._paths = [] + self._num_instances = None self._volume = None self._atoms = {} @@ -216,7 +217,7 @@ class Material(object): @property def num_instances(self): - return len(self.paths) + return self._num_instances @property def elements(self): @@ -298,11 +299,6 @@ class Material(object): cv.check_type('material volume', volume, Real) self._volume = volume - @num_instances.setter - def num_instances(self, num_instances): - cv.check_type('num_instances', num_instances, Integral) - self._num_instances = num_instances - @classmethod def from_hdf5(cls, group): """Create material from HDF5 group @@ -823,11 +819,12 @@ class Material(object): # Temporarily remove paths -- this is done so that when the clone is # made, it doesn't create a copy of the paths (which are specific to # an instance) - paths = self.paths + paths = self._paths self._paths = None clone = deepcopy(self) clone.id = None + clone._num_instances = None # Restore paths on original instance self._paths = paths diff --git a/openmc/universe.py b/openmc/universe.py index d36b167a5..a03e8ba87 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -566,7 +566,7 @@ class Universe(object): cell_element.set("universe", str(self._id)) xml_element.append(cell_element) - def _determine_paths(self, path=''): + def _determine_paths(self, path='', instances_only=False): """Count the number of instances for each cell in the universe, and record the count in the :attr:`Cell.num_instances` properties.""" @@ -577,7 +577,7 @@ class Universe(object): # If universe-filled, recursively count cells in filling universe if cell.fill_type == 'universe': - cell.fill._determine_paths(cell_path + '->') + cell.fill._determine_paths(cell_path + '->', instances_only) # If lattice-filled, recursively call for all universes in lattice elif cell.fill_type == 'lattice': @@ -588,18 +588,22 @@ class Universe(object): latt_path = '{}->l{}({})->'.format( cell_path, latt.id, ",".join(str(x) for x in index)) univ = latt.get_universe(index) - univ._determine_paths(latt_path) + univ._determine_paths(latt_path, instances_only) else: if cell.fill_type == 'material': mat = cell.fill elif cell.fill_type == 'distribmat': - mat = cell.fill[len(cell._paths)] + mat = cell.fill[cell._num_instances] else: mat = None if mat is not None: - mat._paths.append('{}->m{}'.format(cell_path, mat.id)) + mat._num_instances += 1 + if not instances_only: + mat._paths.append('{}->m{}'.format(cell_path, mat.id)) # Append current path - cell._paths.append(cell_path) + cell._num_instances += 1 + if not instances_only: + cell._paths.append(cell_path) From c24d32b5cdb093c6be71c2989bf9b985ec89c9c9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 31 May 2017 21:00:01 -0500 Subject: [PATCH 012/123] Address comments from @cjosey on #890 --- openmc/cell.py | 8 ++++++-- openmc/geometry.py | 2 +- openmc/material.py | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 033972a38..8dd97c0fc 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -103,7 +103,7 @@ class Cell(object): self._rotation_matrix = None self._temperature = None self._translation = None - self._paths = [] + self._paths = None self._num_instances = None self._volume = None self._atoms = None @@ -215,7 +215,7 @@ class Cell(object): @property def paths(self): - if not self._paths: + if self._paths is None: raise ValueError('Cell instance paths have not been determined. ' 'Call the Geometry.determine_paths() method.') return self._paths @@ -230,6 +230,10 @@ class Cell(object): @property def num_instances(self): + if self._num_instances is None: + raise ValueError( + 'Number of cell instances have not been determined. Call the ' + 'Geometry.determine_paths() method.') return self._num_instances @id.setter diff --git a/openmc/geometry.py b/openmc/geometry.py index 642b3ce96..860d3028f 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -491,7 +491,7 @@ class Geometry(object): Parameters ---------- - instances_only : bool + instances_only : bool, optional If true, this method will only determine the number of instances of each cell and material. diff --git a/openmc/material.py b/openmc/material.py index f4c30da81..da415ec68 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -97,7 +97,7 @@ class Material(object): self._density = None self._density_units = '' self._depletable = False - self._paths = [] + self._paths = None self._num_instances = None self._volume = None self._atoms = {} @@ -210,13 +210,17 @@ class Material(object): @property def paths(self): - if not self._paths: + if self._paths is None: raise ValueError('Material instance paths have not been determined. ' 'Call the Geometry.determine_paths() method.') return self._paths @property def num_instances(self): + if self._num_instances is None: + raise ValueError( + 'Number of material instances have not been determined. Call ' + 'the Geometry.determine_paths() method.') return self._num_instances @property From 24c0db376276e03c9e3ad0aa4369518bba05368a Mon Sep 17 00:00:00 2001 From: johnnyliu27 Date: Sun, 4 Jun 2017 17:02:19 -0400 Subject: [PATCH 013/123] Fix typos and links in example notebooks and userguide/geometry --- docs/source/usersguide/geometry.rst | 2 +- examples/jupyter/pandas-dataframes.ipynb | 14 +++++++------- examples/jupyter/pincell.ipynb | 10 +++++----- examples/jupyter/post-processing.ipynb | 13 +++++-------- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/docs/source/usersguide/geometry.rst b/docs/source/usersguide/geometry.rst index 0c18e56ae..bb800699b 100644 --- a/docs/source/usersguide/geometry.rst +++ b/docs/source/usersguide/geometry.rst @@ -19,7 +19,7 @@ surface is a locus of zeros of a function of Cartesian coordinates :math:`x,y,z`, e.g. - A plane perpendicular to the :math:`x` axis: :math:`x - x_0 = 0` -- A cylinder perpendicular to the :math:`z` axis: :math:`(x - x_0)^2 + (y - +- A cylinder parallel to the :math:`z` axis: :math:`(x - x_0)^2 + (y - y_0)^2 - R^2 = 0` - A sphere: :math:`(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 - R^2 = 0` diff --git a/examples/jupyter/pandas-dataframes.ipynb b/examples/jupyter/pandas-dataframes.ipynb index a44ecfe96..0a121a8b4 100644 --- a/examples/jupyter/pandas-dataframes.ipynb +++ b/examples/jupyter/pandas-dataframes.ipynb @@ -281,7 +281,7 @@ "plot.origin = [0, 0, 0]\n", "plot.width = [21.5, 21.5]\n", "plot.pixels = [250, 250]\n", - "plot.color = 'mat'\n", + "plot.color_by = 'material'\n", "\n", "# Instantiate a Plots collection and export to \"plots.xml\"\n", "plot_file = openmc.Plots([plot])\n", @@ -1350,7 +1350,7 @@ "df = tally.get_pandas_dataframe()\n", "\n", "# Print the first twenty rows in the dataframe\n", - "df.head(100)" + "df.head(20)" ] }, { @@ -1955,7 +1955,7 @@ "absorption[['mean', 'std. dev.']].dropna().describe()\n", "\n", "# Note that the maximum standard deviation does indeed\n", - "# meet the 5e-4 threshold set by the tally trigger" + "# meet the 5e-5 threshold set by the tally trigger" ] }, { @@ -1981,7 +1981,7 @@ } ], "source": [ - "# Extract tally data from pins in the pins divided along y=x diagonal \n", + "# Extract tally data from pins in the pins divided along y=-x diagonal \n", "multi_index = ('level 2', 'lat',)\n", "lower = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] < 16]\n", "upper = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] > 16]\n", @@ -1998,7 +1998,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that the symmetry implied by the y=x diagonal ensures that the two sampling distributions are identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **not reject** the null hypothesis that the two sampling distributions are identical.\n", + "Note that the symmetry implied by the y=-x diagonal ensures that the two sampling distributions are identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **not reject** the null hypothesis that the two sampling distributions are identical.\n", "\n", "Next, perform the same test but with two groupings of pins which are not symmetrically identical to one another." ] @@ -2019,7 +2019,7 @@ } ], "source": [ - "# Extract tally data from pins in the pins divided along y=-x diagonal\n", + "# Extract tally data from pins in the pins divided along y=x diagonal\n", "multi_index = ('level 2', 'lat',)\n", "lower = df[df[multi_index + ('x',)] > df[multi_index + ('y',)]]\n", "upper = df[df[multi_index + ('x',)] < df[multi_index + ('y',)]]\n", @@ -2036,7 +2036,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that the asymmetry implied by the y=-x diagonal ensures that the two sampling distributions are *not* identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **reject** the null hypothesis that the two sampling distributions are identical." + "Note that the asymmetry implied by the y=x diagonal ensures that the two sampling distributions are *not* identical. Indeed, as illustrated by the test above, for any reasonable significance level (*e.g.*, $\\alpha$=0.05) one would **reject** the null hypothesis that the two sampling distributions are identical." ] }, { diff --git a/examples/jupyter/pincell.ipynb b/examples/jupyter/pincell.ipynb index fcb0b412d..163429688 100644 --- a/examples/jupyter/pincell.ipynb +++ b/examples/jupyter/pincell.ipynb @@ -240,7 +240,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "So far you've seen the \"hard\" way to create a material. The \"easy\" way is to just pass strings to `add_nuclide()` and `add_element()` -- they are implicitly coverted to `Nuclide` and `Element` objects. For example, we could have created our UO2 material as follows:" + "So far you've seen the \"hard\" way to create a material. The \"easy\" way is to just pass strings to `add_nuclide()` and `add_element()` -- they are implicitly converted to `Nuclide` and `Element` objects. For example, we could have created our UO2 material as follows:" ] }, { @@ -509,12 +509,12 @@ "At this point, we have three materials defined, exported to XML, and ready to be used in our model. To finish our model, we need to define the geometric arrangement of materials. OpenMC represents physical volumes using constructive solid geometry (CSG), also known as combinatorial geometry. The object that allows us to assign a material to a region of space is called a `Cell` (same concept in MCNP, for those familiar). In order to define a region that we can assign to a cell, we must first define surfaces which bound the region. A *surface* is a locus of zeros of a function of Cartesian coordinates $x$, $y$, and $z$, e.g.\n", "\n", "- A plane perpendicular to the x axis: $x - x_0 = 0$\n", - "- A cylinder perpendicular to the z axis: $(x - x_0)^2 + (y - y_0)^2 - R^2 = 0$\n", + "- A cylinder parallel to the z axis: $(x - x_0)^2 + (y - y_0)^2 - R^2 = 0$\n", "- A sphere: $(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 - R^2 = 0$\n", "\n", - "Between those three classes of surfaces (planes, cylinders, spheres), one can construct a wide variety of models. It is also possible to define cones and general second-order surfaces (torii are not currently supported).\n", + "Between those three classes of surfaces (planes, cylinders, spheres), one can construct a wide variety of models. It is also possible to define cones and general second-order surfaces (tori are not currently supported).\n", "\n", - "Note that defining a surface is not sufficient to specify a volume -- in order to define an actual volume, one must reference the half-space of a surface. A surface *half-space* is the region whose points satisfy a positive of negative inequality of the surface equation. For example, for a sphere of radius one centered at the origin, the surface equation is $f(x,y,z) = x^2 + y^2 + z^2 - 1 = 0$. Thus, we say that the negative half-space of the sphere, is defined as the collection of points satisfying $f(x,y,z) < 0$, which one can reason is the inside of the sphere. Conversely, the positive half-space of the sphere would correspond to all points outside of the sphere.\n", + "Note that defining a surface is not sufficient to specify a volume -- in order to define an actual volume, one must reference the half-space of a surface. A surface *half-space* is the region whose points satisfy a positive or negative inequality of the surface equation. For example, for a sphere of radius one centered at the origin, the surface equation is $f(x,y,z) = x^2 + y^2 + z^2 - 1 = 0$. Thus, we say that the negative half-space of the sphere, is defined as the collection of points satisfying $f(x,y,z) < 0$, which one can reason is the inside of the sphere. Conversely, the positive half-space of the sphere would correspond to all points outside of the sphere.\n", "\n", "Let's go ahead and create a sphere and confirm that what we've told you is true." ] @@ -792,7 +792,7 @@ "\n", "We now have enough knowledge to create our pin-cell. We need three surfaces to define the fuel and clad:\n", "\n", - "1. The outer surface of the fuel -- a cylinder perpendicular to the z axis\n", + "1. The outer surface of the fuel -- a cylinder parallel to the z axis\n", "2. The inner surface of the clad -- same as above\n", "3. The outer surface of the clad -- same as above\n", "\n", diff --git a/examples/jupyter/post-processing.ipynb b/examples/jupyter/post-processing.ipynb index 831a9750a..72fb73758 100644 --- a/examples/jupyter/post-processing.ipynb +++ b/examples/jupyter/post-processing.ipynb @@ -131,7 +131,6 @@ "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", "\n", "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", @@ -292,7 +291,7 @@ "plot.origin = [0, 0, 0]\n", "plot.width = [1.26, 1.26]\n", "plot.pixels = [250, 250]\n", - "plot.color = 'mat'\n", + "plot.color_by = 'material'\n", "\n", "# Instantiate a Plots collection and export to \"plots.xml\"\n", "plot_file = openmc.Plots([plot])\n", @@ -686,8 +685,7 @@ "Tally\n", "\tID =\t10000\n", "\tName =\tflux\n", - "\tFilters =\t\n", - " \t\tMeshFilter\t[10000]\n", + "\tFilters =\tMeshFilter\t[10000]\n", "\tNuclides =\ttotal \n", "\tScores =\t['flux', 'fission']\n", "\tEstimator =\ttracklength\n", @@ -704,7 +702,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint file actually stores the sum and sum-of-squares for each tally bin from which the mean and variance can be calculated as described [here](http://mit-crpg.github.io/openmc/methods/tallies.html#variance). The sum and sum-of-squares can be accessed using the ``sum`` and ``sum_sq`` properties:" + "The statepoint file actually stores the sum and sum-of-squares for each tally bin from which the mean and variance can be calculated as described [here](http://openmc.readthedocs.io/en/latest/methods/tallies.html#variance). The sum and sum-of-squares can be accessed using the ``sum`` and ``sum_sq`` properties:" ] }, { @@ -821,8 +819,7 @@ "Tally\n", "\tID =\t10001\n", "\tName =\tflux\n", - "\tFilters =\t\n", - " \t\tMeshFilter\t[10000]\n", + "\tFilters =\tMeshFilter\t[10000]\n", "\tNuclides =\ttotal \n", "\tScores =\t['flux']\n", "\tEstimator =\ttracklength\n", @@ -1043,7 +1040,7 @@ } ], "source": [ - "# Create log-spaced energy bins from 1 keV to 100 MeV\n", + "# Create log-spaced energy bins from 1 keV to 10 MeV\n", "energy_bins = np.logspace(3,7)\n", "\n", "# Calculate pdf for source energies\n", From 492e5a61923bc192256742d0b1719b6d4c68ace3 Mon Sep 17 00:00:00 2001 From: johnnyliu27 Date: Sun, 4 Jun 2017 22:01:29 -0400 Subject: [PATCH 014/123] Continue to fix typos and links in basic example notebooks --- examples/jupyter/search.ipynb | 2 +- examples/jupyter/tally-arithmetic.ipynb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/jupyter/search.ipynb b/examples/jupyter/search.ipynb index 69359470c..b84411e20 100644 --- a/examples/jupyter/search.ipynb +++ b/examples/jupyter/search.ipynb @@ -37,7 +37,7 @@ "\n", "To perform the search we will use the `openmc.search_for_keff` function. This function requires a different function be defined which creates an parametrized model to analyze. This model is required to be stored in an `openmc.model.Model` object. The first parameter of this function will be modified during the search process for our critical eigenvalue.\n", "\n", - "Our model will be a pin-cell from the [Multi-Group Mode Part II](./mg-mode-part-ii.rst) assembly, except this time the entire model building process will be contained within a function, and the Boron concentration will be parametrized." + "Our model will be a pin-cell from the [Multi-Group Mode Part II](http://openmc.readthedocs.io/en/latest/examples/mg-mode-part-ii.html) assembly, except this time the entire model building process will be contained within a function, and the Boron concentration will be parametrized." ] }, { diff --git a/examples/jupyter/tally-arithmetic.ipynb b/examples/jupyter/tally-arithmetic.ipynb index fd8d6f551..1b189769d 100644 --- a/examples/jupyter/tally-arithmetic.ipynb +++ b/examples/jupyter/tally-arithmetic.ipynb @@ -115,7 +115,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six planes." ] }, { @@ -293,7 +293,7 @@ "plot.origin = [0, 0, 0]\n", "plot.width = [1.26, 1.26]\n", "plot.pixels = [250, 250]\n", - "plot.color = 'mat'\n", + "plot.color_by = 'material'\n", "\n", "# Instantiate a Plots collection and export to \"plots.xml\"\n", "plot_file = openmc.Plots([plot])\n", @@ -412,7 +412,7 @@ "tally.nuclides = [o16, h1]\n", "tallies_file.append(tally)\n", "\n", - "# Instantiate a tally mesh \n", + "# Instantiate a tally mesh\n", "mesh = openmc.Mesh(mesh_id=1)\n", "mesh.type = 'regular'\n", "mesh.dimension = [1, 1, 1]\n", From 1937f7f247032296544807101227484091fd1383 Mon Sep 17 00:00:00 2001 From: johnnyliu27 Date: Wed, 7 Jun 2017 13:27:56 -0400 Subject: [PATCH 015/123] Update the tally data in Pandas Dataframes example notebook --- examples/jupyter/pandas-dataframes.ipynb | 717 ++++++++++++----------- 1 file changed, 362 insertions(+), 355 deletions(-) diff --git a/examples/jupyter/pandas-dataframes.ipynb b/examples/jupyter/pandas-dataframes.ipynb index 0a121a8b4..8c409822e 100644 --- a/examples/jupyter/pandas-dataframes.ipynb +++ b/examples/jupyter/pandas-dataframes.ipynb @@ -10,9 +10,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import glob\n", @@ -44,9 +42,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# 1.6 enriched fuel\n", @@ -79,9 +75,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate a Materials collection\n", @@ -101,9 +95,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create cylinders for the fuel and clad\n", @@ -130,9 +122,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create fuel Cell\n", @@ -163,9 +153,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create fuel assembly Lattice\n", @@ -185,9 +173,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create root Cell\n", @@ -211,9 +197,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Create Geometry and export to \"geometry.xml\"\n", @@ -270,9 +254,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate a Plot\n", @@ -298,9 +280,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -321,13 +301,11 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX////pgJFyEhJNv8RV\nUZDeAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+EEDRUXN7H1XJgAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA0LTEzVDE3OjIzOjU1LTA0OjAwSGKjuQAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNC0xM1QxNzoyMzo1NS0wNDowMDk/GwUAAAAASUVORK5C\nYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA2LTA3VDEzOjE4\nOjQ5LTA0OjAwxfC/BgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNi0wN1QxMzoxODo0OS0wNDow\nMLStB7oAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -374,9 +352,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate a tally Mesh\n", @@ -411,9 +387,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate tally Filter\n", @@ -439,9 +413,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate tally Filter\n", @@ -483,9 +455,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -519,22 +489,22 @@ " | The OpenMC Monte Carlo Code\n", " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", - " Version | 0.8.0\n", - " Git SHA1 | bc4683be1c853fe6d0e31bccad416ef219e3efaf\n", - " Date/Time | 2017-04-13 17:23:58\n", + " Version | 0.9.0\n", + " Git SHA1 | 897db1389dec7871026442bae96d9410ade85192\n", + " Date/Time | 2017-06-07 13:18:50\n", " MPI Processes | 1\n", - " OpenMP Threads | 1\n", + " OpenMP Threads | 12\n", "\n", " Reading settings XML file...\n", " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /home/smharper/openmc/data/nndc_hdf5/U235.h5\n", - " Reading U238 from /home/smharper/openmc/data/nndc_hdf5/U238.h5\n", - " Reading O16 from /home/smharper/openmc/data/nndc_hdf5/O16.h5\n", - " Reading H1 from /home/smharper/openmc/data/nndc_hdf5/H1.h5\n", - " Reading B10 from /home/smharper/openmc/data/nndc_hdf5/B10.h5\n", - " Reading Zr90 from /home/smharper/openmc/data/nndc_hdf5/Zr90.h5\n", + " Reading U235 from /home/johnny/Github/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/johnny/Github/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/johnny/Github/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/johnny/Github/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/johnny/Github/openmc/scripts/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/johnny/Github/openmc/scripts/nndc_hdf5/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -578,20 +548,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 2.4022E-01 seconds\n", - " Reading cross sections = 1.9056E-01 seconds\n", - " Total time in simulation = 7.5438E+00 seconds\n", - " Time in transport only = 7.5290E+00 seconds\n", - " Time in inactive batches = 1.0482E+00 seconds\n", - " Time in active batches = 6.4956E+00 seconds\n", - " Time synchronizing fission bank = 2.3117E-03 seconds\n", - " Sampling source sites = 1.3344E-03 seconds\n", - " SEND/RECV source sites = 6.8338E-04 seconds\n", - " Time accumulating tallies = 3.9461E-04 seconds\n", - " Total time for finalization = 1.3648E-05 seconds\n", - " Total time elapsed = 7.7964E+00 seconds\n", - " Calculation Rate (inactive) = 11925.2 neutrons/second\n", - " Calculation Rate (active) = 5773.18 neutrons/second\n", + " Total time for initialization = 3.6433E-01 seconds\n", + " Reading cross sections = 2.7963E-01 seconds\n", + " Total time in simulation = 1.4715E+00 seconds\n", + " Time in transport only = 1.3171E+00 seconds\n", + " Time in inactive batches = 2.2329E-01 seconds\n", + " Time in active batches = 1.2482E+00 seconds\n", + " Time synchronizing fission bank = 2.3145E-03 seconds\n", + " Sampling source sites = 1.4054E-03 seconds\n", + " SEND/RECV source sites = 7.6241E-04 seconds\n", + " Time accumulating tallies = 5.8822E-04 seconds\n", + " Total time for finalization = 5.0159E-05 seconds\n", + " Total time elapsed = 1.8511E+00 seconds\n", + " Calculation Rate (inactive) = 55980.8 neutrons/second\n", + " Calculation Rate (active) = 30044.0 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -632,9 +602,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# We do not know how many batches were needed to satisfy the \n", @@ -655,9 +623,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -692,21 +658,19 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.22614381]]\n", + "[[[ 0.17581417]]\n", "\n", - " [[ 0.3789572 ]]\n", + " [[ 0.30578219]]\n", "\n", - " [[ 0.05763899]]\n", + " [[ 0.06842901]]\n", "\n", - " [[ 0.14265074]]]\n" + " [[ 0.12436752]]]\n" ] } ], @@ -723,14 +687,25 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -763,8 +738,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -774,8 +749,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -785,8 +760,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -796,8 +771,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -807,8 +782,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -818,8 +793,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -829,8 +804,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -841,7 +816,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -851,8 +826,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -862,8 +837,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -873,8 +848,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -884,8 +859,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -895,8 +870,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -906,8 +881,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -917,8 +892,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -928,8 +903,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -939,8 +914,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -950,8 +925,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -961,8 +936,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -972,8 +947,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
0.00e+006.25e-01fission2.28e-045.15e-052.24e-043.94e-05
10.00e+006.25e-01nu-fission5.55e-041.26e-045.46e-049.59e-05
26.25e-012.00e+07fission8.65e-059.06e-068.42e-056.79e-06
36.25e-012.00e+07nu-fission2.28e-042.19e-052.22e-041.65e-05
40.00e+006.25e-01fission1.83e-043.54e-051.85e-042.70e-05
50.00e+006.25e-01nu-fission4.47e-048.62e-054.52e-046.58e-05
66.25e-012.00e+07fission6.91e-056.94e-066.82e-055.29e-06
72.00e+07nu-fission1.81e-041.77e-051.35e-05
80.00e+006.25e-01fission1.98e-042.55e-052.05e-042.25e-05
90.00e+006.25e-01nu-fission4.82e-046.20e-055.00e-045.49e-05
106.25e-012.00e+07fission7.76e-059.73e-067.53e-057.06e-06
116.25e-012.00e+07nu-fission2.05e-042.48e-051.99e-041.81e-05
120.00e+006.25e-01fission2.32e-043.38e-052.06e-042.79e-05
130.00e+006.25e-01nu-fission5.66e-048.23e-055.03e-046.80e-05
146.25e-012.00e+07fission6.54e-054.61e-066.65e-053.91e-06
156.25e-012.00e+07nu-fission1.73e-041.23e-051.75e-041.04e-05
160.00e+006.25e-01fission2.18e-043.68e-052.03e-042.78e-05
170.00e+006.25e-01nu-fission5.32e-048.97e-054.94e-046.78e-05
186.25e-012.00e+07fission5.92e-056.63e-066.26e-055.71e-06
196.25e-012.00e+07nu-fission1.56e-041.82e-051.64e-041.53e-05
\n", @@ -982,49 +957,49 @@ "text/plain": [ " mesh 1 energy low [eV] energy high [eV] score mean \\\n", " x y z \n", - "0 1 1 1 0.00e+00 6.25e-01 fission 2.28e-04 \n", - "1 1 1 1 0.00e+00 6.25e-01 nu-fission 5.55e-04 \n", - "2 1 1 1 6.25e-01 2.00e+07 fission 8.65e-05 \n", - "3 1 1 1 6.25e-01 2.00e+07 nu-fission 2.28e-04 \n", - "4 1 2 1 0.00e+00 6.25e-01 fission 1.83e-04 \n", - "5 1 2 1 0.00e+00 6.25e-01 nu-fission 4.47e-04 \n", - "6 1 2 1 6.25e-01 2.00e+07 fission 6.91e-05 \n", + "0 1 1 1 0.00e+00 6.25e-01 fission 2.24e-04 \n", + "1 1 1 1 0.00e+00 6.25e-01 nu-fission 5.46e-04 \n", + "2 1 1 1 6.25e-01 2.00e+07 fission 8.42e-05 \n", + "3 1 1 1 6.25e-01 2.00e+07 nu-fission 2.22e-04 \n", + "4 1 2 1 0.00e+00 6.25e-01 fission 1.85e-04 \n", + "5 1 2 1 0.00e+00 6.25e-01 nu-fission 4.52e-04 \n", + "6 1 2 1 6.25e-01 2.00e+07 fission 6.82e-05 \n", "7 1 2 1 6.25e-01 2.00e+07 nu-fission 1.81e-04 \n", - "8 1 3 1 0.00e+00 6.25e-01 fission 1.98e-04 \n", - "9 1 3 1 0.00e+00 6.25e-01 nu-fission 4.82e-04 \n", - "10 1 3 1 6.25e-01 2.00e+07 fission 7.76e-05 \n", - "11 1 3 1 6.25e-01 2.00e+07 nu-fission 2.05e-04 \n", - "12 1 4 1 0.00e+00 6.25e-01 fission 2.32e-04 \n", - "13 1 4 1 0.00e+00 6.25e-01 nu-fission 5.66e-04 \n", - "14 1 4 1 6.25e-01 2.00e+07 fission 6.54e-05 \n", - "15 1 4 1 6.25e-01 2.00e+07 nu-fission 1.73e-04 \n", - "16 1 5 1 0.00e+00 6.25e-01 fission 2.18e-04 \n", - "17 1 5 1 0.00e+00 6.25e-01 nu-fission 5.32e-04 \n", - "18 1 5 1 6.25e-01 2.00e+07 fission 5.92e-05 \n", - "19 1 5 1 6.25e-01 2.00e+07 nu-fission 1.56e-04 \n", + "8 1 3 1 0.00e+00 6.25e-01 fission 2.05e-04 \n", + "9 1 3 1 0.00e+00 6.25e-01 nu-fission 5.00e-04 \n", + "10 1 3 1 6.25e-01 2.00e+07 fission 7.53e-05 \n", + "11 1 3 1 6.25e-01 2.00e+07 nu-fission 1.99e-04 \n", + "12 1 4 1 0.00e+00 6.25e-01 fission 2.06e-04 \n", + "13 1 4 1 0.00e+00 6.25e-01 nu-fission 5.03e-04 \n", + "14 1 4 1 6.25e-01 2.00e+07 fission 6.65e-05 \n", + "15 1 4 1 6.25e-01 2.00e+07 nu-fission 1.75e-04 \n", + "16 1 5 1 0.00e+00 6.25e-01 fission 2.03e-04 \n", + "17 1 5 1 0.00e+00 6.25e-01 nu-fission 4.94e-04 \n", + "18 1 5 1 6.25e-01 2.00e+07 fission 6.26e-05 \n", + "19 1 5 1 6.25e-01 2.00e+07 nu-fission 1.64e-04 \n", "\n", " std. dev. \n", " \n", - "0 5.15e-05 \n", - "1 1.26e-04 \n", - "2 9.06e-06 \n", - "3 2.19e-05 \n", - "4 3.54e-05 \n", - "5 8.62e-05 \n", - "6 6.94e-06 \n", - "7 1.77e-05 \n", - "8 2.55e-05 \n", - "9 6.20e-05 \n", - "10 9.73e-06 \n", - "11 2.48e-05 \n", - "12 3.38e-05 \n", - "13 8.23e-05 \n", - "14 4.61e-06 \n", - "15 1.23e-05 \n", - "16 3.68e-05 \n", - "17 8.97e-05 \n", - "18 6.63e-06 \n", - "19 1.82e-05 " + "0 3.94e-05 \n", + "1 9.59e-05 \n", + "2 6.79e-06 \n", + "3 1.65e-05 \n", + "4 2.70e-05 \n", + "5 6.58e-05 \n", + "6 5.29e-06 \n", + "7 1.35e-05 \n", + "8 2.25e-05 \n", + "9 5.49e-05 \n", + "10 7.06e-06 \n", + "11 1.81e-05 \n", + "12 2.79e-05 \n", + "13 6.80e-05 \n", + "14 3.91e-06 \n", + "15 1.04e-05 \n", + "16 2.78e-05 \n", + "17 6.78e-05 \n", + "18 5.71e-06 \n", + "19 1.53e-05 " ] }, "execution_count": 22, @@ -1046,15 +1021,13 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nJenaNP0hSRMy6l4qKSQN3r9VMbPebNasWdTV1bFkyRJWrlzJkiVLqKurY9asWbVuWp/UYXhIqgMW\nAJOABmCqpIaKYpOAMWmYDlxXTV1JI4DTgF/u95qYWa+2adMmli5dysSJE+nXrx8TJ05k6dKlbNq0\nqdZN65OqOfM4HlgfEU9FxO+BW4EpFWWmAEujcB8wSNLQKup+BZgFxP6uiJmZdZ9q7rYaBmwsvd8E\nnFBFmWHt1ZU0BXgmIh6UtNeFS5pOcTbDkCFDaG5urqLJlqOlpcXb1Q54gwcP5swzz2TAgAE8//zz\nHHXUUWzdupXBgwd7/62BmtyqK+n1wGcpuqzaFRHXA9cDNDY2hn96svP5Jz2tJzjnnHNYuHAhAwcO\nRBKS2LZtG+eff7733xqoptvqGWBE6f3wNK6aMnsb/xZgNPCgpA1p/M8lvTGn8WbWd6xatYo5c+Zw\n5JFHAnDkkUcyZ84cVq1aVeOW9U2KaP9yg6R+wJPAyRQH/tXAuRHxSKnM+4CLgckU3VLXRsTx1dRN\n9TcAjRHxQnttaWxsjDVr1mStoHXMZx7WE9TV1fHb3/6W/v37v7bP7tixg/r6enbt2lXr5vUaku6P\niMaOynV45hEROymC4S7gMeC2iHhE0gxJM1KxFcBTwHpgMfDx9uruw/qYWR83duxY7r333j3G3Xvv\nvYwdO7ZGLerbqrrmERErKAKiPG5R6XUAF1Vbt40yo6pph5n1XXPnzuWCCy7ga1/7Grt27WLVqlVc\ncMEFzJs3r9ZN65P8bCszO2C1dSfmSSedtMf7c889l3PPPXePcR11x9v+8+NJzOyAFRFtDiM/8+29\nTnNwdA+Hh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZNoeHmZllc3iY\nmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZ\nNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaHh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWVzeJiZWTaH\nh5mZZXN4mJlZNoeHmZllc3iYmVk2h4eZmWWrKjwknS7pCUnrJc1uY7okXZumPyRpQkd1Jf1TKvuA\npJWSju6cVTIzs67WYXhIqgMWAJOABmCqpIaKYpOAMWmYDlxXRd2rI2J8RBwHfBv43P6vjpmZdYdq\nzjyOB9ZHxFMR8XvgVmBKRZkpwNIo3AcMkjS0vboR8Uqp/gAg9nNdzMysm/SroswwYGPp/SbghCrK\nDOuorqR5wHnAFmBi1a02M7OaqiY8ukxEzAXmSpoDXAxcXllG0nSKrjCGDBlCc3Nzt7axL2hpafF2\ntR7H+2xtVRMezwAjSu+Hp3HVlOlfRV2AbwAraCM8IuJ64HqAxsbGaGpqqqLJlqO5uRlvV+tRvrPc\n+2yNVXPNYzUwRtJoSQcB5wDLKsosA85Ld129G9gSEZvbqytpTKn+FODx/VwXMzPrJh2eeUTETkkX\nA3cBdcCSiHhE0ow0fRHFWcNkYD2wDZjWXt006yslvQ3YDTwNzOjUNTMzsy5T1TWPiFhBERDlcYtK\nrwO4qNq6afwHs1pqZmYHDH/D3MzMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8\nzMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzM\nLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCyb\nw8PMzLI5PMzMLJvDw8zMsjk8zMwsm8PDzMyyOTzMzCybw8PMzLI5PMzMLJvDw8zMsjk8zMwsW1Xh\nIel0SU9IWi9pdhvTJenaNP0hSRM6qivpakmPp/K3SxrUOatkZmZdrcPwkFQHLAAmAQ3AVEkNFcUm\nAWPSMB24roq63wX+OCLGA08Cc/Z7bczMrFtUc+ZxPLA+Ip6KiN8DtwJTKspMAZZG4T5gkKSh7dWN\niJURsTPVvw8Y3gnrY2Zm3aCa8BgGbCy935TGVVOmmroAfwPcWUVbzMzsANCv1g2QNBfYCXxjL9On\nU3SFMWTIEJqbm7uvcX1ES0uLt6v1ON5na6ua8HgGGFF6PzyNq6ZM//bqSjofeD9wckREWwuPiOuB\n6wEaGxujqampiiZbjubmZrxdrUf5znLvszVWTbfVamCMpNGSDgLOAZZVlFkGnJfuuno3sCUiNrdX\nV9LpwCzgjIjY1knrY2Zm3aDDM4+I2CnpYuAuoA5YEhGPSJqRpi8CVgCTgfXANmBae3XTrL8KHAx8\nVxLAfRExozNXzszMukZV1zwiYgVFQJTHLSq9DuCiauum8cdktdTMzA4Y/oa5mZllc3iYmVk2h4eZ\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1070,14 +1043,12 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -1086,9 +1057,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdIAAAGHCAYAAAAEI9NyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3XmYXVWZ7/Hvj0qEDlOUtBXDIGBshCsIRsZ2QEaxEXBA\nDHJpBUFaEDo8It02Qgxyr+JlvJiWVhmikm40V0AwREZBBKKEKU2CoAkSIYEQIEAQkqr3/rH2gZND\nnWmffWo45/d5nv2E2nvt96xdKfLWWnsNigjMzMwsn3WGugJmZmYjmROpmZlZC5xIzczMWuBEamZm\n1gInUjMzsxY4kZqZmbXAidTMzKwFTqRmZmYtcCI1MzNrgROpDTuS3ifpDkkvSuqTtIOkqZL62/BZ\nn5PUL2mLomObWXcYNdQVMCsnaRTwM2AV8M/Zn48BARSeSLO4I3adTEn/CjwUEVcPdV3MupW81q4N\nJ5K2ARYAR0fEpWXn1wFGRcSrBX+egNFFxx0skl4AfhoRRw11Xcy6lbt2bbjpzf58vvxkRPS3I9lF\nMiySqJJ1h7oeZtYcJ1IbNiRdCtxK6mr9Wfbu8ubs2hvekUraV9Ltkp6V9IKkhZLOqijzZUnzJb0k\naYWk30n6TNn1Ad+RSvpSdt9fJf1F0kWSNq4oc6ukByRtK+mW7DOWSDqlweftl3ShpMMlzQf+Cuyf\nXftK9p54uaRVkn4v6ZOV9wNjgNIz9Eu6pOz6BEmXSFqaPcd8SZ9vpG5m1ji/I7Xh5HvAEuDfgAuA\n3wHLsmtrvcuUtB3wC+A+4OvAK8BEYI+yMsdkca4EzgfWA3YAdgX+c6C42X1TgdOBXwHTgW2ALwHv\nk/T3EdFXdu9bgNnA/8tifgr4lqQHImJOA8+8N/Bp4CJgObA4O38icDXwY+BNwGeAKyUdGBGzszJH\nAD8E7gb+Izv3x+wZ3pqd7wMuzGIfAPxQ0oYRcWEDdTOzRkSEDx/D5gA+RBpU9ImK82cAfWVfn0RK\nEm+uEevnwAN1Pu8fszhbZF+PI7UMf1lR7ktZuX8sO3dLdu7wsnOjgSeAKxt41n5gNbDNANfWrfi6\nB3gAuKHi/AvAJQPc/wPSLyVjK85fAayojO/Dh4/8h7t2baR6Lvvz49mAoWplNpP0vibi7kNKhudX\nnP8+KWn9Q8X5FyPiitIXEbEamAts3eDn3RoRD1eejIhXSv8taSzwZuB24L0Nxv0EqcXeI2mT0kFq\nZW/cRBwzq8OJ1Eaq/wLuICW4ZZJmSjq0Iql+G3gRmCvpD9l7zj0GClbm7dmffyg/mSXIP5VdL1ky\nQIxnSYmvEYsHOinpQEl3SnqZ1IJ8CvgnUhKsSdLfAmOBY4GnK47SO9S3Nlg/M6vD70htRIqIvwIf\nlPRhUivxI8BhwE2S9otkYTad5sDs+ieAL0n6RkR8o6Cq9FU5X62VXOnlN9wofYD0fvRWUvJ8ktQF\nfBQwuYGYpV+QfwxcXqXMAw3Wz8zqcCK1ES0ibiG9q/xKtjjBN4EPAzdn118Gfgr8NFvs4efAv0n6\n3zHwtJfHsj+3oay1KGk0sBVwQ5sepdwnSAl2/4hYU1aHowcoO9BE8KdJ3dA9EXFze6poZiXu2rUR\nSdJAXaf3k1qC62Zl3lJ+MUtKC7Iyo6uEvpHU+jux4vwXgI2Aa/PXumF9pAT52i+6krYEDh6g7Euk\nbtzXREQ/MAv4pKT/UXmDpHEF1tWs67lFaiPV6ZI+CFxHakX2krpB/wz8JivzK0lLSe9SlwHbAccD\n10bESwMFjYjlkv53Fv964BrgXVnsucBP2vdIr7kOOBmYI+kK0rN9CXiENH2n3D3APpKmkEYLL4qI\nucC/AHsCd0v6PvAQaarOJGAv0uhkMyuAE6kNR9XWrSw/fzVp4M/nSUlhOemd4tSIeCEr8z3gs8AU\nYAPSwKDzgbUWbXjDh0R8Q9JTwAnAuaTBPt8D/i1en0PaTF2rftRA5SLiFklHkZLhecAi4KukruXK\nRHoycDFwJvA3pHeicyPiKUm7kObDfpz0i8AzwH9nscysIF5r18zMrAV+R2pmZtYCJ1IzM7MWOJGa\nmZm1wInUzMysBU6kZmZmLejI6S/Z4tz7k1am+evQ1sbMrBDrAVsCcyLimaKDZ3vytjK/eHlE/Lmo\n+owkHZlISUl0MCbOm5kNts+StsMrjKQtRsNjq1sLs0rStt2YTDs1kS5Of/yYtChNNVNI891reaKQ\nCiXrFRTnLfWLNKSoxvp/N1Dmu6RFheppZsezWu4qKE61NenzGFNQnJUNlPkhMNDSvOVeqXO9URsV\nFAeKq9PjBcUZcAGsCteT9kRot+Wk/eMH3jGoReNWk3alz7Mt0FPAz9IP+DjS6mJdpVMTaZYh3kXt\nbRfH1rkOxSUtKO4f0qJ2wHrDxiM5NfJ77AbA3zVQrqhtMovq+VpTv0jDNiwozooGyowB3lGnTFF/\n/0X+P1JUnYpaaKaRX1rWA95W0Oc1pG2vqyYAm+a4r1MTSaNG1GAjScdLWiTpZUl3Sdp5qOtkZmbd\nbcQkUkmHAecAZwA7kXb6mOOdLMzMitFDal02e/QMRWWHkRGTSEkvNC+OiBkRsRA4DlhF2uzYzMxa\nNIq0v2Czh7t2R4BsU+VJwE2lc5FW278R2D1/5M+0WjVr2F5DXYEu88GhrkAXefdQV6AwbpHmM1J+\nkRhH+rtaVnF+GbBN/rCT899qTdp7qCvQZZxIB8/2Q12BwpRapHnu62bd/vxmZpYptUjz3NfNRkoi\nXU6a0Ndbcb4XWFr9timkKS7lPoNbomY2vD0IzK8450XahqsRkUgjYrWke0j9g9cASFL29YXV7zyP\n4uYlmpkNlu15Y5fxk8B/tPVT3bWbz0h6/nOBy7KEOpfU3BwDXDaUlTIz6xSlwUN57utmI+b5I+LK\nbM7oNFKX7n3A/hHx9NDWzMysM7hFms+Iev6ImA5MH+p6mJl1IifSfEbEPFIzM7PhyonUzMyA9i7I\n0Oxa6ZIOlbQgK3+/pAMGKDNN0hOSVkm6QdLEKrHeJOk+Sf2Sdqi4toOk27LPeUzSKQ08zlo6u0W+\nvWB9tRZjva2KqQvAZgXFqTHhpymbFbQbzZI9i4kDsKSoQPsWE2ZhMWEKVdTPUVGzKZY/UlAgKG73\nl20LijOvoDjwxvVkmtXIlm6taVfXbtla6cfy+mDROZL+LiKWD1B+D9Keq6cC15H2YL1K0k4R8VBW\n5lTgBOBI0tZy38xibhsRr1aEPJv0r8taQ6ElbQjMAX4FfDG7fqmkZyPiBw0+vlukZmaWtLFF2uxa\n6ScCsyPi3Ih4OCJOJ/1Wc0JZmZOAMyPi2oiYT0qoE4BDygNlLdl9ga8AlS2rI0i/OxwdEQsi4krS\nlMqT6z/S65xIzcwMaM+i9TnXSt89u15uTqm8pK2B8RUxVwJ3l8eU1EuafHsEA3d37AbcFhHlGw/P\nAbaRtHGNx1qLE6mZmQFta5HWWit9fJV7xtcp30vavb1ezEuB6RFxb5OfU7rWECdSMzPrOJJOBDYA\nvl061a7P6uzBRmZm1rBGBhtdT+r7LPdC7VvyrJW+tE75paTE2MvaLcpeoNT6/DCpm/eVtKLsa34v\n6ScR8fkan1P6jIY4kZqZGdDYEoEHZke5BVTf3TnnWul3DnB93+w8EbFI0tKszANZzI2AXYHvZuW/\nDPxb2f0TSL8DfJo0crj0Od+U1BMRfdm5/YCHI+L5KnV7AydSMzMD2rqyUc210iXNAJZExNey8hcA\nt0o6mTT9ZTJpwNIxZTHPB06T9Chp+suZpCkuVwNExFqT6SS9RGrF/ikinshOXwGcDlwi6duk6S8n\nkkYEN8yJ1MzMgPbtR9rAWumbAWvKyt8p6XDgrOx4BDi4NIc0K3O2pDHAxaT9Mm8HDhhgDulaVamo\n10pJ+5Fasb8ndUNPjYgf1nvmck6kZmYGtHet3VprpUfEXgOcmwXMqhNzKjC1gY8nIh5jgJyfzUH9\nUCMxqvGoXTMzsxa4RWpmZoB3f8mr25/fzMwy7XpH2umcSM3MDIBRPTA6x7IFo4I0U7RLOZGamRkA\nPT0wKsfImZ5+nEjNzMxGrQOjc/TTdnsi8ahdMzOzFnT7LxJmZpYZNSq9J236vrYtBz8yOJGamRmQ\nDTbKkRW6PZF09vP/M7BNizEaXv9/EC0uKM4hUb9MIy4q8NfRjxQUZ2xBcYr8+6/cpnioLSwq0MSi\nAlHcTle3FhRnRUFxADZq8f71C6lFTeuQby5Lf9EVGVk6O5GamVnj8k4k7fJE6sFGZmZmLXCL1MzM\nkkY2JB1Il7dInUjNzCzJ27XbxYsxgBOpmZmV5B1s1OUvCZ1Izcws8ar1uTiRmplZkvcdaZdnki5v\nkJuZmbWmy3+PMDOz1/gdaS5OpGZmlvgdaS5OpGZmlvgdaS5d/vhmZvYad+3m4kRqZmaJu3Zz6fLf\nI8zMzFrjFqmZmSVukebiRGpmZokHG+Xirl0zM0tKg42aPRrIJJKOl7RI0suS7pK0c53yh0pakJW/\nX9IBA5SZJukJSask3SBpYsX1qyU9lsV4QtIMSW8ru/52Sf0VR5+kXeo/0es6+veITXZcwuj3jm0p\nxoa8UFBt4JHr3lNMoM/8tZg4f123mDgfKSYMAEsLirNbQXFGRUGBgLEqJs7CYsLQ2v8ar3uxoOcC\nuKugOC9uX1CgvykoDsCSFu9fv5Ba1NSmrl1JhwHnAMcCc4EpwBxJfxcRywcovwdwBXAqcB3wWeAq\nSTtFxENZmVOBE4AjgcXAN7OY20bEq1mom4GzgCeBTbM6/BR4f9nHBbA38FDZuWcafHLALVIzMysp\nJdJmj/rvSKcAF0fEjIhYCBwHrAKOqlL+RGB2RJwbEQ9HxOnAPFLiLDkJODMiro2I+aSEOgE4pFQg\nIi6IiLkR8XhE3AV8C9hNUnmNBayIiKfKjqY2hnMiNTOztpE0GpgE3FQ6FxEB3AjsXuW23bPr5eaU\nykvaGhhfEXMlcHe1mJLeQmrZ3jFAorxG0jJJt0v6WIOP9honUjMzS/K8Hy0d1Y3LSiyrOL+MlAwH\nMr5O+V5Sl2zdmJK+JelFYDmwOWUtVuBF4GTgUOCjwG9IXcgH1nyiCh39jtTMzJrQmdNfzgZ+ALwd\nOAP4EXAgQEQ8A5xfVvYeSROAU4BrG/0AJ1IzM0saSKQzF8HMxWufe/7VgUq+ZjnQR2pFluul+vDC\npXXKLyW92+xl7VZpL3Bv+U0RsQJYATwqaSHwuKRdI+LuKp99N7BP1acZgBOpmZkl9btpmTwxHeXm\nPQOTfjFw+YhYLeke0sjYawAkKfv6wiofc+cA1/fNzhMRiyQtzco8kMXcCNgV+G6N6peertaUhZ1I\no3wb5kRqZmbtdi5wWZZQS9NfxgCXAUiaASyJiK9l5S8AbpV0Mmn6y2TSgKVjymKeD5wm6VHS9Jcz\nSXOMrs5i7gLsTHrv+SwwEZgGPEKWkCUdCbzK663YTwKfA45u5uGcSM3MLGnTO9KIuFLSOFIi6wXu\nA/aPiKezIpsBa8rK3ynpcNIc0LNIye/g0hzSrMzZksYAF5NmRd8OHFA2h3QV8AlgKmkS7pPAbOCs\niFhdVr2vA1tkn78Q+HRE/LyZx3ciNTOzpI2DjSJiOjC9yrW9Bjg3C5hVJ+ZUUqIc6Np8Utdvrftn\nADNqlWmEE6mZmSWdOWq37ZxIzcwsaWCwUdX7upgTqZmZJW6R5uKVjczMzFrgFqmZmSVukebiRGpm\nZonfkebiRGpmZolbpLk4kZqZWeJEmktHJ9IPcRvjWNRSjBubW7u4psn/cEkhce5jx0Li7Mh9hcT5\n4zveUUgcgEf7JtYv1IAVV21aSBzet6Z+mUZtObqYOEuKCcPYguIU+a9IUXV6cZOCAq0sKA6kxXla\n8UohtajJiTQXj9o1MzNrQUe3SM3MrAkebJSLE6mZmSXu2s3FidTMzBIn0lycSM3MLHHXbi5OpGZm\nlrhFmotH7ZqZmbXALVIzM0vcIs3FidTMzJJ1yJcUu7xv04nUzMySUeTLCl2eSbr88c3M7DXu2s2l\nyxvkZmZmrXGL1MzMErdIc3EiNTOzxIONcnEiNTOzxIONcunyxzczs9e4azcXJ1IzM0vctZtLlz++\nmZkNBknHS1ok6WVJd0nauU75QyUtyMrfL+mAAcpMk/SEpFWSbpA0seL61ZIey2I8IWmGpLdVlNlB\n0m1ZmcckndLss3V0i3QDXmAsz7UU4+P8vKDawCEFxfoFBxUS52d8qpA4H+aWQuIA9PT0FRLn93tu\nWEicD2xyWyFxAG5eemAhcTaeurSQOH1riumPe3Hq3xYSB4CJ9Ys0ZGFBca7qLSgQwCYt3v9sIbWo\nqU1du5IOA84BjgXmAlOAOZL+LiKWD1B+D+AK4FTgOuCzwFWSdoqIh7IypwInAEcCi4FvZjG3jYhX\ns1A3A2cBTwKbZnX4KfD+LMaGwBzgV8AXge2BSyU9GxE/aPTx3SI1M7NkVAtHbVOAiyNiRkQsBI4D\nVgFHVSl/IjA7Is6NiIcj4nRgHilxlpwEnBkR10bEfFJCnQAcUioQERdExNyIeDwi7gK+BewmqZT6\njwBGA0dHxIKIuBK4EDi57hOVcSI1M7Ok9I602aNGJpE0GpgE3FQ6FxEB3AjsXuW23bPr5eaUykva\nGhhfEXMlcHe1mJLeQmrZ3hERpa6v3YDbImJNxedsI2nj6k+1NidSMzNLSl27zR61u3bHZSWWVZxf\nRkqGAxlfp3wvEI3ElPQtSS8Cy4HNKWux1vic0rWGjIhEKukMSf0Vx0NDXS8zs47Svq7doXQ2sCOw\nL9AH/KjoDxjej7+2+cDegLKv19Qoa2ZmbTDzepg5Z+1zz79Y85blpARWOXKrF6g2cm5pnfJLSbmg\nl7VblL3AveU3RcQKYAXwqKSFwOOSdo2Iu2t8TukzGjKSEumaiHh6qCthZtaxGhi1O/nAdJSbtwAm\nTR64fESslnQPqSF0DYAkZV9fWOVj7hzg+r7ZeSJikaSlWZkHspgbAbsC361R/VIn9Lpln/NNST1l\n7033Ax6OiOdrxFnLiOjazbxT0l8k/VHSjyVtPtQVMjPrKG0YbJQ5FzhG0pGS3gV8DxgDXAaQze/8\nX2XlLwA+IulkSdtImkoasHRRWZnzgdMkfUzS9sAMYAlwdRZzl2zu6nskbSFpL9KUmkfIEnL29avA\nJZK2y6bpnEiaJtOwkdIivQv4HPAw8DZgKnCbpHdHxEtDWC8zs87RpnmkEXGlpHHANFLX6X3A/mW9\njJtR9rouIu6UdDhpDuhZpOR3cGkOaVbmbEljgIuBscDtwAFlc0hXAZ8g5Yv1SXNJZwNnRcTqLMZK\nSfuRWrG/J3VDT42IHzbz+CMikUZEeY/8fElzgceATwOXDk2tzMw6TBsXrY+I6cD0Ktf2GuDcLGBW\nnZhTSYlyoGulcTX16jUf+FC9crWMiERaKSKel/QH6qyDcvOU61l34/XWOrft5O3ZbvL27ayemVmL\nbgV+XXHOnW/D1YhMpJI2AN5B6hOvaq/zPsL4904YnEqZmRVmz+wo9yjp9V0bedH6XEZEIpX0HeAX\npO7cTYFvkPrTZw5lvczMOoq3UctlRCRS0ovoK0irPj8N/AbYLSKeGdJamZl1EifSXEZEIo2IKjOU\nzMysMG0cbNTJuvzxzcysJNaByNG6jC5/R9rlj29mZtYat0jNzAyAvh7oy5EV+vyOtHNtyWO8nRda\nitFX4Fv0P9ae9tqwsTxXSJx93rDdXz5bsriQOAA7cl8hcbbf5MFC4jzDJoXEAfjkrj8uJM6sh48o\nJE7jS3LXUXvB8uYU89cP69Uv0pgxRQUC/qbF+9etX6RF/TkTab8TqZmZGfT1iDU9ql/wDfcFaXvQ\n7uREamZmAPT19NA3qvmhM309/XTzzpZOpGZmBkB/Tw99Pc0n0v4e0c2J1KN2zczMWuAWqZmZAdDH\nOrkGWPbVL9LRnEjNzAxIsxTWOJE2zYnUzMwA6KeHvhxpob8NdRlJnEjNzAxopWu3u1OpE6mZmQGl\nFmnzibS/yxOpR+2amZm1wC1SMzMDoD9n125/lw83ciI1MzMA1rBOrlG7a7q8c9OJ1MzMAOhnVM5R\nu26RmpmZtdC1290t0u5+ejMzsxa5RWpmZkAr80i7u03mRGpmZkArSwR2987eHZ1IJ/F73s3ooa7G\na55hXCFx9uSWQuI8RW8hcW5hz0LiAIzluULifJyfFxJnWUHfI4BT+E4hcTbY7OlC4rx4498WEof3\nFxMGgPEFxfleQXEK9Tct3r9uIbWoJf8SgfUTqaTjga+Q/pbvB74cEb+rUf5QYBqwJfAH4F8iYnZF\nmWnAF4CxwB3AP0XEo9m1twNfB/bKPvMvwE+AsyJidVmZRRUfHcDuETG37kNlurs9bmZmr+nLVjbK\nc9Qi6TDgHOAMYCdSIp0jacDWhaQ9gCuA7wM7AlcDV0narqzMqcAJwLHALsBLWcw3ZUXeBQg4BtgO\nmAIcB5xV8XHB68l2PPA24J4Gvl2vcSI1MzPg9VG7zR4NjNqdAlwcETMiYiEpoa0CjqpS/kRgdkSc\nGxEPR8TpwDxS4iw5CTgzIq6NiPnAkcAE4BCAiJgTEUdHxE0RsTgirgX+D/CJis8SsCIinio7mprP\n40RqZmZtI2k0MAm4qXQuIgK4Edi9ym27Z9fLzSmVl7Q1qfVYHnMlcHeNmJC6gFcMcP4aScsk3S7p\nYzUfaAAd/Y7UzMwa16ZRu+OAHmBZxfllwDZV7hlfpXzpLXovqUu2Vpm1SJpIatGeXHb6xezrO0i7\nwX2K1IV8cNaCbYgTqZmZAZ07alfSpsBs4L8i4pLS+Yh4Bji/rOg9kiYApwBOpGZm1pxGRu3eOnMZ\nt858aq1zLz2/ptYty4E+eMMQ+F5gaZV7ltYpv5T0brOXtVulvcC95TdlifFm4DcR8cVaFc3cDezT\nQLnXOJGamRnQWNfuByZP4AOTJ6x17tF5K/nnSQPPZImI1ZLuAfYGrgGQpOzrC6t8zJ0DXN83O09E\nLJK0NCvzQBZzI2BX4LulG7KW6M3A76g+sKnSTsCTDZYFnEjNzCyTf2PvuvecC1yWJdS5pFG8Y4DL\nACTNAJZExNey8hcAt0o6GbgOmEwasHRMWczzgdMkPQosBs4ElpCmypRaoreS5ol+FXhryt8QEcuy\nMkcCr/J6K/aTwOeAo5t5fidSMzNrq4i4MpszOo3U/XofsH9ElFYX2QxYU1b+TkmHk+Z8ngU8Ahwc\nEQ+VlTlb0hjgYtJo3NuBAyLi1azIvsDW2fF4dk6kQUrlmf/rwBbZ5y8EPh0RTa3o4kRqZmZA6trN\nN9io/kzKiJgOTK9yba8Bzs0CZtWJORWYWuXa5cDlde6fAcyoVaYRTqRmZgaUVjZqPi0M91G77eZE\namZmQFvfkXY0J1IzMwO8jVpeTqRmZgZ07oIM7dbdv0aYmZm1yC1SMzMD2rsfaSdzIjUzM8DvSPPq\n6ES62YPPsPXqFoP8qZCqALD1zGrLSjbpu/WLNOLNE54rJM4mPcsLiVOkPzKxkDj7vGEnp/y246H6\nhRowdv1nC4lz+3EfLCTOisUT6hdq1J6vFBNn/HrFxPlmMWGAtObOMOdRu/l0dCI1M7PG9edskTaw\nsXdH6+6nNzMza5FbpGZmBsCanNNf8tzTSZxIzcwM8KjdvJxIzcwM8KjdvJxIzcwM8KjdvJxIzcwM\naO82ap2s6aeXdLmkYiagmZmZjXB5WqQbAzdKegy4FLg8Iv5SbLXMzGyweT/SfJpukUbEIcCmwL8D\nhwGLJc2W9ClJo4uuoJmZDY7SO9Jmj25/R5qrYzsino6IcyPiPcCuwKPAj4AnJJ0n6Z1FVtLMzNqv\ntLJR84nU70hzk/Q2YN/s6AN+CWwPPCRpSuvVMzOzwdKXM5F2+2CjpjvDs+7bg4DPA/sBDwDnA1dE\nxMqszMeBS4DziquqmZm1kzf2zifPYKMnSS3ZmcAuEXHfAGVuAYrZWsTMzGwYy5NIpwA/jYi/VisQ\nEc8BW+WulZmZDTovEZhP09+xiPhROypiZmZDy0sE5uOVjczMDPASgXk5kZqZGeAlAvPq7ET6Q2Bs\nizEOKqIimQ0KivN8MWE2WrO6mEBbPFNMHGCjHxVTpwc/t0MhcR5iu0LiAHyeSwuJcyP7FBJnbE8x\n4wEnvOOJQuIAzL9p52IC/ayYMKwpKA4Ab23x/qcKqUUtfYzKubJR/XskHQ98BRgP3A98OSJ+V6P8\nocA0YEvgD8C/RMTsijLTgC+Q/qW/A/iniHg0u/Z24OvAXtln/gX4CXBWRKwui7EDcBGwM+mbfFFE\nfKeR5y7p7l8jzMys7SQdBpwDnAHsREqkcySNq1J+D+AK4PvAjsDVwFWStisrcypwAnAssAvwUhbz\nTVmRdwECjgG2Iw2UPQ44qyzGhsAcYBHwXuAUYKqkLzTzfE6kZmYGtHVloynAxRExIyIWkhLaKuCo\nKuVPBGZnK+g9HBGnA/NIibPkJODMiLg2IuYDRwITgEMAImJORBwdETdFxOKIuBb4P8AnymIcAYwG\njo6IBRFxJXAhcHLj3zUnUjMzy7RjZaNsEZ9JwE2lcxERwI3A7lVu2z27Xm5OqbykrUndteUxVwJ3\n14gJqQt4RdnXuwG3RUR5J/4cYBtJG9eIs5bOfkdqZmYNa9Oo3XFAD7Cs4vwyYJsq94yvUn589t+9\nQNQpsxZJE0kt2vLW5njgTwPEKF1raESKE6mZmQGdO2pX0qbAbOC/IuKSouM7kZqZWcP+PPMu/jzz\nrrXOvfr8qlq3LCdtatJbcb4XWFrlnqV1yi8lDSTqZe1WaS9wb/lNkiYANwO/iYgvNvg5pWsNcSI1\nMzOgsY29N538fjad/P61zj07bxE3T/r6gOUjYrWke4C9gWsAJCn7+sIqH3PnANf3zc4TEYskLc3K\nPJDF3Ii0red3SzdkLdGbgd8x8MCmO4FvSuqJiL7s3H7AwxHR8ETD4d0eNzOzQdPGjb3PBY6RdKSk\ndwHfA8YAlwFImiHpf5WVvwD4iKSTJW0jaSppwNJFZWXOB06T9DFJ2wMzgCWkqTKlluitwGPAV4G3\nSuqVVN49oklIAAAWuElEQVQCvQJ4FbhE0nbZNJ0TSVN1GuYWqZmZAe1bazcirszmjE4jdZ3eB+wf\nEU9nRTajbPmLiLhT0uGkOZ9nAY8AB0fEQ2VlzpY0BriYNBr3duCAiHg1K7IvsHV2PJ6dE2mQUk8W\nY6Wk/Uit2N+TuqGnRsQPm3l+J1IzMwPaux9pREwHple5ttcA52YBs+rEnApMrXLtcuDyBuo1H/hQ\nvXK1OJGamRngbdTy8jtSMzOzFrhFamZmgPcjzcuJ1MzMAO9HmpcTqZmZAZ27slG7OZGamRnQ2IIM\n1e7rZk6kZmYGuGs3r85OpFtRZR+AJlxQREUyHy0ozkX1izSkoPps9OvV9Qs1asdiwozluULiPMfY\nQuIAPFx1o4vmHJRWWWvZC2xQSJwNebGQOADzx+9cTKCCfo4K+jFKlm/V2v3xbFqx1oadzk6kZmbW\nsP6co3Yb2Ni7ozmRmpkZwGtr5+a5r5s5kZqZGeBRu3kNi6eX9AFJ10j6i6R+SQcNUGaapCckrZJ0\nQ7bbuZmZFaQ0arf5o7tbpMMikQLrk3YD+BJpZf61SDoVOAE4FtgFeAmYI+lNg1lJM7NO1sZt1Dra\nsOjajYjrgevhtQ1fK50EnBkR12ZljiTtin4IcOVg1dPMzKzScGmRViWpNInlptK5iFgJ3A3sPlT1\nMjPrNKVRu823SId9KmmrYdEirWM8qbt3WcX5ZbQ+S9TMzDJrWIeeHN20a5xIzczMoD8bPJTnvm42\nEp5+KSCgl7Vbpb3AvbVunHIzbLzu2ucmbwuTtyu4hmZmReqfCTFz7XPxfPs/1gsy5DLsE2lELJK0\nFNgbeABA0kbArsB3a9173l7wXnf+mtlIs85kYPLa52Ie9E0akupYbcMikUpaH5hIankCbC3pPcCK\niHgcOB84TdKjwGLgTGAJcPUQVNfMrCP1sQ7reEGGpg2LRAq8D7iFNKgogHOy85cDR0XE2ZLGABcD\nY4HbgQMi4tWhqKyZWSfq7++hrz9H126OezrJsEikEfFr6kzFiYipwNTBqI+ZWTfq61sH1uRokfa5\nRWpmZkbfmh5Yk2Nj7xzJt5M4kZqZGQD9fT25WqT9fd2dSLu7PW5mZtaizm6RPkvrvypsUkRFMhsX\nFOfxYsKsOryYOGOOLyYOAL8uJsyHDppbTKC/LyYMQO9bKxfnyuc8phQS58PcWkicn/GpQuIAjB6/\nspA4q4/YqJA4XFtMGADWPNJigD8XUo1a+vrWIXK1SLu7TdbdT29mZq/pW9PDmtXNH428I5V0vKRF\nkl6WdJekneuUP1TSgqz8/ZIOGKBMze01JX1N0h2SXpK0osrn9FccfZI+XfeByjiRmpkZANHfQ3/f\nqKaPqDP9RdJhpGmNZwA7AfeTtsIcV6X8HsAVwPeBHUlrBlwlabuyMo1srzmatEPYv9d59H8krZY3\nHngbcFWd8mtxIjUzs2RNNv2l6aNuKpkCXBwRMyJiIXAcsAo4qkr5E4HZEXFuRDwcEacD80iJs+S1\n7TUjYj5wJDCBtL0mABHxjYi4AHiwTv2ej4inI+Kp7GhqjQInUjMzS/ryJNGedF8VkkYDk1h7K8wA\nbqT6Vpi7Z9fLzSmVl7Q1xW6v+V1JT0u6W9Lnm725swcbmZnZUBsH9DDwVpjbVLlnfJXypdXTeylu\ne82vAzeTWsj7AdMlrR8RFzUawInUzMySPsEa1S830H0jVEScVfbl/ZI2AE4BnEjNzKxJfcCaOmWu\nmwm/rNji7YWaW7wtzyL3VpzvJW2TOZCldcrn3l6zAXeTNkkZHRGrG7nBidTMzJJGEun+k9NRbsE8\n+MzAW7xFxGpJ95C2wrwGQJKyry+s8il3DnB93+x8S9trNmAn4NlGkyg4kZqZWcka6ifSavfVdi5w\nWZZQ55JG8Y4BLgOQNANYEhFfy8pfANwq6WTgOtLmrJOAY8pi1t1eU9LmwFuAtwM92facAI9GxEuS\nDiS1Yu8C/kp6R/qvwNnNPL4TqZmZJWuAhtthFffVEBFXZnNGp5ES133A/hHxdFZks/IoEXGnpMOB\ns7LjEeDgiHiorEwj22tOI02LKZmX/flh4DbS0x5PSvQCHgX+OSJ+0PCz40RqZmaDICKmA9OrXNtr\ngHOzgFl1Yk6lxvaaEfF5oOp0loiYQ5pW0xInUjMzS/pJ70nz3NfFnEjNzCxpZLBRtfu6mBOpmZkl\n7Rts1NGcSM3MLHGLNBevtWtmZtYCt0jNzCxxizQXJ1IzM0ucSHPp7ET6ILBeayFWLiqkJgBsVH8T\n+cYU9EM7Zr9i4rCgoDiQFvwqwlYFxflVQXGA3f7+/kLivGOrPxYSZ0NeKCTOE0woJE6h/rOgOGML\nigPAO1u8v5i/r5qcSHPp7ERqZmaNa9PKRp3OidTMzJI+8rUuu7xF6lG7ZmZmLXCL1MzMEr8jzcWJ\n1MzMEifSXJxIzcwscSLNxYnUzMwSr7WbixOpmZklbpHm4lG7ZmZmLXCL1MzMErdIc3EiNTOzxCsb\n5eJEamZmiVc2ysWJ1MzMEnft5uJEamZmiRNpLh61a2Zm1gK3SM3MLHGLNBcnUjMzSzxqN5fOTqQb\nAxu0FmKjLQqpCQCr7igmzphDi4nDLwuK8z8LigOwd0Fxinq2Av+B+NMR4wuJcyQzConzXxxWSJzN\nebyQOACL12xZTKD1iglTbILIk6HKDUK28qjdXPyO1MzMklLXbrNHA4lU0vGSFkl6WdJdknauU/5Q\nSQuy8vdLOmCAMtMkPSFplaQbJE2suP41SXdIeknSiiqfs7mk67IySyWdLamp3OhEamZmbSXpMOAc\n4AxgJ+B+YI6kcVXK7wFcAXwf2BG4GrhK0nZlZU4FTgCOBXYBXspivqks1GjgSuDfq3zOOqT+q1HA\nbsA/Ap8DpjXzfE6kZmaWtK9FOgW4OCJmRMRC4DhgFXBUlfInArMj4tyIeDgiTgfmkRJnyUnAmRFx\nbUTMB44EJgCHlApExDci4gLgwSqfsz/wLuCzEfFgRMwBvg4cL6nhV59OpGZmlpQGGzV71Hh9K2k0\nMAm4qXQuIgK4Edi9ym27Z9fLzSmVl7Q1ML4i5krg7hoxB7Ib8GBELK/4nI2B/9FoECdSMzNL+lo4\nqhsH9ADLKs4vIyXDgYyvU74XiCZjNvM5pWsN6exRu2Zm1rhG5pEumgmLZ6597tXn21WjEcGJ1MzM\nkkYS6eaT01FuxTyYM6naHcuzyL0V53uBpVXuWVqn/FJA2bllFWXurV75AT+ncvRwb9m1hrhr18zM\n2iYiVgP3UDZLXJKyr39b5bY7eeOs8n2z80TEIlKiK4+5EbBrjZjVPmf7itHD+wHPAw81GsQtUjMz\nS9q3stG5wGWS7gHmkkbxjgEuA5A0A1gSEV/Lyl8A3CrpZOA6YDJpwNIxZTHPB06T9CiwGDgTWEKa\nKkMWd3PgLcDbgR5J78kuPRoRLwG/IiXMH2XTad6Wxbko+wWgIU6kZmaW9JNvlaL+2pcj4sqs1TeN\n1HV6H7B/RDydFdmMsnQcEXdKOhw4KzseAQ6OiIfKypwtaQxwMTAWuB04ICJeLfvoaaRpMSXzsj8/\nDNwWEf2SDiTNM/0taS7qZaT5rg1zIjUzs6Q0LzTPfXVExHRgepVrew1wbhYwq07MqcDUGtc/D3y+\nTozHgQNrlanHidTMzBLv/pKLE6mZmSXe/SUXj9o1MzNrgVukZmaWtGmwUadzIjUzs8TvSHNxIjUz\ns6SNo3Y7WUcn0r/cD29uMcYLhdQk2eEbBQX6cUFxtioozq8LigPw0YLiFPVs7ysoDjCGlwuJcxP7\nFBKnp6BmRB89hcQBGDvuuULirPjU+oXE4aJiwgAwanRr98eo9rf8PNgoFw82MjMza0FHt0jNzKwJ\nHmyUixOpmZklHmyUixOpmZklHmyUixOpmZklHmyUixOpmZklfkeai0ftmpmZtcAtUjMzSzzYKBcn\nUjMzS5xIc3EiNTOzJO+gIQ82MjMzI7UslfO+LuZEamZmSd6E2OWJ1KN2zczMWuAWqZmZJX1A5Liv\ny+eROpGamVmyhnzvSPMk3w7iRGpmZknewUZOpGZmZpkuT4p5dHQifQV4ucUYO3y0iJpkfllMmFsf\nKSbOnicVE4cFBcUBeLCgOPsXE2blFqOLCQRs+MoLhcR5Yt0JhcR5mG0KifPbZXsUEgdgy97FhcRZ\ncdWmhcQp1JpWM5Qz3HDlUbtmZmYtcCI1M7O2k3S8pEWSXpZ0l6Sd65Q/VNKCrPz9kg4YoMw0SU9I\nWiXpBkkTK66/WdJPJD0v6VlJP5C0ftn1t0vqrzj6JO3SzLM5kZqZWVtJOgw4BzgD2Am4H5gjaVyV\n8nsAVwDfB3YErgaukrRdWZlTgROAY4FdgJeymG8qC3UFsC2wN/APwAeBiys+LoC9gPHZ8Tbgnmae\nz4nUzMwypZ29mz3qLrY7Bbg4ImZExELgOGAVcFSV8icCsyPi3Ih4OCJOB+aREmfJScCZEXFtRMwH\njgQmAIcASNqWNFri6Ij4fUT8Fvgy8BlJ48viCFgREU+VHU2t1TQsEqmkD0i6RtJfsqb1QRXXLx2g\n+V3Q0B0zM0vWtHAMTNJoYBJwU+lcRARwI7B7ldt2z66Xm1MqL2lrUuuxPOZK4O6ymLsBz0bEvWUx\nbiS1QHetiH2NpGWSbpf0saoPU8WwSKTA+sB9wJeoPjRtNtDL683vyYNTNTMza8E4oAdYVnF+Genf\n8oGMr1O+l5QrapUZDzxVfjFraa4oK/MicDJwKPBR4DekLuQDaz5RhWEx/SUirgeuB5BUbTrwKxHx\n9ODVysys25S6dmv5WXaUe7491WmziHgGOL/s1D2SJgCnANc2GmdYJNIG7SlpGfAscDNwWkSsGOI6\nmZl1kEZ29j4kO8rdTxqvM6DlWeDeivO9wNIq9yytU34p6d1mL2u3SnuBe8vKvLU8gKQe4C01PhdS\n9/A+Na6/wXDp2q1nNulF8l7AV4EPAb+s0Xo1M7OmFT/YKCJWk0bB7l06l/3bvTfw2yq33VlePrNv\ndp6IWERKhuUxNyK9+/xtWYyxknYqi7E3KQHfXbXCaVTxkzWuv8GIaJFGxJVlX/63pAeBPwJ7ArdU\nu+9bwIYV5z5KGgNtZjZ8zQT+s+Lcc4PwuY107Va7r6Zzgcsk3QPMJY3iHQNcBiBpBrAkIr6Wlb8A\nuFXSycB1pDExk4BjymKeD5wm6VFgMXAmsIQ0VYaIWChpDvB9Sf8EvAn4v8DMiFiafe6RwKu83or9\nJPA54Ohmnn5EJNJKEbFI0nJgIjUS6b8A21W7aGY2bE3mjeMp5wHva/PnNtK1W+2+6iLiymzO6DRS\n9+t9wP5l4142K//giLhT0uHAWdnxCHBwRDxUVuZsSWNI80LHArcDB0TEq2UffThwEWm0bj/p5W7l\n4qhfB7bIPn8h8OmI+Hnjzz5CE6mkzYBNaLL5bWZmQyMipgPTq1x7wwvWiJgFzKoTcyowtcb154Aj\nalyfAcyo9RmNGBaJNFuyaSKvb+CztaT3kIYpryCthjGL1Cc+Efg28AfSvCIzMytE27p2O9qwSKSk\n/opbSPOCgrSUFMDlpLmlO5AGG40FniAl0NOzl9hmZlaI9nTtdrphkUgj4tfUHkH8kcGqi5lZ93KL\nNI9hkUjNzGw4qL3cX+37upcTqZmZZdwizWOkLMhgZmY2LHV0i/QGYH6LMfYpcI+ZyvWu8trznQUF\nuqOgOJMKigOt/4WVHFS/SCM2WlDceLar371fIXF6ChrYsR0P1S/UgC/0/qCQOAD/8XDlFL+c3lVM\nGPYsKA7Az1pdiG0wFnLzYKM8OjqRmplZM9y1m4cTqZmZZdwizcOJ1MzMMm6R5uFEamZmGbdI8/Co\nXTMzsxa4RWpmZhl37ebhRGpmZhkn0jycSM3MLOMlAvNwIjUzs4xbpHl4sJGZmVkL3CI1M7OMp7/k\n4URqZmYZd+3m0dVduw8OdQW6yMxHh7oG3eWBmQuGugrd488zh7oGBSq1SJs9urtF2tWJtKiNRqw+\nJ9LB9cDMhUNdhe7xeCcl0lKLtNmju1uk7to1M7OM35Hm0dUtUjMzs1a5RWpmZhkPNsqjUxPpegAf\n/PGP2XbbbasWumXKFA4677xBq9QLBcWZV1CcwfT8ginMO3bwvtc8O3gf1ajNC/qL27yBMjc8/zs+\nOu/wYj5wEH2xqJ/urYoJw7/WLzJlyvOc968N1LuBWLUsWLCAI44Asn/f2mMp+ZLi8qIrMqIoIoa6\nDoWTdDjwk6Guh5lZG3w2Iq4oMqCkLYAFwJgWwqwCto2IPxdTq5GjUxPpJsD+wGLgr0NbGzOzQqwH\nbAnMiYhnig6eJdNxLYRY3o1JFDo0kZqZmQ0Wj9o1MzNrgROpmZlZC5xIzczMWuBEamZm1oKuTaSS\njpe0SNLLku6StPNQ16nTSDpDUn/F8dBQ16sTSPqApGsk/SX7vh40QJlpkp6QtErSDZImDkVdO0G9\n77ekSwf4Wf/lUNXXBldXJlJJhwHnAGcAOwH3A3MktTL02wY2H+gFxmfH+4e2Oh1jfeA+4EvAG4be\nSzoVOAE4FtgFeIn0M/6mwaxkB6n5/c7MZu2f9cmDUzUbap26slE9U4CLI2IGgKTjgH8AjgLOHsqK\ndaA1EfH0UFei00TE9cD1AJI0QJGTgDMj4tqszJHAMuAQ4MrBqmenaOD7DfCKf9a7U9e1SCWNBiYB\nN5XORZpMeyOw+1DVq4O9M+sO+6OkH0tqZIU7a4GkrUgtovKf8ZXA3fhnvJ32lLRM0kJJ0yW9Zagr\nZIOj6xIpaeWOHtJv5+WWkf7xseLcBXyOtMrUcaQVUG+TtP5QVqoLjCd1P/pnfPDMBo4E9gK+CnwI\n+GWN1qt1kG7t2rVBEBFzyr6cL2ku8BjwaeDSoamVWfEiory7/L8lPQj8EdgTuGVIKmWDphtbpMtJ\nu9D2VpzvJW19YG0SEc8DfwA8erS9lgLCP+NDJiIWkf6t8c96F+i6RBoRq4F7gL1L57Lul72B3w5V\nvbqBpA2AdwBPDnVdOln2j/hS1v4Z3wjYFf+MDwpJmwGb4J/1rtCtXbvnApdJugeYSxrFOwa4bCgr\n1WkkfQf4Bak7d1PgG6TNDmcOZb06QfaeeSKp5QmwtaT3ACsi4nHgfOA0SY+SdkE6E1gCXD0E1R3x\nan2/s+MMYBbpF5iJwLdJvS9z3hjNOk1XJtKIuDKbMzqN1N11H7C/h64XbjPgCtJv5k8DvwF2a8cW\nUF3ofaR3b5Ed52TnLweOioizJY0BLgbGArcDB0TEq0NR2Q5Q6/v9JWAH0mCjscATpAR6etYDZh3O\n26iZmZm1oOvekZqZmRXJidTMzKwFTqRmZmYtcCI1MzNrgROpmZlZC5xIzczMWuBEamZm1gInUjMz\nsxY4kZqZmbXAidTMzKwFTqRmZmYtcCI1a5KkcZKelPQvZef2kPSKpA8PZd3MbPB50XqzHCQdAFwF\n7E7aLus+4OcRccqQVszMBp0TqVlOkv4vsC/we+DdwM7eNsus+ziRmuUkaT1gPmnf1fdGxENDXCUz\nGwJ+R2qW30RgAun/o62GuC5mNkTcIjXLQdJoYC5wL/AwMAV4d0QsH9KKmdmgcyI1y0HSd4BPADsA\nq4BbgZUR8bGhrJeZDT537Zo1SdKHgBOBIyLipUi/jR4JvF/SF4e2dmY22NwiNTMza4FbpGZmZi1w\nIjUzM2uBE6mZmVkLnEjNzMxa4ERqZmbWAidSMzOzFjiRmpmZtcCJ1MzMrAVOpGZmZi1wIjUzM2uB\nE6mZmVkLnEjNzMxa8P8BkFEtrpI/UtsAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1120,9 +1091,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1150,14 +1119,25 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1175,144 +1155,144 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
10000U235scatter-Y0,03.87e-028.61e-043.86e-026.85e-04
110000U235scatter-Y1,-16.88e-043.63e-046.95e-043.15e-04
210000U235scatter-Y1,0-3.38e-044.37e-04-1.06e-043.79e-04
310000U235scatter-Y1,1-4.27e-043.74e-04-3.63e-043.18e-04
410000U235scatter-Y2,-21.88e-041.86e-041.20e-041.59e-04
510000U235scatter-Y2,-18.96e-052.02e-043.93e-051.86e-04
610000U235scatter-Y2,04.03e-042.04e-041.81e-041.85e-04
710000U235scatter-Y2,11.48e-042.24e-041.24e-041.81e-04
810000U235scatter-Y2,21.11e-042.01e-042.06e-042.26e-04
910000U238scatter-Y0,02.34e+001.08e-022.33e+001.10e-02
1010000U238scatter-Y1,-12.93e-022.81e-032.90e-022.33e-03
1110000U238scatter-Y1,04.25e-031.83e-033.45e-032.38e-03
1210000U238scatter-Y1,1-2.60e-023.28e-03-2.72e-022.76e-03
1310000U238scatter-Y2,-2-1.10e-031.58e-03-2.02e-031.44e-03
1410000U238scatter-Y2,-1-4.81e-041.67e-038.07e-061.49e-03
1510000U238scatter-Y2,0-7.95e-041.53e-03-3.74e-071.79e-03
1610000U238scatter-Y2,11.06e-031.96e-036.54e-041.49e-03
1710000U238scatter-Y2,2-7.65e-041.67e-03-1.93e-031.36e-03
\n", @@ -1320,24 +1300,24 @@ ], "text/plain": [ " cell nuclide score mean std. dev.\n", - "0 10000 U235 scatter-Y0,0 3.87e-02 8.61e-04\n", - "1 10000 U235 scatter-Y1,-1 6.88e-04 3.63e-04\n", - "2 10000 U235 scatter-Y1,0 -3.38e-04 4.37e-04\n", - "3 10000 U235 scatter-Y1,1 -4.27e-04 3.74e-04\n", - "4 10000 U235 scatter-Y2,-2 1.88e-04 1.86e-04\n", - "5 10000 U235 scatter-Y2,-1 8.96e-05 2.02e-04\n", - "6 10000 U235 scatter-Y2,0 4.03e-04 2.04e-04\n", - "7 10000 U235 scatter-Y2,1 1.48e-04 2.24e-04\n", - "8 10000 U235 scatter-Y2,2 1.11e-04 2.01e-04\n", - "9 10000 U238 scatter-Y0,0 2.34e+00 1.08e-02\n", - "10 10000 U238 scatter-Y1,-1 2.93e-02 2.81e-03\n", - "11 10000 U238 scatter-Y1,0 4.25e-03 1.83e-03\n", - "12 10000 U238 scatter-Y1,1 -2.60e-02 3.28e-03\n", - "13 10000 U238 scatter-Y2,-2 -1.10e-03 1.58e-03\n", - "14 10000 U238 scatter-Y2,-1 -4.81e-04 1.67e-03\n", - "15 10000 U238 scatter-Y2,0 -7.95e-04 1.53e-03\n", - "16 10000 U238 scatter-Y2,1 1.06e-03 1.96e-03\n", - "17 10000 U238 scatter-Y2,2 -7.65e-04 1.67e-03" + "0 10000 U235 scatter-Y0,0 3.86e-02 6.85e-04\n", + "1 10000 U235 scatter-Y1,-1 6.95e-04 3.15e-04\n", + "2 10000 U235 scatter-Y1,0 -1.06e-04 3.79e-04\n", + "3 10000 U235 scatter-Y1,1 -3.63e-04 3.18e-04\n", + "4 10000 U235 scatter-Y2,-2 1.20e-04 1.59e-04\n", + "5 10000 U235 scatter-Y2,-1 3.93e-05 1.86e-04\n", + "6 10000 U235 scatter-Y2,0 1.81e-04 1.85e-04\n", + "7 10000 U235 scatter-Y2,1 1.24e-04 1.81e-04\n", + "8 10000 U235 scatter-Y2,2 2.06e-04 2.26e-04\n", + "9 10000 U238 scatter-Y0,0 2.33e+00 1.10e-02\n", + "10 10000 U238 scatter-Y1,-1 2.90e-02 2.33e-03\n", + "11 10000 U238 scatter-Y1,0 3.45e-03 2.38e-03\n", + "12 10000 U238 scatter-Y1,1 -2.72e-02 2.76e-03\n", + "13 10000 U238 scatter-Y2,-2 -2.02e-03 1.44e-03\n", + "14 10000 U238 scatter-Y2,-1 8.07e-06 1.49e-03\n", + "15 10000 U238 scatter-Y2,0 -3.74e-07 1.79e-03\n", + "16 10000 U238 scatter-Y2,1 6.54e-04 1.49e-03\n", + "17 10000 U238 scatter-Y2,2 -1.93e-03 1.36e-03" ] }, "execution_count": 26, @@ -1363,16 +1343,14 @@ { "cell_type": "code", "execution_count": 27, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.0016699 0.01076055]\n", - " [ 0.00020076 0.00086098]]]\n" + "[[[ 0.00136183 0.01104314]\n", + " [ 0.00022601 0.00068479]]]\n" ] } ], @@ -1394,9 +1372,7 @@ { "cell_type": "code", "execution_count": 28, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1431,15 +1407,31 @@ { "cell_type": "code", "execution_count": 29, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.04126529]]]\n" + "[[[ 0.03500496]]\n", + "\n", + " [[ 0.03004793]]\n", + "\n", + " [[ 0.02536586]]\n", + "\n", + " [[ 0.03403647]]\n", + "\n", + " [[ 0.02498 ]]\n", + "\n", + " [[ 0.01892844]]\n", + "\n", + " [[ 0.02662923]]\n", + "\n", + " [[ 0.02875671]]\n", + "\n", + " [[ 0.01945598]]\n", + "\n", + " [[ 0.02612378]]]\n" ] } ], @@ -1447,7 +1439,7 @@ "# Get the relative error for the scattering reaction rates in\n", "# the first 10 distribcell instances \n", "data = tally.get_values(scores=['scatter'], filters=[openmc.DistribcellFilter],\n", - " filter_bins=[(i,) for i in range(10)], value='rel_err')\n", + " filter_bins=[tuple(range(10))], value='rel_err')\n", "print(data)" ] }, @@ -1461,14 +1453,25 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1520,8 +1523,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1534,8 +1537,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1548,8 +1551,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1562,8 +1565,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1576,8 +1579,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1590,8 +1593,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1604,8 +1607,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1618,8 +1621,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1633,7 +1636,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1647,7 +1650,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1660,8 +1663,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1674,8 +1677,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1688,8 +1691,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1702,8 +1705,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1716,8 +1719,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1730,8 +1733,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1744,8 +1747,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1758,8 +1761,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1773,7 +1776,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1786,8 +1789,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
10002279absorption7.37e-057.77e-067.77e-057.87e-06
55910002279scatter1.27e-026.76e-041.28e-025.09e-04
56010002280absorption9.14e-059.21e-068.92e-057.32e-06
56110002280scatter1.39e-025.27e-041.37e-024.99e-04
56210002281absorption8.98e-058.99e-069.50e-057.80e-06
56310002281scatter1.47e-026.07e-041.49e-024.74e-04
56410002282absorption1.13e-041.28e-051.15e-041.00e-05
56510002282scatter1.54e-026.58e-041.58e-026.18e-04
566283absorption1.13e-049.64e-061.01e-05
567283scatter1.75e-025.84e-045.66e-04
56810002284absorption1.10e-041.12e-051.08e-049.66e-06
56910002284scatter1.72e-027.15e-041.73e-025.40e-04
57010002285absorption1.27e-041.92e-051.16e-041.44e-05
57110002285scatter1.75e-028.93e-041.70e-026.90e-04
57210002286absorption1.24e-041.26e-051.16e-041.02e-05
57310002286scatter1.78e-029.03e-041.77e-026.80e-04
57410002287absorption1.24e-041.64e-051.20e-041.36e-05
57510002287scatter1.85e-021.01e-031.80e-027.80e-04
576288absorption1.32e-041.37e-051.30e-05
57710002288scatter1.87e-028.24e-041.86e-027.12e-04
\n", @@ -1821,26 +1824,26 @@ " mean std. dev. \n", " \n", " \n", - "558 7.37e-05 7.77e-06 \n", - "559 1.27e-02 6.76e-04 \n", - "560 9.14e-05 9.21e-06 \n", - "561 1.39e-02 5.27e-04 \n", - "562 8.98e-05 8.99e-06 \n", - "563 1.47e-02 6.07e-04 \n", - "564 1.13e-04 1.28e-05 \n", - "565 1.54e-02 6.58e-04 \n", - "566 1.13e-04 9.64e-06 \n", - "567 1.75e-02 5.84e-04 \n", - "568 1.10e-04 1.12e-05 \n", - "569 1.72e-02 7.15e-04 \n", - "570 1.27e-04 1.92e-05 \n", - "571 1.75e-02 8.93e-04 \n", - "572 1.24e-04 1.26e-05 \n", - "573 1.78e-02 9.03e-04 \n", - "574 1.24e-04 1.64e-05 \n", - "575 1.85e-02 1.01e-03 \n", - "576 1.32e-04 1.37e-05 \n", - "577 1.87e-02 8.24e-04 " + "558 7.77e-05 7.87e-06 \n", + "559 1.28e-02 5.09e-04 \n", + "560 8.92e-05 7.32e-06 \n", + "561 1.37e-02 4.99e-04 \n", + "562 9.50e-05 7.80e-06 \n", + "563 1.49e-02 4.74e-04 \n", + "564 1.15e-04 1.00e-05 \n", + "565 1.58e-02 6.18e-04 \n", + "566 1.13e-04 1.01e-05 \n", + "567 1.75e-02 5.66e-04 \n", + "568 1.08e-04 9.66e-06 \n", + "569 1.73e-02 5.40e-04 \n", + "570 1.16e-04 1.44e-05 \n", + "571 1.70e-02 6.90e-04 \n", + "572 1.16e-04 1.02e-05 \n", + "573 1.77e-02 6.80e-04 \n", + "574 1.20e-04 1.36e-05 \n", + "575 1.80e-02 7.80e-04 \n", + "576 1.32e-04 1.30e-05 \n", + "577 1.86e-02 7.12e-04 " ] }, "execution_count": 30, @@ -1859,14 +1862,25 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1893,38 +1907,38 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
mean4.19e-042.40e-054.17e-042.05e-05
std2.42e-041.03e-058.32e-06
min2.31e-054.39e-062.27e-054.04e-06
25%2.03e-041.64e-052.01e-041.40e-05
50%4.01e-042.39e-054.00e-042.05e-05
75%6.17e-043.02e-056.08e-042.60e-05
max9.28e-045.88e-059.38e-044.27e-05
\n", @@ -1935,13 +1949,13 @@ " \n", " \n", "count 2.89e+02 2.89e+02\n", - "mean 4.19e-04 2.40e-05\n", - "std 2.42e-04 1.03e-05\n", - "min 2.31e-05 4.39e-06\n", - "25% 2.03e-04 1.64e-05\n", - "50% 4.01e-04 2.39e-05\n", - "75% 6.17e-04 3.02e-05\n", - "max 9.28e-04 5.88e-05" + "mean 4.17e-04 2.05e-05\n", + "std 2.42e-04 8.32e-06\n", + "min 2.27e-05 4.04e-06\n", + "25% 2.01e-04 1.40e-05\n", + "50% 4.00e-04 2.05e-05\n", + "75% 6.08e-04 2.60e-05\n", + "max 9.38e-04 4.27e-05" ] }, "execution_count": 31, @@ -1968,15 +1982,13 @@ { "cell_type": "code", "execution_count": 32, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 0.7108210033985298\n" + "Mann-Whitney Test p-value: 0.3933685843661936\n" ] } ], @@ -2006,15 +2018,13 @@ { "cell_type": "code", "execution_count": 33, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 7.454144155212731e-42\n" + "Mann-Whitney Test p-value: 7.927841393301949e-42\n" ] } ], @@ -2042,25 +2052,24 @@ { "cell_type": "code", "execution_count": 34, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/ipykernel/__main__.py:4: SettingWithCopyWarning: \n", + "/home/johnny/miniconda3/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", - "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n" + "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", + " after removing the cwd from sys.path.\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 34, @@ -2069,9 +2078,9 @@ }, { "data": { - "image/png": "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\nUPj1vgRTmxvBNPcvNLPXEEw9v8ODqc5/Er2AmT0J7HT3B6qU43cARxxxBL29vU28vfYzbdq03N8j\n6D7zRveZP1PlXqfKfYZa2t2j40KOu381XJDuMoJmqnsJVvf9VXjIi4BnIm95AfAjSmvuXBhuGwjW\nfEm8TLPLLSIiIhOr40IOgLtfA1yT8lp/7OufU+d8QPFziIiISOfpxMkARURERDIp5EimwcHByS7C\nhNB95ovuM3+myr1OlfucCFqFvEFm1guMjIyMTKUOYiIiIuO2ZcsW+vr6APrcfUurrqOaHBEREckl\nhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWF\nHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUc\nERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcmljgw5\nZnaemT1kZk+b2UYzW1Dl2HlmdnN4/B4zW55wzAfNbJOZ/beZPW5m3zCzOa29CxEREWmljgs5ZnYG\n8EngI8DRwH3AsJkdmvKWA4AdwAeA/0o5ZiHwT8CxwBJgX2CdmT27iUUXERGRCbTPZBegASuA69z9\nRgAzOwc4DXgX8I/xg939h8APw2M/nnRCd18a/drM/hL4JdAHfL+JZRcREZEJ0lE1OWa2L0HwuK24\nz90dWA8c38RLTQccGG3iOUVERGQCdVTIAQ4FuoHHY/sfBw5rxgXMzIBPA993958045wiIiIy8Tqx\nuarVrgHmAa+t5eAVK1Ywbdq0sn2Dg4MMDg62oGgiIiKdZWhoiKGhobJ9u3fvnpBrd1rIeQIYA2bG\n9s8EHhvvyc3sM8BSYKG7p3VSLnPllVfS29s73kuLiIjkUtIf/lu2bKGvr6/l1+6o5ip3/yMwAry+\nuC9sXno9cNd4zh0GnNOBk9z94fGcS0RERCZfp9XkAHwKuMHMRoBNBKOtDgBuADCzG4FH3f1D4df7\nEjQ/GbAf8EIzew3wW3ffER5zDTAIvAl40syKNUW73f13E3VjIiIi0jwdF3Lc/avhnDiXETRT3QsM\nuPuvwkNeBDwTecsLgB8RjJYCuDDcNgD94b5zwtfviF3uncCNTb4FERERmQAdF3IA3P0agg7CSa/1\nx77+ORnNcu7eUc12IiIikk0PdxEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERER\nySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJ\nJYUcERERySWFHBEREcklhRwRERHJJYUcERERySWFHBEREcklhRwRERHJpX0muwCSD4VCgR07djBr\n1ixmz5492cURERFRTY6Mz+joKKecchpz585l6dKlzJkzh1NOOY1du3ZNdtFERGSKU8iRcTnzzGWs\nX78RWAU8DKxi/fqNDA6eNcklExGRqU7NVdKwQqHA8PAagoDz9nDv2xkbc4aHl7Ft2zY1XYmIyKRR\nTY40bMeOHeF/LYq9shiA7du3T2h5REREohRypGGHH354+F/fi72yAYBZs2ZNaHlERESiFHKkYXPm\nzGFgYCnd3csJmqweAVbR3X0BAwNL1VQlIiKTqiNDjpmdZ2YPmdnTZrbRzBZUOXaemd0cHr/HzJaP\n95xSMjS0iiVLjgOWAS8BlrFkyXEMDa2a5JKJiMhU13Edj83sDOCTwNnAJmAFMGxmc9z9iYS3HADs\nAL4KXNmkc0qop6eHtWtvYdu2bWzfvl3z5IiISNvoxJqcFcB17n6ju/8UOAd4CnhX0sHu/kN3/4C7\nfxX4QzPOKZVmz57NqaeeqoAjIiJto6NCjpntC/QBtxX3ubsD64Hj2+WcIiIiMvk6KuQAhwLdwOOx\n/Y8Dh7XROUVERGSSdVrIEREREalJp3U8fgIYA2bG9s8EHpuMc65YsYJp06aV7RscHGRwcLDB4oiI\niOTH0NAQQ0NDZft27949Ide2oPtJ5zCzjcA97n5B+LURLJp0tbtfkfHeh4Ar3f3q8Z7TzHqBkZGR\nEXp7e8d7WyIiIlPGli1b6OvrA+hz9y2tuk6n1eQAfAq4wcxGKA33PgC4AcDMbgQedfcPhV/vC8wD\nDNgPeKGZvQb4rbvvqOWc0hyFQoEdO3ZomLmIiEyIjgs57v5VMzsUuIygSeleYMDdfxUe8iLgmchb\nXgD8CChWWV0YbhuA/hrPKeMwOjrKmWcuCxfzDAwMLGVoaBU9PT2TWDIREcmzjgs5AO5+DXBNymv9\nsa9/Tg0drKudU8bnzDOXsX79RoKlHxYB32P9+uUMDp7F2rW3THLpREQkrzoy5EjnKBQKYQ3OKuDt\n4d63MzbmDA8vY9u2bWq6EhGRltAQcmmpHTuK3Z4WxV5ZDMD27dsntDwiIjJ1KORISx1++OHhf30v\n9soGAGbNmjWh5RERkalDIUdaas6cOQwMLKW7ezlBk9UjwCq6uy9gYGCpmqpERKRlFHKk5YaGVrFk\nyXHAMuAlwDKWLDmOoaFVk1wyERHJM3U8lpbr6elh7dpb2LZtG9u3b9c8OSIiMiEUcmTCzJ49W+FG\nREQmjJqrREREJJcUckRERCSXFHJEREQklxRyREREJJcUckRERCSXFHJEREQklxRyREREJJcUckRE\nRCSXFHJEREQklxRyREREJJcUckRERCSXFHJEREQklxRyREREJJcUckRERCSXFHJEREQklxRyRERE\nJJcUckRERCSXFHJEREQklxRyREREJJcUckRERCSX9pnsAojEFQoFduzYwaxZs5g9e/ZkF0dERDpU\nR9bkmNl5ZvaQmT1tZhvNbEHG8W81swfC4+8zs1Njrz/HzD5jZo+Y2VNm9mMz+9+tvQuJGx0d5ZRT\nTmPu3LksXbqUOXPmcMopp7Fr167JLpqIiHSgjgs5ZnYG8EngI8DRwH3AsJkdmnL8CcBNwErgKOBb\nwDfNbF7ksCuBPwXOBF4BfBr4jJm9oVX3IZXOPHMZ69dvBFYBDwOrWL9+I4ODZ01yyUREpBN1XMgB\nVgDXufuN7v5T4BzgKeBdKccvB25190+5+1Z3/zCwBTg/cszxwJfc/U53f9jdVxKEp2NadxsSVSgU\nGB5ew9jY1cDbgRcDb2ds7CqGh9ewbdu2SS6hiIh0mo4KOWa2L9AH3Fbc5+4OrCcIKkmOD1+PGo4d\nfxfwJjN7QXidk4DZ4XEyAXbs2BH+16LYK4sB2L59+4SWR0REOl9HhRzgUKAbeDy2/3HgsJT3HFbD\n8e8DHgAeNbM/AGuA89z9B+MusdTk8MMPD//re7FXNgAwa9asCS2PiIh0vk4LOa2yHDgWeAPQC/w1\ncI2Z9U9qqaaQOXPmMDCwlO7u5QR9ch4BVtHdfQEDA0s1ykpEROrWaUPInwDGgJmx/TOBx1Le81i1\n483sWcDfA6e7+9rw9f8ws6OBC4HbqxVoxYoVTJs2rWzf4OAgg4OD1e9EKgwNrWJw8CyGh5ft3bdk\nyVKGhlZNYqlERGQ8hoaGGBoaKtu3e/fuCbm2BV1aOoeZbQTucfcLwq+NYCjO1e5+RcLxXwGe7e6n\n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\n3c8Nv/5P4Ap3vzL8+mCCwPMOd/9aSjl6gZGRkRF6e3ubeo8iIiJ5tmXLFvr6+gD63H1Lq67TaTU5\nAJ8CbjCzEWATwWirA4AbAMzsRuBRd/9QePxVwB1m9n7gFmCQoPPyeyLn/DTwt2a2HfgZcDnwKMFw\ncxEREelAHRdy3P2r4Zw4lxE0Kd0LDLj7r8JDXgQ8Ezn+bjM7E/j7cNsGnO7uP4kc849mdgBwHTAd\nuBM41d3/MBH3JCIiIs3XcSEHwN2vAa5Jea0/Yd/Xga9nnPMS4JImFE9ERETagEZXiYiISC4p5IiI\niEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiI\nSC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhI\nLinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEguKeSIiIhILinkiIiISC4p5IiIiEgu\nKeSIiIhILinkiIiISC51VMgxsx4z+2cz221mu8zs/5nZczLes7+ZfdbMnjCz35jZzWb2vMjrR5rZ\nTWb2sJk9ZWY/NrPlrb+bzjE0NDTZRZgQus980X3mz1S516lynxOho0IOcBNwBPB64DRgEXBdxns+\nHR77lvD4FwD/Enm9D3gceDswD/h74GNmdm5TS97Bpsr/cLrPfNF95s9Uudepcp8TYZ/JLkCtzOwV\nwADQ5+4/Cve9D7jFzC5098cS3nMw8C7gL9x9Q7jvncADZnaMu29y9y/G3vYzMzsBeDNwTQtvSURE\nRFqok2pyjgd2FQNOaD3gwLEp7+kjCHK3FXe4+1bg4fB8aaYBo+MqrYiIiEyqjqnJAQ4Dfhnd4e5j\nZjYavpb2nj+4+3/H9j+e9p6wFudtwNLxFVdEREQm06SHHDP7GPCBKoc4QT+ciSjLq4BvApe4+20Z\nhz8L4IEHHmh5uSbb7t272bJly2QXo+V0n/mi+8yfqXKvU+E+I8/OZ7XyOuburTx/dgHMZgAzMg57\nEFgGfMLd9x5rZt3A74D/4e7fSjj3SQRNWj3R2hwz+xlwpbtfFdk3D7gd+Ly7f7iGcp8J/HPWcSIi\nIpLq7e5+U6tOPuk1Oe6+E9iZdZyZ3Q1MN7OjI/1yXg8YcE/K20aAZ8LjvhGeZy7wEuDuyLlfSdBv\n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\nRK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2091,14 +2100,12 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 35, @@ -2107,9 +2114,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiAAAAGHCAYAAACJeOnXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl8VNX9//HXJ2EJYRWiiGBYZBcRQVFRFEEFtSqtW6MI\notS6FPyh1dZqVWjdv4ptLda2VFwgrVJFURAFFDcqSEBQQ2SPshp2EsKSnN8fd8BJSEIymZk7M3k/\nH4/7CDn3zr2fuQTynnvPPcecc4iIiIhEU5LfBYiIiEjNowAiIiIiUacAIiIiIlGnACIiIiJRpwAi\nIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiEWFmD5lZsd91iEhsUgARiSIzO8nM\nppjZGjPbY2bfm9l7ZvarCB4zw8zuKKO9hZk9aGbdI3RoB/gSQMzsBTMrDloKzSzHzMaYWd1q7Pde\nM7s8nLWK1FSmuWBEosPM+gBzgLXAi8BG4HjgDOAE51zHCB13GnCic65dqfZewALgBufcSxE4bhJQ\nyzm3L9z7rsSxXwCuAW4CDGgMXA5cCExyzl0f4n53Aa85524MV60iNVUtvwsQqUHuA7YDpzrndgWv\nMLM0H+qxiOzULNU5V+CcKwaiHj6CHHDOZQZ9/5yZfQZkmNmdzrkf/CpMRHQLRiSa2gFflw4fAM65\nvNJtZjbEzD43s3wz22pmc83s/KD1l5nZ22a2LnCLYYWZ3R+48nBwmw+AS4DWQbcjVpnZucB8vNsk\nEwPtRWY2NOi1p5vZu2a2PVDDh4GrOME1PhR4bRczm2xmW4GPg9eV2r7YzP5sZpeb2dJA3V+Z2cAy\n3n8/M/sicKtquZndHIZ+JZ/gBa/SV4N+bWafmlmemRUEjntF6dqBVOCGoHP5r6D1x5nZv8xsY9D7\nGl7G+xoZWHfw73WBmf28Gu9JJC7pCohI9KwFzjCzE51zX1e0oZk9CDwIfAr8Hu9KwulAf2BWYLMb\ngF3AU8DuwLqxQEPgN4Ft/oh3+6El8P/wfvnuBr4BHghs/zyB0AB8Fjh+f2A68AXwEF5fjuHAHDM7\n2zn3RWD7g/dwXwO+Be7lxysrLmh9sL7Az4DxgfpHAVPMLN05ty1w/FOAGcD6wPuvFfiaV84+K6tt\n4Ou2Uu2jgDeBV4A6wM+BV83sJ865GYFthgATgM+BvwfaVgbqPSbQXgT8OVDnRcAEM2vonPtzYLtf\nAH8CXgWeAVKA7nh/t/+uxvsSiT/OOS1atERhAc7HCxL78YLFY8AFeP0kgrc7ATiA19egov3VLaPt\nObxf6rWD2qYBq8rYthdesBhaxroc4J3Sx8P7hftuUNuDgX28XMY+HgSKSrUVA3uANkFtJwXabwtq\neyvwPpoHtbULnL+i0scq49gvADuBZoGlHXAXXkBYfKRzCSQDS4D3S7XvAv5Vxuv/CXwPNCnVPhnY\nenD/wBvAEr9/FrVoiYVFt2BEosQ5Nws4E++TdnfgbmAmsM7MLg3a9Kd4VxHGHmF/ew/+2cwamFkz\nvFsMqUDnUOs0sx5AByDTzJodXPCurMwGzildCt5VlMp63zm35tCLnVuKFxbaBY6fBAwApjrnNgVt\ntwrvqkhlNQB+CCwrgCfxzs/g0huWOpdNgKPwrgr1rOSxfoYX9JJLnbP3gCZB+9kOtDKzU6vwPkQS\nkm7BiESRc24hcKWZ1QJOxgsbo4HXzKyHc24Z3i/iYiC7on2ZWVfgYeA8oFHwYfBuu4SqQ+BreU/G\nFJtZY+fcjqC21VXY/3dltG3D+6UPcAxQDy80lFZWW3n2AD/BC3OtgHsC+95TekMz+wleJ+EeeFd6\nDjpifxMzOxovZNwM/LKMTVzguACP44Wr+Wa2Ai+gTHbOfVa5tySSOBRARHzgnDsALAQWmtlyvFsG\nVwF/qMzrzawx8BHeJ+r7gVVAId5tlceoXgfzg6+9C/iynG12l/r+sF/qFSgqpz3cT+UUOec+OLRz\ns/eAZXhXawYHtffFuyr1IXArsAHvNtmNQEYljnPwfL2C93h1WZYAOOeWmVknvGA0CO/KyW1mNsY5\nN6bS70wkASiAiPjvYIfOFoGvK/F+qXUl8IurDP3wrhhc7pz79GCjmZ1Qxrblddosr31l4Osu59yc\ncraJpM14Yap9Ges6lNFWKc65jWY2DnjAzHo75+YHVv0ML0ANDARDAMzsprJ2U0bbD3h9Q5Irc76c\nc3vwOu2+FrgS9gZwn5k96nwYM0XEL+oDIhIlZtavnFWXBL4uC3ydiveL7gEzK++qQBHeFYPgR27r\nALeVsW0+Zd+SyQ98bVKqfSFeCPm1mdUv/aJIj1nivPFDZgGDzezYoOO2x7tqUB1/wQsbvw1qK8I7\n34c+kJlZG7yBy0rLp9T5CtT7X+AKMzux9AuCz5eZNS312gN4t9oMqF2ldyIS53QFRCR6/mJmqXif\neJfhPe55FnA13i2UiQDOuZVm9jDerZWPzex1YC9wGrDOOXcf3uOy24CXzOzPgf0PoexP6AuBq83s\nKbyRT3c7597GCxnbgVvMbDfeL9fPnXNrzGwE3mO4X5s3qug6vEd5zwN2UPYv53B6CG/U0s/M7Dm8\n/6tuB5bi9dMIiXNua+D93GpmnZxzOcA7wJ3ATDObDDTHC3LL8ToLB1sInG9mo/EeEV4duJLyW7yr\nUp+b2T/wHnNuindLrD9wMIS8Z2Yb8Z6C2oR3let24G3nXD4iNYnfj+Fo0VJTFrxfqP8Avsb7Jb4H\n73HXcUBaGdsPw7s9U4A3rsQcoH/Q+jPwfpHtxuvY+Qjeo75FwDlB26UCLwNbAutWBa37Cd4v9b2B\ndUOD1nXHu1WwOVDDKiAT6Be0zYOB1zUto/4H8UYjDW4rAv5UxrargAml2voF3v8evDFGhuM9yZJf\niXP9ArCjnHVt8R7n/VdQ2w14obAg8PczlLIfI+4IfBA450Wl9pGGNwbIGrxbSOvwOpneGLTNiMDr\nD57Tb4FHgQZ+/3xq0RLtRXPBiEjcMLM3gK7OuU5+1yIi1eN7HxDzZpecb2Y7zWyTmb1hZh1LbfOh\nlZzZssjMxvtVs4hEnpmllPq+A3Ax3hUEEYlzvl8BMbPpeJd1v8C7z/so0A3o4rze4gfns8jBG4r5\nYKe8Audc6UcBRSRBmNl6vH4xq4A2wC14HTV7OudWlv9KEYkHvndCdc5dHPy9md2Ad3+0F96ohQcV\nOM1eKVKTzMCbk+VYvD4qnwG/U/gQSQy+XwEpLfCoXQ5wknPum0DbB3i9xZOAjXhDHv/h4BUSERER\niS8xFUACYx5MAxo6584Nah+BN5Poerye+U/gPS54pS+FioiISLXEWgB5DhgInOWc21DBdufhDVTU\n3jl32BwUgUmgBvLj43AiIiJSOSl4/a5mOue2ROogvvcBOcjMnsXr4d63ovAR8DleZ9T2lD0J1kBg\nUngrFBERqVGuAyZHaucxEUAC4eNy4FznXG4lXnIK3oiP5QWVNQCvvPIKXbp0CUuNNcXo0aMZN26c\n32XEFZ2z0Oi8VZ3OWWh03qomOzubIUOGQOB3aaT4HkAC43lkAJcB+WbWPLBqh3Ou0MzaAdfiDQu9\nBW8K86eBuc65r8rZbSFAly5d6NmzZ0TrTzSNGzfWOasinbPQ6LxVnc5ZaHTeQhbRLgy+BxC8Z/sd\n3lTYwYYDL+ENmXw+cAdQH2/I6deAh6NXooiIiIST7wHEOVfhaKzOue/x5oQQERGRBOH7UOwiIiJS\n8yiASAkZGRl+lxB3dM5Co/NWdTpnodF5i00xNQ5IuJhZT2DhwoUL1fFIRBJKbm4ueXl5fpchcS4t\nLY309PQy12VlZdGrVy+AXs65rEjV4HsfEBERqZzc3Fy6dOlCQUGB36VInEtNTSU7O7vcEBINCiAi\nInEiLy+PgoICjXEk1XJwnI+8vDwFEBERqTyNcSSJQJ1QRUREJOoUQERERCTqFEBEREQk6hRARERE\nJOoUQERERCTqFEBERCQmvPjiiyQlJZGVVXLsq507d9K7d29SU1N57733GDNmDElJSYeW+vXr07p1\nay677DImTpzIvn37Dtv38OHDS7wmeElNTY3WW5QgegxXRERihpmV+H7Xrl1ccMEFfPXVV0ydOpUL\nL7yQefPmYWb87W9/o379+uzdu5d169Yxc+ZMbrzxRp555hneeecdWrZsWWJfKSkpTJgwgdIjgCcn\nJ0f8fcnhFEBERCQm7d69mwsvvJAlS5bwxhtvcOGFF5ZYf8UVV9C0adND399///1kZmZy/fXXc9VV\nV/HZZ5+V2L5WrVqaFyaG6BaMiIjEnPz8fAYOHMjixYt5/fXXGTRoUKVel5GRwYgRI/j888+ZPXt2\nhKuU6lAAERGRmLJ7924GDRrEwoULmTJlChdddFGVXn/99dfjnOO99947bN2WLVsOW3bt2hWu0qUK\ndAtGRERihnOOYcOGsWHDBqZMmcIll1xS5X1069YNgJUrV5Zo3717N0cfffRh2w8aNIjp06eHVrCE\nTAFERCQBFewvYFnesogfp3NaZ1Jrh/cpks2bN5OSkkKrVq1Cen2DBg0ADruyUa9ePd5+++3DOqGm\npaWFVqhUiwKISJzIzc0lLy/vsPa0tDRfZ7SU2LQsbxm9/t4r4sdZePNCerYI38R4Zsbzzz/P6NGj\nGThwIJ988gkdOnSo0j52794NQMOGDUu0Jycnc95554WtVqkeBRCROJCbm0unTl0oLCw4bF1KSio5\nOdkKIVJC57TOLLx5YVSOE25du3ZlxowZ9O/fnwsuuIBPP/30sEdqK/LVV18B0L59+7DXJuGjACIS\nB/Ly8gLh4xWgS9CabAoLh5CXl6cAIiWk1k4N65WJaDv11FOZOnUql1xyCRdccAEff/wxzZo1q9Rr\nX3rpJcyMgQMHRrhKqQ49BSMSV7oAPYOWLhVvLhLH+vfvT2ZmJsuXL2fQoEGHbq1UZPLkyUyYMIE+\nffrodkuM0xUQERGJGaU7iA4ePJh//OMf3HjjjVx22WXMmDHj0HavvfYaDRo0YN++fYdGQv300085\n5ZRTePXVVw/b94EDB5g0aVKZx/3Zz35GvXr1wv+GpFwKICIiEjNKD8UOcMMNN7B161buvvturr76\nak4++WTMjNtuuw3whlhPS0ujR48eTJw4kYyMDGrXrn3Yfvbu3cvQoUPLPG7fvn11GzPKFEBERCQm\nDBs2jGHDhpW57s477+TOO+889P3YsWOrtO8XXniBF154oVr1SXipD4iIiIhEnQKIiIiIRJ0CiIiI\niESdAoiIiIhEnQKIiIiIRJ0CiIiIiESdAoiIiIhEnQKIiIiIRJ0CiIiIiESdAoiIiIhEnQKIiIiI\nRJ0CiIiIxKU2bdpw4403+l2GhEiT0YmIJIDc3Fzy8vL8LoO0tLSQZ5V98cUXGT58OF988QU9e/Y8\nbH2/fv3YunUrS5YsASApKanM2XMrMmPGDObPn8+DDz4YUo0SPgogIiJxLjc3l06dulBYWOB3KaSk\npJKTkx1yCKkoUJRel5OTQ1JS1S7kT58+nfHjxyuAxAAFEBGROJeXlxcIH68AXXysJJvCwiHk5eWF\nHECqonbt2lV+jXMuApVUXkFBAampqb7WECvUB0REJGF0AXr6uEQ3/JTuA3LgwAHGjBlDx44dqVev\nHmlpafTt25fZs2cDMHz4cMaPHw94t2+SkpJITk4+9PqCggLuuusu0tPTSUlJoXPnzjz11FOHHbew\nsJBRo0Zx9NFH06hRIwYPHsz69etJSkpi7Nixh7Z76KGHSEpKIjs7m2uvvZamTZvSt29fAJYuXcrw\n4cM54YQTqFevHi1atOCmm25i69atJY51cB/Lly9nyJAhNGnShGOOOYYHHngAgO+++47BgwfTuHFj\nWrRowdNPPx2msxt5ugIiIiIxZceOHWzZsqVEm3OO/fv3l2grfUvmwQcf5LHHHuPmm2/mtNNOY+fO\nnXzxxRdkZWUxYMAAbrnlFtavX8+sWbOYNGnSYVdDLr30UubOncuIESM4+eSTmTlzJnfffTfr168v\nEUSGDRvGlClTGDp0KKeffjpz587lkksuOayeg99fddVVdOzYkUcfffTQMd9//31Wr17NjTfeyLHH\nHsvXX3/N888/zzfffMO8efMO28c111xD165defzxx3nnnXd4+OGHadq0Kc8//zwDBgzgiSeeYNKk\nSdx999307t2bs88+O5RTH13OuYRb8KK4W7hwoRNJBAsXLnSAg4UOXNDitetnvWY4+HNQ+u+7/J+P\naC/V+3mcOHGiM7MKl5NOOunQ9m3atHHDhw8/9H2PHj3cpZdeWuExfvWrX7mkpKTD2qdOnerMzD36\n6KMl2q+66iqXnJzsVq1a5ZxzLisry5mZu+uuu0psN3z4cJeUlOTGjBlzqO2hhx5yZuaGDBly2PEK\nCwsPa/v3v//tkpKS3CeffHLYPm699dZDbUVFRe744493ycnJ7sknnzzUvn37dpeamlrinJSlvJ+j\n0uuBni6Cv6t1C0ZERGKGmfHcc88xa9asw5bu3btX+NomTZrw9ddfs2LFiiofd8aMGdSqVYuRI0eW\naL/rrrsoLi5mxowZh7YzM2699dYS240cObLM/iVmxi9/+cvD2uvWrXvoz3v37mXLli2cfvrpOOfI\nyso6bB833XTToe+TkpI49dRTcc6VuAXVuHFjOnXqxKpVq6rwzv2jWzAiIhJTTjvttDIfwz3qqKMO\nuzUTbOzYsQwePJiOHTvSrVs3Bg0axPXXX89JJ510xGOuXbuW4447jvr165do79Kly6H14D1xlJSU\nRNu2bUts1759+3L3XXpbgG3btvHQQw/xn//8h82bNx9qNzN27Nhx2PalO/U2btyYlJQUmjZtelh7\n6X4ksUpXQEREJCH07duXlStX8sILL3DSSScxYcIEevbsyb/+9S9f66pXr95hbVdddRUTJkzgtttu\n44033uD9999n5syZOOcoLi4+bPvgzrIVtYH/T/pUlgKIiIgkjCZNmjBs2DAmTZrEd999R/fu3Xno\noYcOrS9vnJHWrVuzfv168vPzS7RnZ2cD3hM3B7crLi5m9erVJbZbvnx5pWvcvn07c+bM4d577+WB\nBx7g8ssvZ8CAAWVeKUlkCiAiIpIQSt96SE1NpX379uzdu/dQ28FbLDt37iyx7cUXX8yBAwd49tln\nS7SPGzeOpKQkBg0aBMDAgQNxzh16nPegv/zlL5UelfXglYvSVzrGjRtX5ZFd45n6gIiISMyozu2D\nrl270q9fP3r16kXTpk1ZsGABU6ZMYdSoUYe26dWrF845Ro4cycCBA0lOTuaaa67h0ksv5bzzzuO+\n++5j9erVhx7DnTZtGqNHjz50daJnz55cccUVPPPMM+Tl5XHGGWcwd+7cQ1dAKhMgGjZsyDnnnMMT\nTzzBvn37aNmyJe+99x5r1qyJm9sn4aAAIiKSMLLj/vhH+gUevN7MSnx/xx138NZbb/H++++zd+9e\nWrduzSOPPMKvf/3rQ9v87Gc/Y9SoUfz73/8+NBbINddcg5kxbdo0HnjgAf7zn/8wceJE2rRpw//9\n3/8xevToEjW8/PLLtGjRgszMTKZOncoFF1zAf/7zHzp27EhKSkql3mdmZiYjR45k/PjxOOcYOHAg\nM2bM4Ljjjqv0VZDytoubqyiRfMbXrwWNAyIJRuOAiHPlj9+wdu1al5KSenDsBl+XlJRUt3btWp/O\nkH8WLVrkzMxNnjzZ71KOKFbGAfH9CoiZ3Qv8FOgM7AE+A37jnPs2aJu6wNPANUBdYCZwm3Nu8+F7\nFBGpWdLT08nJyY772XDjRWFh4WFXOp555hmSk5M555xzfKoq/vgeQIC+wF+AL/DqeRR4z8y6OOf2\nBLZ5BrgIuALYCfwV+G/gtSIiNV56enrC/+KPFU888QQLFy7kvPPOo1atWkyfPp2ZM2fyy1/+kpYt\nW/pdXtzwPYA45y4O/t7MbgA2A72AT8ysEXAj8HPn3NzANsOBbDPr7ZybH+WSRUSkBuvTpw+zZs3i\nj3/8I7t37yY9PZ0xY8bwu9/9zu/S4orvAaQMTfDuPR18nqoXXp2zD27gnMsxs1zgTEABREREoub8\n88/n/PPP97uMuBdT44CY13X3GeAT59w3geZjgX3OuZ2lNt8UWCciIiJxJtaugIwHugJxMI+wSOzL\nzc0tt2NiTegsKCKxK2YCiJk9C1wM9HXOrQ9atRGoY2aNSl0FaR5YV67Ro0fTuHHjEm0ZGRlkZGSE\nqWqR2JWbm0unTl0oLCwoc31KSio5OdkKISI1WGZmJpmZmSXaypoMLxJiIoAEwsflwLnOudxSqxcC\nB4ABwBuB7TsB6cC8ivY7bty4MmdUFKkJ8vLyAuHjFaBLqbXZFBYOIS8vTwFEpAYr60N5VlYWvXr1\nivixfQ8gZjYeyAAuA/LNrHlg1Q7nXKFzbqeZTQCeNrNtwC7gz8CnegJGpDK64I3NJ4ni4ARpIqGI\nlZ8f3wMIcAveUy8flmofDrwU+PNooAiYgjcQ2bvA7VGqT0QkJqSlpZGamsqQIUP8LkXiXGpqKmlp\nab7W4HsAcc4d8Ukc59xeYGRgERGpkdLT08nOjo0RTyW+xUIndN8DiIiIVJ5GPJVEEVPjgIiIiEjN\noAAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGn\nACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacA\nIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAi\nIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIi\nIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIiIlGnACIiIiJRpwAiIiIiUacAIiIi\nIlFXy+8CRCQx5ObmkpeXV+a6tLQ00tPTo1yRiMQyBRARqbbc3Fw6depCYWFBmetTUlLJyclWCBGR\nQxRARKTa8vLyAuHjFaBLqbXZFBYOIS8vTwFERA5RABGRMOoC9PS7CBGJA+qEKiIiIlGnACIiIiJR\npwAiIiIiUacAIiIiIlEXEwHEzPqa2Vtmts7Mis3sslLrXwi0By/T/apXREREqicmAghQH1gM3Aa4\ncraZATQHjg0sGdEpTURERMItJh7Ddc69C7wLYGZWzmZ7nXM/RK8qERERiZRYuQJSGf3MbJOZLTOz\n8WbW1O+CREREJDQxcQWkEmYA/wVWAycAjwLTzexM51x5t2xEREQkRsVFAHHOvRr07ddmthRYCfQD\nPvClKBGJOZoQTyR+xEUAKc05t9rM8oD2VBBARo8eTePGjUu0ZWRkkJGh/qsiiUYT4olUXWZmJpmZ\nmSXaduzYEZVjx2UAMbNWQDNgQ0XbjRs3jp49NS+FSE2gCfFEqq6sD+VZWVn06tUr4seOiQBiZvXx\nrmYcfAKmnZmdDGwNLA/i9QHZGNjuceBbYGb0qxWR2KYJ8UTiQUwEEOBUvFspLrA8FWh/EW9skO7A\nUKAJsB4veDzgnNsf/VJFRESkumIigDjn5lLxI8GDolWLiIiIRF48jQMiIiIiCUIBRERERKIupABi\nZu3CXYiIiIjUHKFeAVlhZh+Y2RAzSwlrRSIiIpLwQg0gPYElwNPARjN73sx6h68sERERSWQhBRDn\n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\n", + "image/png": "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\n1llnccIJJ/D444/nuLpo6IhARHLvHyPgswU1u8y9usLgUTucZMuWLZxyyilMnz6dAw88cIfT9urV\ni8WLF297fd5559GgQQMAjj/+eG677bbq11xLKAhEJDYKCwvp168fDz30EHfeeecOp93+Xi353DSk\nIBCR3NvJJ/dsSSQSjB8/noEDB3Lrrbdy/fXXVzrt22+/nbf/+Len7whEJFZ22203Jk2axLhx43jo\noYcqnObpp5/mpZde4pxzzslxddHQEYGIxE6zZs144YUXOProo7edFXTHHXcwduxYNm7cyCGHHMK0\nadO2jYP//o6gRYsWTJkyJZLas0FBICKxsWHDhm3P27Vrx7JlywAYNmwYI0eOrHS+6dOnZ7myaKlp\nSEQk5nREILWGLkATiYaOCEREYk5BICIScwoCEZGYUxCIiMScviwWkUhUdnJAVWVyUkGjRo3+6xTS\nRx55hNmzZ3P33Xdz7733sttuu3HhhRdWOO/06dMpKiqiX79+NVZzbZG1IDCzdsBfgVaAA/e7+51m\n1gx4CugILAe+6+5fZ6sOEZFMXHrppTscP336dBo1alQjQVBWVkZBQe35HJ7NpqEy4Bp37wL0BS43\nsy7ACGCqu3cCpoavRUQiNXLkSG6//XYA7rrrLrp06UK3bt04++yzWb58Offeey933HEHPXr04LXX\nXmP58uUce+yxdOvWjYEDB/LRRx8B8OGHH9K3b1+6du3KjTfeuO1mONOnT+eoo45i2LBhdOnSBYBT\nTjmFQw89lIMPPpj7779/Wy2NGjXiuuuu4+CDD+a4445j1qxZ9O/fn3333ZcJEybU+LZnLZLc/VPg\n0/D5ejNbBLQBTgb6h5M9CkwHfpGtOkREttq0aRM9evTY9vqrr75i2LBh35pu1KhRLFu2jHr16rFm\nzRqaNm3KpZdeSqNGjbbdvGbo0KEMHz6c4cOHM2bMGK688kqeffZZrrrqKq666irOOecc7r333v9a\n7ty5c3n33XfZZ599ABgzZgzNmjVj06ZN9OnTh9NPP53mzZuzceNGjj32WG677TZOPfVUbrzxRl5+\n+WUWLlzI8OHDK6y5OnLyZbGZdQR6Am8CrcKQAPiMoOlIRCTrGjRowDvvvLPtcfPNN1c4Xbdu3Tjv\nvPMYO3ZspU04M2fO5NxzzwXgggsuYMaMGduGn3nmmQDbxm912GGHbQsBCI48unfvTt++fVm5ciVL\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2143,9 +2150,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From 1bd3e0b1d003ff4f31a4b63a29e9a2d8b3930013 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Jun 2017 06:41:20 -0500 Subject: [PATCH 016/123] Make scipy and pandas required dependencies --- docs/source/usersguide/install.rst | 16 ++++++++-------- openmc/arithmetic.py | 4 +--- openmc/filter.py | 19 +------------------ openmc/mgxs_library.py | 7 +++---- openmc/search.py | 4 ++-- openmc/tallies.py | 11 ++--------- setup.py | 4 +--- 7 files changed, 18 insertions(+), 47 deletions(-) diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index bf7ed5cb0..497e09b4d 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -401,14 +401,6 @@ distributions. NumPy is used extensively within the Python API for its powerful N-dimensional array. - `h5py `_ - h5py provides Python bindings to the HDF5 library. Since OpenMC outputs - various HDF5 files, h5py is needed to provide access to data within these - files from Python. - -.. admonition:: Optional - :class: note - `SciPy `_ SciPy's special functions, sparse matrices, and spatial data structures are used for several optional features in the API. @@ -417,6 +409,14 @@ distributions. Pandas is used to generate tally DataFrames as demonstrated in :ref:`examples_pandas` example notebook. + `h5py `_ + h5py provides Python bindings to the HDF5 library. Since OpenMC outputs + various HDF5 files, h5py is needed to provide access to data within these + files from Python. + +.. admonition:: Optional + :class: note + `Matplotlib `_ Matplotlib is used to providing plotting functionality in the API like the :meth:`Universe.plot` method and the :func:`openmc.plot_xs` function. diff --git a/openmc/arithmetic.py b/openmc/arithmetic.py index 9593042d9..57afacac3 100644 --- a/openmc/arithmetic.py +++ b/openmc/arithmetic.py @@ -4,6 +4,7 @@ from collections import Iterable from six import string_types import numpy as np +import pandas as pd import openmc from openmc.filter import _FILTER_TYPES @@ -786,9 +787,6 @@ class AggregateFilter(object): CrossFilter.get_pandas_dataframe() """ - - import pandas as pd - # Create NumPy array of the bin tuples for repeating / tiling filter_bins = np.empty(self.num_bins, dtype=tuple) for i, bin in enumerate(self.bins): diff --git a/openmc/filter.py b/openmc/filter.py index 6af18a103..734759d6b 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -8,6 +8,7 @@ from xml.etree import ElementTree as ET from six import add_metaclass import numpy as np +import pandas as pd import openmc import openmc.checkvalue as cv @@ -460,9 +461,7 @@ class Filter(object): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() filter_bins = np.repeat(self.bins, self.stride) @@ -715,9 +714,7 @@ class SurfaceFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() filter_bins = np.repeat(self.bins, self.stride) @@ -875,9 +872,7 @@ class MeshFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Initialize dictionary to build Pandas Multi-index column @@ -1123,9 +1118,7 @@ class EnergyFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper energy bounds, then repeat and tile @@ -1335,9 +1328,7 @@ class DistribcellFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() level_df = None @@ -1531,9 +1522,7 @@ class MuFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper energy bounds, then repeat and tile @@ -1638,9 +1627,7 @@ class PolarFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper angle bounds, then repeat and tile @@ -1745,9 +1732,7 @@ class AzimuthalFilter(RealFilter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - # Initialize Pandas DataFrame - import pandas as pd df = pd.DataFrame() # Extract the lower and upper angle bounds, then repeat and tile @@ -2039,8 +2024,6 @@ class EnergyFunctionFilter(Filter): Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() """ - - import pandas as pd df = pd.DataFrame() # There is no clean way of sticking all the energy, y data into a diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 8fcf93cb9..93a3607d9 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -5,6 +5,9 @@ import os from six import string_types import numpy as np import h5py +from scipy.interpolate import interp1d +from scipy.integrate import simps +from scipy.special import eval_legendre import openmc import openmc.mgxs @@ -1808,10 +1811,6 @@ class XSdata(object): """ - from scipy.interpolate import interp1d - from scipy.integrate import simps - from scipy.special import eval_legendre - check_value('target_format', target_format, _SCATTER_TYPES) check_type('target_order', target_order, Integral) if target_format == 'legendre': diff --git a/openmc/search.py b/openmc/search.py index 128a725d9..7f91438fd 100644 --- a/openmc/search.py +++ b/openmc/search.py @@ -1,6 +1,8 @@ from collections import Callable from numbers import Real +import scipy.optimize as sopt + import openmc import openmc.model import openmc.checkvalue as cv @@ -144,8 +146,6 @@ def search_for_keff(model_builder, initial_guess=None, target=1.0, model = model_builder(initial_guess, **model_args) cv.check_type('model_builder return', model, openmc.model.Model) - import scipy.optimize as sopt - # Set the iteration data storage variables guesses = [] results = [] diff --git a/openmc/tallies.py b/openmc/tallies.py index 1641d6164..12b5858f2 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -11,6 +11,8 @@ from xml.etree import ElementTree as ET from six import string_types import numpy as np +import pandas as pd +import scipy.sparse as sps import h5py import openmc @@ -295,8 +297,6 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if self.sparse: - import scipy.sparse as sps - self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) self._sum_sq = \ @@ -337,8 +337,6 @@ class Tally(object): # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: - import scipy.sparse as sps - self._mean = \ sps.lil_matrix(self._mean.flatten(), self._mean.shape) @@ -361,8 +359,6 @@ class Tally(object): # Convert NumPy array to SciPy sparse LIL matrix if self.sparse: - import scipy.sparse as sps - self._std_dev = \ sps.lil_matrix(self._std_dev.flatten(), self._std_dev.shape) @@ -608,8 +604,6 @@ class Tally(object): # Convert NumPy arrays to SciPy sparse LIL matrices if sparse and not self.sparse: - import scipy.sparse as sps - if self._sum is not None: self._sum = \ sps.lil_matrix(self._sum.flatten(), self._sum.shape) @@ -1610,7 +1604,6 @@ class Tally(object): raise KeyError(msg) # Initialize a pandas dataframe for the tally data - import pandas as pd df = pd.DataFrame() # Find the total length of the tally data array diff --git a/setup.py b/setup.py index b64a806c2..e7eb9281c 100755 --- a/setup.py +++ b/setup.py @@ -45,14 +45,12 @@ kwargs = {'name': 'openmc', if have_setuptools: kwargs.update({ # Required dependencies - 'install_requires': ['six', 'numpy>=1.9', 'h5py'], + 'install_requires': ['six', 'numpy>=1.9', 'h5py', 'scipy', 'pandas>=0.17.0'], # Optional dependencies 'extras_require': { 'decay': ['uncertainties'], - 'pandas': ['pandas>=0.17.0'], 'plot': ['matplotlib', 'ipython'], - 'sparse' : ['scipy'], 'vtk': ['vtk', 'silomesh'], 'validate': ['lxml'] }, From c9e2e4337b2eea6dca7eff9433f9605ba2b5f829 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Jun 2017 11:00:45 -0500 Subject: [PATCH 017/123] Fix maximum energy for generating thermal ACE files --- openmc/data/njoy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index e7d3cd284..80817bf71 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -118,12 +118,12 @@ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (free gas) %%%%%%%%%%%%%%% 0 23 62 0 {mat} 12 {num_temp} 1 0 {iform} 1 221 1/ {temps} -0.001 4.0 +0.001 {energy_max} thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (bound) %%%%%%%%%%%%%%%%%% 60 62 27 {mat_thermal} {mat} 16 {num_temp} {inelastic} {elastic} {iform} {natom} 222 1/ {temps} -0.001 4.0 +0.001 {energy_max} """ _ACE_THERMAL_TEMPLATE_ACER = """acer / @@ -347,7 +347,6 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, data = _THERMAL_DATA[mat_thermal] zaids = ' '.join(str(zaid) for zaid in data.zaids[:3]) - energy_max = ev_thermal.info['energy_max'] # Determine name of library library = '{}-{}.{}'.format(*ev_thermal.info['library']) @@ -369,6 +368,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, file_obj = StringIO(ev_thermal.section[7, 4]) items = endf.get_head_record(file_obj) items, values = endf.get_list_record(file_obj) + energy_max = values[3] natom = int(values[5]) # Note that the 'iform' parameter is omitted in NJOY 99. We assume that the From ca009e211ec9e0a6be6a694b7e5a108ab8095d02 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Jun 2017 13:25:34 -0500 Subject: [PATCH 018/123] Manage unique IDs via new IDManagerMixin that uses class variables --- openmc/__init__.py | 2 +- openmc/cell.py | 31 +- openmc/filter.py | 30 +- openmc/geometry.py | 8 +- openmc/lattice.py | 21 +- openmc/material.py | 32 +- openmc/mesh.py | 32 +- openmc/mixin.py | 39 + openmc/plots.py | 31 +- openmc/statepoint.py | 107 +- openmc/summary.py | 9 +- openmc/surface.py | 27 +- openmc/tallies.py | 30 +- openmc/tally_derivative.py | 31 +- openmc/universe.py | 31 +- openmc/volume.py | 23 +- tests/test_asymmetric_lattice/inputs_true.dat | 18 +- tests/test_diff_tally/inputs_true.dat | 84 +- tests/test_diff_tally/results_true.dat | 80 +- tests/test_distribmat/inputs_true.dat | 16 +- tests/test_distribmat/results_true.dat | 2 +- tests/test_energy_cutoff/inputs_true.dat | 4 +- tests/test_filter_energyfun/inputs_true.dat | 8 +- tests/test_filter_energyfun/results_true.dat | 2 +- .../test_filter_energyfun.py | 4 +- tests/test_filter_mesh/inputs_true.dat | 30 +- tests/test_mg_basic/inputs_true.dat | 130 +- tests/test_mg_legendre/inputs_true.dat | 28 +- tests/test_mg_max_order/inputs_true.dat | 28 +- tests/test_mg_nuclide/inputs_true.dat | 130 +- .../test_mg_survival_biasing/inputs_true.dat | 130 +- tests/test_mg_tallies/inputs_true.dat | 224 ++-- tests/test_mg_tallies/results_true.dat | 2 +- .../inputs_true.dat | 160 +-- .../inputs_true.dat | 788 ++++++------ .../results_true.dat | 384 +++--- .../inputs_true.dat | 326 ++--- tests/test_mgxs_library_hdf5/inputs_true.dat | 788 ++++++------ tests/test_mgxs_library_hdf5/results_true.dat | 162 +-- tests/test_mgxs_library_mesh/inputs_true.dat | 256 ++-- .../inputs_true.dat | 788 ++++++------ .../results_true.dat | 1080 ++++++++--------- .../inputs_true.dat | 666 +++++----- .../results_true.dat | 2 +- tests/test_multipole/inputs_true.dat | 18 +- tests/test_multipole/results_true.dat | 2 +- .../test_resonance_scattering/inputs_true.dat | 4 +- tests/test_tallies/inputs_true.dat | 152 +-- tests/test_tally_aggregation/inputs_true.dat | 8 +- tests/test_tally_arithmetic/inputs_true.dat | 16 +- tests/test_tally_slice_merge/inputs_true.dat | 24 +- tests/test_triso/inputs_true.dat | 778 ++++++------ 52 files changed, 3830 insertions(+), 3976 deletions(-) diff --git a/openmc/__init__.py b/openmc/__init__.py index 98bf19f98..d692ebbae 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -1,7 +1,6 @@ from openmc.arithmetic import * from openmc.cell import * from openmc.mesh import * -from openmc.lattice import * from openmc.element import * from openmc.geometry import * from openmc.nuclide import * @@ -14,6 +13,7 @@ from openmc.source import * from openmc.settings import * from openmc.surface import * from openmc.universe import * +from openmc.lattice import * from openmc.filter import * from openmc.trigger import * from openmc.tally_derivative import * diff --git a/openmc/cell.py b/openmc/cell.py index 8dd97c0fc..5f8baa589 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -13,19 +13,10 @@ import openmc import openmc.checkvalue as cv from openmc.surface import Halfspace from openmc.region import Region, Intersection, Complement +from .mixin import IDManagerMixin -# A static variable for auto-generated Cell IDs -AUTO_CELL_ID = 10000 - - -def reset_auto_cell_id(): - """Reset counter for auto-generated cell IDs.""" - global AUTO_CELL_ID - AUTO_CELL_ID = 10000 - - -class Cell(object): +class Cell(IDManagerMixin): r"""A region of space defined as the intersection of half-space created by quadric surfaces. @@ -93,6 +84,9 @@ class Cell(object): """ + next_id = 1 + used_ids = set() + def __init__(self, cell_id=None, name='', fill=None, region=None): # Initialize Cell class attributes self.id = cell_id @@ -164,10 +158,6 @@ class Cell(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -236,17 +226,6 @@ class Cell(object): 'Geometry.determine_paths() method.') return self._num_instances - @id.setter - def id(self, cell_id): - if cell_id is None: - global AUTO_CELL_ID - self._id = AUTO_CELL_ID - AUTO_CELL_ID += 1 - else: - cv.check_type('cell ID', cell_id, Integral) - cv.check_greater_than('cell ID', cell_id, 0, equality=True) - self._id = cell_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/filter.py b/openmc/filter.py index 734759d6b..90f749668 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -12,11 +12,9 @@ import pandas as pd import openmc import openmc.checkvalue as cv +from .mixin import IDManagerMixin -# "Static" variable for auto-generated Filter IDs -AUTO_FILTER_ID = 10000 - _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal', 'distribcell', 'delayedgroup', 'energyfunction'] @@ -29,12 +27,6 @@ _CURRENT_NAMES = {1: 'x-min out', 2: 'x-min in', 11: 'z-max out', 12: 'z-max in'} -def reset_auto_filter_id(): - """Reset counter for auto-generated filter IDs.""" - global AUTO_FILTER_ID - AUTO_FILTER_ID = 10000 - - class FilterMeta(ABCMeta): def __new__(cls, name, bases, namespace, **kwargs): # Check the class name. @@ -74,7 +66,7 @@ class FilterMeta(ABCMeta): @add_metaclass(FilterMeta) -class Filter(object): +class Filter(IDManagerMixin): """Tally modifier that describes phase-space and other characteristics. Parameters @@ -100,6 +92,9 @@ class Filter(object): """ + next_id = 1 + used_ids = set() + def __init__(self, bins, filter_id=None): self.bins = bins self.id = filter_id @@ -195,10 +190,6 @@ class Filter(object): def bins(self): return self._bins - @property - def id(self): - return self._id - @property def num_bins(self): return self._num_bins @@ -217,17 +208,6 @@ class Filter(object): self._bins = bins - @id.setter - def id(self, filter_id): - if filter_id is None: - global AUTO_FILTER_ID - self._id = AUTO_FILTER_ID - AUTO_FILTER_ID += 1 - else: - cv.check_type('filter ID', filter_id, Integral) - cv.check_greater_than('filter ID', filter_id, 0, equality=True) - self._id = filter_id - @num_bins.setter def num_bins(self, num_bins): cv.check_type('filter num_bins', num_bins, Integral) diff --git a/openmc/geometry.py b/openmc/geometry.py index 860d3028f..6b1e6cb72 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -7,14 +7,14 @@ from six import string_types import openmc from openmc.clean_xml import sort_xml_elements, clean_xml_indentation from openmc.checkvalue import check_type +from openmc.mixin import IDManagerMixin def reset_auto_ids(): """Reset counters for all auto-generated IDs""" - openmc.reset_auto_material_id() - openmc.reset_auto_surface_id() - openmc.reset_auto_cell_id() - openmc.reset_auto_universe_id() + for cls in IDManagerMixin.__subclasses__(): + cls.used_ids.clear() + cls.next_id = 1 class Geometry(object): diff --git a/openmc/lattice.py b/openmc/lattice.py index be5f22db9..3d078bd01 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -12,10 +12,11 @@ import numpy as np import openmc.checkvalue as cv import openmc +from openmc.mixin import IDManagerMixin @add_metaclass(ABCMeta) -class Lattice(object): +class Lattice(IDManagerMixin): """A repeating structure wherein each element is a universe. Parameters @@ -41,6 +42,10 @@ class Lattice(object): of the lattice """ + + next_id = 1 + used_ids = openmc.Universe.used_ids + def __init__(self, lattice_id=None, name=''): # Initialize Lattice class attributes self.id = lattice_id @@ -68,10 +73,6 @@ class Lattice(object): def __ne__(self, other): return not self == other - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -88,16 +89,6 @@ class Lattice(object): def universes(self): return self._universes - @id.setter - def id(self, lattice_id): - if lattice_id is None: - self._id = openmc.universe.AUTO_UNIVERSE_ID - openmc.universe.AUTO_UNIVERSE_ID += 1 - else: - cv.check_type('lattice ID', lattice_id, Integral) - cv.check_greater_than('lattice ID', lattice_id, 0, equality=True) - self._id = lattice_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/material.py b/openmc/material.py index da415ec68..762332584 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -11,16 +11,7 @@ import openmc import openmc.data import openmc.checkvalue as cv from openmc.clean_xml import sort_xml_elements, clean_xml_indentation - - -# A static variable for auto-generated Material IDs -AUTO_MATERIAL_ID = 10000 - - -def reset_auto_material_id(): - """Reset counter for auto-generated material IDs.""" - global AUTO_MATERIAL_ID - AUTO_MATERIAL_ID = 10000 +from .mixin import IDManagerMixin # Units for density supported by OpenMC @@ -28,7 +19,7 @@ DENSITY_UNITS = ['g/cm3', 'g/cc', 'kg/cm3', 'atom/b-cm', 'atom/cm3', 'sum', 'macro'] -class Material(object): +class Material(IDManagerMixin): """A material composed of a collection of nuclides/elements. To create a material, one should create an instance of this class, add @@ -89,6 +80,9 @@ class Material(object): """ + next_id = 1 + used_ids = set() + def __init__(self, material_id=None, name='', temperature=None): # Initialize class attributes self.id = material_id @@ -184,10 +178,6 @@ class Material(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -264,18 +254,6 @@ class Material(object): def volume(self): return self._volume - @id.setter - def id(self, material_id): - - if material_id is None: - global AUTO_MATERIAL_ID - self._id = AUTO_MATERIAL_ID - AUTO_MATERIAL_ID += 1 - else: - cv.check_type('material ID', material_id, Integral) - cv.check_greater_than('material ID', material_id, 0, equality=True) - self._id = material_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/mesh.py b/openmc/mesh.py index 1ad01e2ca..76a33d8e2 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -8,20 +8,10 @@ import numpy as np import openmc.checkvalue as cv import openmc -from openmc.mixin import EqualityMixin +from openmc.mixin import EqualityMixin, IDManagerMixin -# "Static" variable for auto-generated and Mesh IDs -AUTO_MESH_ID = 10000 - - -def reset_auto_mesh_id(): - """Reset counter for auto-generated mesh IDs.""" - global AUTO_MESH_ID - AUTO_MESH_ID = 10000 - - -class Mesh(EqualityMixin): +class Mesh(EqualityMixin, IDManagerMixin): """A structured Cartesian mesh in one, two, or three dimensions Parameters @@ -52,6 +42,9 @@ class Mesh(EqualityMixin): """ + next_id = 1 + used_ids = set() + def __init__(self, mesh_id=None, name=''): # Initialize Mesh class attributes self.id = mesh_id @@ -62,10 +55,6 @@ class Mesh(EqualityMixin): self._upper_right = None self._width = None - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -94,17 +83,6 @@ class Mesh(EqualityMixin): def num_mesh_cells(self): return np.prod(self._dimension) - @id.setter - def id(self, mesh_id): - if mesh_id is None: - global AUTO_MESH_ID - self._id = AUTO_MESH_ID - AUTO_MESH_ID += 1 - else: - cv.check_type('mesh ID', mesh_id, Integral) - cv.check_greater_than('mesh ID', mesh_id, 0, equality=True) - self._id = mesh_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/mixin.py b/openmc/mixin.py index dd97e8924..0b0c5f519 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -1,5 +1,10 @@ +from numbers import Integral +from warnings import warn + import numpy as np +import openmc.checkvalue as cv + class EqualityMixin(object): """A Class which provides generic __eq__ and __ne__ functionality which @@ -18,3 +23,37 @@ class EqualityMixin(object): def __ne__(self, other): return not self.__eq__(other) + + +class IDManagerMixin(object): + """A Class which automatically manages unique IDs. + + This mixin gives any subclass the ability to assign unique IDs through an + 'id' property and keeps track of which ones have already been + assigned. Crucially, each subclass must define class variables 'next_id' and + 'used_ids' as they are used in the 'id' property that is supplied here. + + """ + + @property + def id(self): + return self._id + + @id.setter + def id(self, uid): + cls = type(self) + name = cls.__name__ + if uid is None: + while cls.next_id in cls.used_ids: + cls.next_id += 1 + self._id = cls.next_id + cls.used_ids.add(cls.next_id) + else: + cv.check_type('{} ID'.format(name), uid, Integral) + cv.check_greater_than('{} ID'.format(name), uid, 0, equality=True) + if uid in cls.used_ids: + warn('Another {} instance already exists with id={}.'.format( + name, uid)) + else: + cls.used_ids.add(uid) + self._id = uid diff --git a/openmc/plots.py b/openmc/plots.py index cc2fcc4b6..ad0d48d11 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -10,16 +10,7 @@ import numpy as np import openmc import openmc.checkvalue as cv from openmc.clean_xml import clean_xml_indentation - - -# A static variable for auto-generated Plot IDs -AUTO_PLOT_ID = 10000 - - -def reset_auto_plot_id(): - """Reset counter for auto-generated plot IDs.""" - global AUTO_PLOT_ID - AUTO_PLOT_ID = 10000 +from openmc.mixin import IDManagerMixin _BASES = ['xy', 'xz', 'yz'] @@ -175,7 +166,7 @@ _SVG_COLORS = { } -class Plot(object): +class Plot(IDManagerMixin): """Definition of a finite region of space to be plotted. OpenMC is capable of generating two-dimensional slice plots and @@ -227,6 +218,9 @@ class Plot(object): """ + next_id = 1 + used_ids = set() + def __init__(self, plot_id=None, name=''): # Initialize Plot class attributes self.id = plot_id @@ -245,10 +239,6 @@ class Plot(object): self._level = None self._meshlines = None - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -305,17 +295,6 @@ class Plot(object): def meshlines(self): return self._meshlines - @id.setter - def id(self, plot_id): - if plot_id is None: - global AUTO_PLOT_ID - self._id = AUTO_PLOT_ID - AUTO_PLOT_ID += 1 - else: - cv.check_type('plot ID', plot_id, Integral) - cv.check_greater_than('plot ID', plot_id, 0, equality=True) - self._id = plot_id - @name.setter def name(self, name): cv.check_type('plot name', name, string_types) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 543e8a302..7255a7ba4 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -356,71 +356,76 @@ class StatePoint(object): else: tally_ids = [] - # Iterate over all tallies - for tally_id in tally_ids: - group = tallies_group['tally {}'.format(tally_id)] + # Ignore warnings about duplicate IDs + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) - # Read the number of realizations - n_realizations = group['n_realizations'].value + # Iterate over all tallies + for tally_id in tally_ids: + group = tallies_group['tally {}'.format(tally_id)] - # Create Tally object and assign basic properties - tally = openmc.Tally(tally_id) - tally._sp_filename = self._f.filename - tally.name = group['name'].value.decode() if 'name' in group else '' - tally.estimator = group['estimator'].value.decode() - tally.num_realizations = n_realizations + # Read the number of realizations + n_realizations = group['n_realizations'].value - # Read derivative information. - if 'derivative' in group: - deriv_id = group['derivative'].value - tally.derivative = self.tally_derivatives[deriv_id] + # Create Tally object and assign basic properties + tally = openmc.Tally(tally_id) + tally._sp_filename = self._f.filename + tally.name = group['name'].value.decode() if 'name' in group else '' + tally.estimator = group['estimator'].value.decode() + tally.num_realizations = n_realizations - # Read all filters - n_filters = group['n_filters'].value - if n_filters > 0: - filter_ids = group['filters'].value - filters_group = self._f['tallies/filters'] - for filter_id in filter_ids: - filter_group = filters_group['filter {}'.format(filter_id)] - new_filter = openmc.Filter.from_hdf5(filter_group, - meshes=self.meshes) - tally.filters.append(new_filter) + # Read derivative information. + if 'derivative' in group: + deriv_id = group['derivative'].value + tally.derivative = self.tally_derivatives[deriv_id] - # Read nuclide bins - nuclide_names = group['nuclides'].value + # Read all filters + n_filters = group['n_filters'].value + if n_filters > 0: + filter_ids = group['filters'].value + filters_group = self._f['tallies/filters'] + for filter_id in filter_ids: + filter_group = filters_group['filter {}'.format( + filter_id)] + new_filter = openmc.Filter.from_hdf5( + filter_group, meshes=self.meshes) + tally.filters.append(new_filter) - # Add all nuclides to the Tally - for name in nuclide_names: - nuclide = openmc.Nuclide(name.decode().strip()) - tally.nuclides.append(nuclide) + # Read nuclide bins + nuclide_names = group['nuclides'].value - scores = group['score_bins'].value - n_score_bins = group['n_score_bins'].value + # Add all nuclides to the Tally + for name in nuclide_names: + nuclide = openmc.Nuclide(name.decode().strip()) + tally.nuclides.append(nuclide) - # Compute and set the filter strides - for i in range(n_filters): - tally_filter = tally.filters[i] - tally_filter.stride = n_score_bins * len(nuclide_names) + scores = group['score_bins'].value + n_score_bins = group['n_score_bins'].value - for j in range(i+1, n_filters): - tally_filter.stride *= tally.filters[j].num_bins + # Compute and set the filter strides + for i in range(n_filters): + tally_filter = tally.filters[i] + tally_filter.stride = n_score_bins * len(nuclide_names) - # Read scattering moment order strings (e.g., P3, Y1,2, etc.) - moments = group['moment_orders'].value + for j in range(i+1, n_filters): + tally_filter.stride *= tally.filters[j].num_bins - # Add the scores to the Tally - for j, score in enumerate(scores): - score = score.decode() + # Read scattering moment order strings (e.g., P3, Y1,2, etc.) + moments = group['moment_orders'].value - # If this is a moment, use generic moment order - pattern = r'-n$|-pn$|-yn$' - score = re.sub(pattern, '-' + moments[j].decode(), score) + # Add the scores to the Tally + for j, score in enumerate(scores): + score = score.decode() - tally.scores.append(score) + # If this is a moment, use generic moment order + pattern = r'-n$|-pn$|-yn$' + score = re.sub(pattern, '-' + moments[j].decode(), score) - # Add Tally to the global dictionary of all Tallies - tally.sparse = self.sparse - self._tallies[tally_id] = tally + tally.scores.append(score) + + # Add Tally to the global dictionary of all Tallies + tally.sparse = self.sparse + self._tallies[tally_id] = tally self._tallies_read = True diff --git a/openmc/summary.py b/openmc/summary.py index 61596cc38..30ba77f98 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -1,5 +1,6 @@ from collections import Iterable import re +import warnings import numpy as np import h5py @@ -31,8 +32,6 @@ class Summary(object): """ def __init__(self, filename): - openmc.reset_auto_ids() - if not filename.endswith(('.h5', '.hdf5')): msg = 'Unable to open "{0}" which is not an HDF5 summary file' raise ValueError(msg) @@ -52,7 +51,9 @@ class Summary(object): self._nuclides = {} self._read_nuclides() - self._read_geometry() + with warnings.catch_warnings(): + warnings.simplefilter("ignore", UserWarning) + self._read_geometry() @property def date_and_time(self): @@ -69,7 +70,7 @@ class Summary(object): @property def nuclides(self): return self._nuclides - + @property def version(self): return tuple(self._f.attrs['openmc_version']) diff --git a/openmc/surface.py b/openmc/surface.py index c7c19cff3..dca9a76bd 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -12,6 +12,7 @@ import numpy as np from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.region import Region, Intersection, Union +from openmc.mixin import IDManagerMixin # A static variable for auto-generated Surface IDs @@ -20,13 +21,7 @@ AUTO_SURFACE_ID = 10000 _BOUNDARY_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] -def reset_auto_surface_id(): - """Reset counters for all auto-generated surface IDs""" - global AUTO_SURFACE_ID - AUTO_SURFACE_ID = 10000 - - -class Surface(object): +class Surface(IDManagerMixin): """An implicit surface with an associated boundary condition. An implicit surface is defined as the set of zeros of a function of the @@ -64,6 +59,9 @@ class Surface(object): """ + next_id = 1 + used_ids = set() + def __init__(self, surface_id=None, boundary_type='transmission', name=''): self.id = surface_id self.name = name @@ -105,10 +103,6 @@ class Surface(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -125,17 +119,6 @@ class Surface(object): def coefficients(self): return self._coefficients - @id.setter - def id(self, surface_id): - if surface_id is None: - global AUTO_SURFACE_ID - self._id = AUTO_SURFACE_ID - AUTO_SURFACE_ID += 1 - else: - check_type('surface ID', surface_id, Integral) - check_greater_than('surface ID', surface_id, 0, equality=True) - self._id = surface_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/tallies.py b/openmc/tallies.py index 12b5858f2..6853db494 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -18,11 +18,9 @@ import h5py import openmc import openmc.checkvalue as cv from openmc.clean_xml import clean_xml_indentation +from .mixin import IDManagerMixin -# "Static" variable for auto-generated Tally IDs -AUTO_TALLY_ID = 10000 - # The tally arithmetic product types. The tensor product performs the full # cross product of the data in two tallies with respect to a specified axis # (filters, nuclides, or scores). The entrywise product performs the arithmetic @@ -41,13 +39,7 @@ _FILTER_CLASSES = (openmc.Filter, openmc.CrossFilter, openmc.AggregateFilter) ESTIMATOR_TYPES = ['tracklength', 'collision', 'analog'] -def reset_auto_tally_id(): - """Reset counter for auto-generated tally IDs.""" - global AUTO_TALLY_ID - AUTO_TALLY_ID = 10000 - - -class Tally(object): +class Tally(IDManagerMixin): """A tally defined by a set of scores that are accumulated for a list of nuclides given a set of filters. @@ -109,6 +101,9 @@ class Tally(object): """ + next_id = 1 + used_ids = set() + def __init__(self, tally_id=None, name=''): # Initialize Tally class attributes self.id = tally_id @@ -204,10 +199,6 @@ class Tally(object): return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -416,17 +407,6 @@ class Tally(object): DeprecationWarning) self.triggers.append(trigger) - @id.setter - def id(self, tally_id): - if tally_id is None: - global AUTO_TALLY_ID - self._id = AUTO_TALLY_ID - AUTO_TALLY_ID += 1 - else: - cv.check_type('tally ID', tally_id, Integral) - cv.check_greater_than('tally ID', tally_id, 0, equality=True) - self._id = tally_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/tally_derivative.py b/openmc/tally_derivative.py index 185e7ab6a..d6c2fab02 100644 --- a/openmc/tally_derivative.py +++ b/openmc/tally_derivative.py @@ -7,18 +7,10 @@ from xml.etree import ElementTree as ET from six import string_types import openmc.checkvalue as cv -from openmc.mixin import EqualityMixin +from openmc.mixin import EqualityMixin, IDManagerMixin -# "Static" variable for auto-generated TallyDerivative IDs -AUTO_TALLY_DERIV_ID = 10000 - -def reset_auto_tally_deriv_id(): - global AUTO_TALLY_ID - AUTO_TALLY_DERIV_ID = 10000 - - -class TallyDerivative(EqualityMixin): +class TallyDerivative(EqualityMixin, IDManagerMixin): """A material perturbation derivative to apply to a tally. Parameters @@ -48,6 +40,9 @@ class TallyDerivative(EqualityMixin): """ + next_id = 1 + used_ids = set() + def __init__(self, derivative_id=None, variable=None, material=None, nuclide=None): # Initialize Tally class attributes @@ -74,10 +69,6 @@ class TallyDerivative(EqualityMixin): return string - @property - def id(self): - return self._id - @property def variable(self): return self._variable @@ -90,18 +81,6 @@ class TallyDerivative(EqualityMixin): def nuclide(self): return self._nuclide - @id.setter - def id(self, deriv_id): - if deriv_id is None: - global AUTO_TALLY_DERIV_ID - self._id = AUTO_TALLY_DERIV_ID - AUTO_TALLY_DERIV_ID += 1 - else: - cv.check_type('tally derivative ID', deriv_id, Integral) - cv.check_greater_than('tally derivative ID', deriv_id, 0, - equality=True) - self._id = deriv_id - @variable.setter def variable(self, var): if var is not None: diff --git a/openmc/universe.py b/openmc/universe.py index a03e8ba87..95a1341fd 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -11,19 +11,10 @@ import numpy as np import openmc import openmc.checkvalue as cv from openmc.plots import _SVG_COLORS +from openmc.mixin import IDManagerMixin -# A static variable for auto-generated Lattice (Universe) IDs -AUTO_UNIVERSE_ID = 10000 - - -def reset_auto_universe_id(): - """Reset counter for auto-generated universe IDs.""" - global AUTO_UNIVERSE_ID - AUTO_UNIVERSE_ID = 10000 - - -class Universe(object): +class Universe(IDManagerMixin): """A collection of cells that can be repeated. Parameters @@ -55,6 +46,9 @@ class Universe(object): """ + next_id = 1 + used_ids = set() + def __init__(self, universe_id=None, name='', cells=None): # Initialize Cell class attributes self.id = universe_id @@ -95,10 +89,6 @@ class Universe(object): list(self._cells.keys())) return string - @property - def id(self): - return self._id - @property def name(self): return self._name @@ -121,17 +111,6 @@ class Universe(object): # Infinite bounding box return openmc.Intersection().bounding_box - @id.setter - def id(self, universe_id): - if universe_id is None: - global AUTO_UNIVERSE_ID - self._id = AUTO_UNIVERSE_ID - AUTO_UNIVERSE_ID += 1 - else: - cv.check_type('universe ID', universe_id, Integral) - cv.check_greater_than('universe ID', universe_id, 0, equality=True) - self._id = universe_id - @name.setter def name(self, name): if name is not None: diff --git a/openmc/volume.py b/openmc/volume.py index 6c4b130f9..b81004ba1 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -1,7 +1,7 @@ from collections import Iterable, Mapping, OrderedDict from numbers import Real, Integral from xml.etree import ElementTree as ET -from warnings import warn +import warnings import numpy as np import pandas as pd @@ -85,9 +85,10 @@ class VolumeCalculation(object): continue if (np.any(np.asarray(lower_left) > ll) or np.any(np.asarray(upper_right) < ur)): - warn("Specified bounding box is smaller than computed " - "bounding box for cell {}. Volume calculation may " - "be incorrect!".format(c.id)) + warnings.warn( + "Specified bounding box is smaller than computed " + "bounding box for cell {}. Volume calculation may " + "be incorrect!".format(c.id)) self.lower_left = lower_left self.upper_right = upper_right @@ -221,12 +222,14 @@ class VolumeCalculation(object): # Instantiate some throw-away domains that are used by the constructor # to assign IDs - if domain_type == 'cell': - domains = [openmc.Cell(uid) for uid in ids] - elif domain_type == 'material': - domains = [openmc.Material(uid) for uid in ids] - elif domain_type == 'universe': - domains = [openmc.Universe(uid) for uid in ids] + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + if domain_type == 'cell': + domains = [openmc.Cell(uid) for uid in ids] + elif domain_type == 'material': + domains = [openmc.Material(uid) for uid in ids] + elif domain_type == 'universe': + domains = [openmc.Universe(uid) for uid in ids] # Instantiate the class and assign results vol = cls(domains, samples, lower_left, upper_right) diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index df9ea209e..808e9f56a 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -1,6 +1,6 @@ - + @@ -42,17 +42,17 @@ 7 7 7 - - - - - - + + + + + + @@ -217,11 +217,11 @@ - + 27 - 10000 + 1 nu-fission diff --git a/tests/test_diff_tally/inputs_true.dat b/tests/test_diff_tally/inputs_true.dat index 83dfd7ff9..624279df1 100644 --- a/tests/test_diff_tally/inputs_true.dat +++ b/tests/test_diff_tally/inputs_true.dat @@ -310,123 +310,123 @@ - + 1 3 - + 0.0 0.625 20000000.0 - - 10000 + + 1 flux 1 - - 10000 + + 1 flux 2 - - 10000 + + 1 flux 3 - - 10000 + + 1 flux 4 - - 10000 + + 1 flux 5 - - 10000 + + 1 total U235 total absorption scatter fission nu-fission 1 - - 10000 + + 1 total U235 total absorption scatter fission nu-fission 2 - - 10000 + + 1 total U235 total absorption scatter fission nu-fission 3 - - 10000 + + 1 total U235 total absorption scatter fission nu-fission 4 - - 10000 + + 1 total U235 total absorption scatter fission nu-fission 5 - - 10000 + + 1 absorption analog 1 - - 10000 + + 1 absorption analog 2 - - 10000 + + 1 absorption analog 3 - - 10000 + + 1 absorption analog 4 - - 10000 + + 1 absorption analog 5 - - 10000 10001 + + 1 2 total U235 nu-fission scatter 1 - - 10000 10001 + + 1 2 total U235 nu-fission scatter 2 - - 10000 10001 + + 1 2 U235 nu-fission scatter 3 - - 10000 10001 + + 1 2 U235 nu-fission scatter 4 - - 10000 10001 + + 1 2 U235 nu-fission scatter 5 diff --git a/tests/test_diff_tally/results_true.dat b/tests/test_diff_tally/results_true.dat index 4879e8a2f..50e0060dc 100644 --- a/tests/test_diff_tally/results_true.dat +++ b/tests/test_diff_tally/results_true.dat @@ -1,44 +1,4 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,3.9903014e-02,9.1258569e-03 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,9.8213753e-04,9.8213753e-04 -1,,density,nu-fission,2.7945436e-02,2.0999385e-02 -1,,density,scatter,4.0626164e-01,1.7017647e-02 -1,,density,nu-fission,2.4595326e-02,2.1224461e-02 -1,,density,scatter,2.6505966e-03,2.3698970e-03 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,-1.2721691e-01,1.8810988e-01 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,0.0000000e+00,0.0000000e+00 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,4.1950837e-02,7.3679973e-02 -1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,-1.9798569e-02,1.9798569e-02 -1,O16,nuclide_density,nu-fission,9.3633316e-01,2.0322303e+00 -1,O16,nuclide_density,scatter,-2.2042880e-01,1.6781769e-01 -1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,2.3761278e+00,2.3761278e+00 -1,U235,nuclide_density,nu-fission,7.7441706e+02,8.6460966e+01 -1,U235,nuclide_density,scatter,9.6917110e+01,1.0750583e+01 -1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 -1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,-2.0607997e-06,2.0607997e-06 -1,,temperature,nu-fission,3.8846012e-06,3.5405078e-05 -1,,temperature,scatter,-6.6772461e-07,2.0750790e-07 -1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,0.0000000e+00,0.0000000e+00 -1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,0.0000000e+00,0.0000000e+00 3,,density,flux,-7.6179773e+00,5.0326448e+00 3,,density,flux,-1.6242019e+01,6.6231769e+00 1,,density,flux,-2.2394711e-01,5.4534246e-02 @@ -175,3 +135,43 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 3,,density,scatter,4.0762347e-01,3.8504133e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,scatter,0.0000000e+00,0.0000000e+00 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,3.9903014e-02,9.1258569e-03 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,9.8213753e-04,9.8213753e-04 +1,,density,nu-fission,2.7945436e-02,2.0999385e-02 +1,,density,scatter,4.0626164e-01,1.7017647e-02 +1,,density,nu-fission,2.4595326e-02,2.1224461e-02 +1,,density,scatter,2.6505966e-03,2.3698970e-03 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,-1.2721691e-01,1.8810988e-01 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,0.0000000e+00,0.0000000e+00 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,4.1950837e-02,7.3679973e-02 +1,,density,nu-fission,0.0000000e+00,0.0000000e+00 +1,,density,scatter,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,scatter,-1.9798569e-02,1.9798569e-02 +1,O16,nuclide_density,nu-fission,9.3633316e-01,2.0322303e+00 +1,O16,nuclide_density,scatter,-2.2042880e-01,1.6781769e-01 +1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,scatter,2.3761278e+00,2.3761278e+00 +1,U235,nuclide_density,nu-fission,7.7441706e+02,8.6460966e+01 +1,U235,nuclide_density,scatter,9.6917110e+01,1.0750583e+01 +1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 +1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 +1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 +1,,temperature,scatter,-2.0607997e-06,2.0607997e-06 +1,,temperature,nu-fission,3.8846012e-06,3.5405078e-05 +1,,temperature,scatter,-6.6772461e-07,2.0750790e-07 +1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 +1,,temperature,scatter,0.0000000e+00,0.0000000e+00 +1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 +1,,temperature,scatter,0.0000000e+00,0.0000000e+00 diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index cd26a0e7c..5adb9d250 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1,9 +1,9 @@ - - - + + + 2.0 2.0 1 @@ -13,11 +13,11 @@ 11 11 11 11 - - - - - + + + + + diff --git a/tests/test_distribmat/results_true.dat b/tests/test_distribmat/results_true.dat index a47d167e2..cd6aa95d4 100644 --- a/tests/test_distribmat/results_true.dat +++ b/tests/test_distribmat/results_true.dat @@ -4,6 +4,6 @@ Cell ID = 11 Name = Fill = [2, 3, None, 2] - Region = -10000 + Region = -9 Rotation = None Translation = None diff --git a/tests/test_energy_cutoff/inputs_true.dat b/tests/test_energy_cutoff/inputs_true.dat index a2d2967c0..1e22c9514 100644 --- a/tests/test_energy_cutoff/inputs_true.dat +++ b/tests/test_energy_cutoff/inputs_true.dat @@ -32,11 +32,11 @@ - + 0.0 4.0 - 10000 + 1 flux diff --git a/tests/test_filter_energyfun/inputs_true.dat b/tests/test_filter_energyfun/inputs_true.dat index cbf6183d1..643ead7fb 100644 --- a/tests/test_filter_energyfun/inputs_true.dat +++ b/tests/test_filter_energyfun/inputs_true.dat @@ -310,16 +310,16 @@ - + 1e-05 0.369 1000.0 100000.0 600000.0 1000000.0 2000000.0 4000000.0 30000000.0 0.1 0.1 0.1333 0.158 0.18467 0.25618 0.4297 0.48 0.48 - + Am241 (n,gamma) - - 10000 + + 1 Am241 (n,gamma) diff --git a/tests/test_filter_energyfun/results_true.dat b/tests/test_filter_energyfun/results_true.dat index 8e48e5f3c..5f1a8827f 100644 --- a/tests/test_filter_energyfun/results_true.dat +++ b/tests/test_filter_energyfun/results_true.dat @@ -1,2 +1,2 @@ energyfunction nuclide score mean std. dev. -0 ac03185c35fac8 Am241 (n,gamma) 1.00e-01 6.22e-03 +0 02180f5f310ee4 Am241 (n,gamma) 1.00e-01 6.22e-03 diff --git a/tests/test_filter_energyfun/test_filter_energyfun.py b/tests/test_filter_energyfun/test_filter_energyfun.py index 07ae993a9..7e787edff 100644 --- a/tests/test_filter_energyfun/test_filter_energyfun.py +++ b/tests/test_filter_energyfun/test_filter_energyfun.py @@ -29,7 +29,7 @@ class FilterEnergyFunHarness(PyAPITestHarness): assert filt1 == filt2, 'Error with the .from_tabulated1d constructor' # Make tallies. - tallies = [openmc.Tally(), openmc.Tally()] + tallies = [openmc.Tally(1), openmc.Tally(2)] for t in tallies: t.scores = ['(n,gamma)'] t.nuclides = ['Am241'] @@ -42,7 +42,7 @@ class FilterEnergyFunHarness(PyAPITestHarness): sp = openmc.StatePoint(statepoint) # Use tally arithmetic to compute the branching ratio. - br_tally = sp.tallies[10001] / sp.tallies[10000] + br_tally = sp.tallies[2] / sp.tallies[1] # Output the tally in a Pandas DataFrame. return br_tally.get_pandas_dataframe().to_string() + '\n' diff --git a/tests/test_filter_mesh/inputs_true.dat b/tests/test_filter_mesh/inputs_true.dat index e5d900624..333f976db 100644 --- a/tests/test_filter_mesh/inputs_true.dat +++ b/tests/test_filter_mesh/inputs_true.dat @@ -324,37 +324,37 @@ -182.07 -182.07 -183.0 182.07 182.07 183.0 - + 1 - + 2 - + 3 - - 10000 + + 1 total - - 10000 + + 1 current - - 10001 + + 2 total - - 10001 + + 2 current - - 10002 + + 3 total - - 10002 + + 3 current diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index 9e722493a..47e1c94dd 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../1d_mgxs.h5 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_mg_legendre/inputs_true.dat b/tests/test_mg_legendre/inputs_true.dat index 05614b279..10615ed13 100644 --- a/tests/test_mg_legendre/inputs_true.dat +++ b/tests/test_mg_legendre/inputs_true.dat @@ -1,29 +1,29 @@ - - - - - - - - - - - + + + + + + + + + + + ../1d_mgxs.h5 - + - + - + diff --git a/tests/test_mg_max_order/inputs_true.dat b/tests/test_mg_max_order/inputs_true.dat index 07725dd31..c777dcbbf 100644 --- a/tests/test_mg_max_order/inputs_true.dat +++ b/tests/test_mg_max_order/inputs_true.dat @@ -1,29 +1,29 @@ - - - - - - - - - - - + + + + + + + + + + + ../1d_mgxs.h5 - + - + - + diff --git a/tests/test_mg_nuclide/inputs_true.dat b/tests/test_mg_nuclide/inputs_true.dat index 4225f7571..c840f4194 100644 --- a/tests/test_mg_nuclide/inputs_true.dat +++ b/tests/test_mg_nuclide/inputs_true.dat @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../1d_mgxs.h5 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_mg_survival_biasing/inputs_true.dat b/tests/test_mg_survival_biasing/inputs_true.dat index de6e04644..49d34e915 100644 --- a/tests/test_mg_survival_biasing/inputs_true.dat +++ b/tests/test_mg_survival_biasing/inputs_true.dat @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../1d_mgxs.h5 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index 9aeb28a94..34da51c18 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../1d_mgxs.h5 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -102,127 +102,127 @@ 0.0 0.0 0.0 10 10 5 - + 1 - - 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 + + 1 2 3 4 5 6 7 8 9 10 11 12 - + 0.0 20000000.0 - + 0.0 20000000.0 - + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 - + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 - - 10004 + + 5 total absorption flux fission nu-fission analog - - 10004 + + 5 total absorption flux fission nu-fission tracklength - - 10005 10000 + + 6 1 total absorption flux fission nu-fission scatter nu-scatter analog - - 10005 10000 + + 6 1 total absorption flux fission nu-fission collision - - 10005 10000 + + 6 1 total absorption flux fission nu-fission tracklength - - 10005 10000 10001 + + 6 1 2 scatter nu-scatter nu-fission - - 10005 10002 + + 6 3 total absorption flux fission nu-fission scatter nu-scatter analog - - 10005 10002 + + 6 3 total absorption flux fission nu-fission collision - - 10005 10002 + + 6 3 total absorption flux fission nu-fission tracklength - - 10005 10002 10003 + + 6 3 4 scatter nu-scatter nu-fission - - 10004 + + 5 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission analog - - 10004 + + 5 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission tracklength - - 10005 10000 + + 6 1 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission scatter nu-scatter analog - - 10005 10000 + + 6 1 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission collision - - 10005 10000 + + 6 1 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission tracklength - - 10005 10000 10001 + + 6 1 2 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu scatter nu-scatter nu-fission - - 10005 10002 + + 6 3 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission scatter nu-scatter analog - - 10005 10002 + + 6 3 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission collision - - 10005 10002 + + 6 3 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu total absorption fission nu-fission tracklength - - 10005 10002 10003 + + 6 3 4 uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu scatter nu-scatter nu-fission diff --git a/tests/test_mg_tallies/results_true.dat b/tests/test_mg_tallies/results_true.dat index db7735cb4..87470bdf4 100644 --- a/tests/test_mg_tallies/results_true.dat +++ b/tests/test_mg_tallies/results_true.dat @@ -1 +1 @@ -0a17877c7cf6dbd3e432b1997669a47c588d2a4074a29406deef27332eb7a0f736ea1fdc2037fc02f8ebca39f00332563bbe2172adc26bfaab2d6144d259daee \ No newline at end of file +9183f8b191f2e62334f992acd865d29e3f4e3f871a6df498e280fc4e2d91f2d2d20c732fbd75fa88e2e8c576f86e744f7655af6bb9da66e9b28b1009c8742899 \ No newline at end of file diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index faddd4645..21c879694 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -1,25 +1,25 @@ - - - - - - - - - + + + + + + + + + - + - + @@ -27,7 +27,7 @@ - + @@ -50,197 +50,197 @@ - - 10000 + + 1 - + 0.0 0.625 20000000.0 - + 0.0 0.625 20000000.0 - - 10001 + + 2 - - 10002 + + 3 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10006 + + 1 2 7 total nu-fission analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10006 + + 1 2 7 total nu-scatter-P3 analog - - 10000 10001 10006 + + 1 2 7 total nu-scatter analog - - 10000 10001 10006 + + 1 2 7 total scatter analog - - 10013 10001 + + 14 2 total flux tracklength - - 10013 10001 + + 14 2 total total tracklength - - 10013 10001 + + 14 2 total flux tracklength - - 10013 10001 + + 14 2 total absorption tracklength - - 10013 10001 + + 14 2 total flux analog - - 10013 10001 10006 + + 14 2 7 total nu-fission analog - - 10013 10001 + + 14 2 total flux analog - - 10013 10001 10006 + + 14 2 7 total nu-scatter-P3 analog - - 10013 10001 10006 + + 14 2 7 total nu-scatter analog - - 10013 10001 10006 + + 14 2 7 total scatter analog - - 10026 10001 + + 27 2 total flux tracklength - - 10026 10001 + + 27 2 total total tracklength - - 10026 10001 + + 27 2 total flux tracklength - - 10026 10001 + + 27 2 total absorption tracklength - - 10026 10001 + + 27 2 total flux analog - - 10026 10001 10006 + + 27 2 7 total nu-fission analog - - 10026 10001 + + 27 2 total flux analog - - 10026 10001 10006 + + 27 2 7 total nu-scatter-P3 analog - - 10026 10001 10006 + + 27 2 7 total nu-scatter analog - - 10026 10001 10006 + + 27 2 7 total scatter analog diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index f33efe863..df941a764 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1,25 +1,25 @@ - - - - - - - - - + + + + + + + + + - + - + @@ -27,7 +27,7 @@ - + @@ -50,1139 +50,1139 @@ - - 10000 + + 1 - + 0.0 0.625 20000000.0 - + 0.0 0.625 20000000.0 - + 0.0 20000000.0 - + 1 2 3 4 5 6 - - 10001 + + 2 - - 10002 + + 3 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total nu-scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total kappa-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 + + 1 2 total nu-scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-fission analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-0 analog - - 10000 10001 10004 + + 1 2 5 total scatter-0 analog - - 10000 10045 + + 1 46 total nu-fission analog - - 10000 10004 + + 1 5 total nu-fission analog - - 10000 10045 + + 1 46 total prompt-nu-fission analog - - 10000 10004 + + 1 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total inverse-velocity tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total prompt-nu-fission tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10045 + + 1 59 46 total delayed-nu-fission analog - - 10000 10058 10004 + + 1 59 5 total delayed-nu-fission analog - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total decay-rate tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10058 10001 10004 + + 1 59 2 5 total delayed-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10004 + + 74 5 total scatter-1 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10004 + + 74 5 total nu-scatter-1 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total absorption tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total absorption tracklength - - 10073 10001 + + 74 2 total fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total nu-fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total kappa-fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 + + 74 2 total nu-scatter analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter-P3 analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter analog - - 10073 10001 10004 + + 74 2 5 total scatter analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total nu-fission analog - - 10073 10001 10004 + + 74 2 5 total scatter analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter-0 analog - - 10073 10001 10004 + + 74 2 5 total scatter-0 analog - - 10073 10045 + + 74 46 total nu-fission analog - - 10073 10004 + + 74 5 total nu-fission analog - - 10073 10045 + + 74 46 total prompt-nu-fission analog - - 10073 10004 + + 74 5 total prompt-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total inverse-velocity tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total prompt-nu-fission tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total prompt-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10045 + + 74 59 46 total delayed-nu-fission analog - - 10073 10058 10004 + + 74 59 5 total delayed-nu-fission analog - - 10073 10001 + + 74 2 total nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total decay-rate tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10058 10001 10004 + + 74 59 2 5 total delayed-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10004 + + 147 5 total scatter-1 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10004 + + 147 5 total nu-scatter-1 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total absorption tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total absorption tracklength - - 10146 10001 + + 147 2 total fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total nu-fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total kappa-fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 + + 147 2 total nu-scatter analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter-P3 analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter analog - - 10146 10001 10004 + + 147 2 5 total scatter analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total nu-fission analog - - 10146 10001 10004 + + 147 2 5 total scatter analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter-0 analog - - 10146 10001 10004 + + 147 2 5 total scatter-0 analog - - 10146 10045 + + 147 46 total nu-fission analog - - 10146 10004 + + 147 5 total nu-fission analog - - 10146 10045 + + 147 46 total prompt-nu-fission analog - - 10146 10004 + + 147 5 total prompt-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total inverse-velocity tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total prompt-nu-fission tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total prompt-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10045 + + 147 59 46 total delayed-nu-fission analog - - 10146 10058 10004 + + 147 59 5 total delayed-nu-fission analog - - 10146 10001 + + 147 2 total nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total decay-rate tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10058 10001 10004 + + 147 59 2 5 total delayed-nu-fission analog diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index f69814444..0c9adedb1 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,273 +1,273 @@ material group in nuclide mean std. dev. -0 10000 1 total 0.453624 0.021053 +0 1 1 total 0.453624 0.021053 material group in nuclide mean std. dev. -0 10000 1 total 0.4074 0.021863 +0 1 1 total 0.4074 0.021863 material group in nuclide mean std. dev. -0 10000 1 total 0.4074 0.021863 +0 1 1 total 0.4074 0.021863 material group in nuclide mean std. dev. -0 10000 1 total 0.064903 0.004313 +0 1 1 total 0.064903 0.004313 material group in nuclide mean std. dev. -0 10000 1 total 0.028048 0.00458 +0 1 1 total 0.028048 0.00458 material group in nuclide mean std. dev. -0 10000 1 total 0.036855 0.002622 +0 1 1 total 0.036855 0.002622 material group in nuclide mean std. dev. -0 10000 1 total 0.090649 0.00641 +0 1 1 total 0.090649 0.00641 material group in nuclide mean std. dev. -0 10000 1 total 7.137954e+06 507363.468222 +0 1 1 total 7.137954e+06 507363.468222 material group in nuclide mean std. dev. -0 10000 1 total 0.388721 0.01783 +0 1 1 total 0.388721 0.01783 material group in nuclide mean std. dev. -0 10000 1 total 0.389304 0.023076 +0 1 1 total 0.389304 0.023076 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.389304 0.023146 -1 10000 1 1 total P1 0.046224 0.005907 -2 10000 1 1 total P2 0.017984 0.002883 -3 10000 1 1 total P3 0.006628 0.002457 +0 1 1 1 total P0 0.389304 0.023146 +1 1 1 1 total P1 0.046224 0.005907 +2 1 1 1 total P2 0.017984 0.002883 +3 1 1 1 total P3 0.006628 0.002457 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.389304 0.023146 -1 10000 1 1 total P1 0.046224 0.005907 -2 10000 1 1 total P2 0.017984 0.002883 -3 10000 1 1 total P3 0.006628 0.002457 +0 1 1 1 total P0 0.389304 0.023146 +1 1 1 1 total P1 0.046224 0.005907 +2 1 1 1 total P2 0.017984 0.002883 +3 1 1 1 total P3 0.006628 0.002457 material group in group out nuclide mean std. dev. -0 10000 1 1 total 1.0 0.066111 +0 1 1 1 total 1.0 0.066111 material group in group out nuclide mean std. dev. -0 10000 1 1 total 0.085835 0.005592 +0 1 1 1 total 0.085835 0.005592 material group in group out nuclide mean std. dev. -0 10000 1 1 total 1.0 0.066111 +0 1 1 1 total 1.0 0.066111 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.388721 0.031279 -1 10000 1 1 total P1 0.046155 0.006407 -2 10000 1 1 total P2 0.017957 0.003039 -3 10000 1 1 total P3 0.006618 0.002480 +0 1 1 1 total P0 0.388721 0.031279 +1 1 1 1 total P1 0.046155 0.006407 +2 1 1 1 total P2 0.017957 0.003039 +3 1 1 1 total P3 0.006618 0.002480 material group in group out nuclide moment mean std. dev. -0 10000 1 1 total P0 0.388721 0.040482 -1 10000 1 1 total P1 0.046155 0.007097 -2 10000 1 1 total P2 0.017957 0.003262 -3 10000 1 1 total P3 0.006618 0.002518 +0 1 1 1 total P0 0.388721 0.040482 +1 1 1 1 total P1 0.046155 0.007097 +2 1 1 1 total P2 0.017957 0.003262 +3 1 1 1 total P3 0.006618 0.002518 material group out nuclide mean std. dev. -0 10000 1 total 1.0 0.046071 +0 1 1 total 1.0 0.046071 material group out nuclide mean std. dev. -0 10000 1 total 1.0 0.051471 +0 1 1 total 1.0 0.051471 material group in nuclide mean std. dev. -0 10000 1 total 4.996730e-07 3.650633e-08 +0 1 1 total 4.996730e-07 3.650633e-08 material group in nuclide mean std. dev. -0 10000 1 total 0.090004 0.006367 +0 1 1 total 0.090004 0.006367 material group in group out nuclide mean std. dev. -0 10000 1 1 total 0.084542 0.005716 +0 1 1 1 total 0.084542 0.005716 material delayedgroup group in nuclide mean std. dev. -0 10000 1 1 total 0.000021 0.000001 -1 10000 2 1 total 0.000110 0.000008 -2 10000 3 1 total 0.000107 0.000007 -3 10000 4 1 total 0.000249 0.000017 -4 10000 5 1 total 0.000112 0.000007 -5 10000 6 1 total 0.000046 0.000003 +0 1 1 1 total 0.000021 0.000001 +1 1 2 1 total 0.000110 0.000008 +2 1 3 1 total 0.000107 0.000007 +3 1 4 1 total 0.000249 0.000017 +4 1 5 1 total 0.000112 0.000007 +5 1 6 1 total 0.000046 0.000003 material delayedgroup group out nuclide mean std. dev. -0 10000 1 1 total 0.0 0.000000 -1 10000 2 1 total 1.0 0.869128 -2 10000 3 1 total 1.0 1.414214 -3 10000 4 1 total 1.0 0.360359 -4 10000 5 1 total 0.0 0.000000 -5 10000 6 1 total 0.0 0.000000 +0 1 1 1 total 0.0 0.000000 +1 1 2 1 total 1.0 0.869128 +2 1 3 1 total 1.0 1.414214 +3 1 4 1 total 1.0 0.360359 +4 1 5 1 total 0.0 0.000000 +5 1 6 1 total 0.0 0.000000 material delayedgroup group in nuclide mean std. dev. -0 10000 1 1 total 0.000227 0.000020 -1 10000 2 1 total 0.001214 0.000108 -2 10000 3 1 total 0.001184 0.000104 -3 10000 4 1 total 0.002752 0.000240 -4 10000 5 1 total 0.001231 0.000105 -5 10000 6 1 total 0.000512 0.000044 +0 1 1 1 total 0.000227 0.000020 +1 1 2 1 total 0.001214 0.000108 +2 1 3 1 total 0.001184 0.000104 +3 1 4 1 total 0.002752 0.000240 +4 1 5 1 total 0.001231 0.000105 +5 1 6 1 total 0.000512 0.000044 material delayedgroup group in nuclide mean std. dev. -0 10000 1 1 total 0.013355 0.001207 -1 10000 2 1 total 0.032600 0.002866 -2 10000 3 1 total 0.121083 0.010442 -3 10000 4 1 total 0.305910 0.025627 -4 10000 5 1 total 0.861934 0.068281 -5 10000 6 1 total 2.895065 0.230223 +0 1 1 1 total 0.013355 0.001207 +1 1 2 1 total 0.032600 0.002866 +2 1 3 1 total 0.121083 0.010442 +3 1 4 1 total 0.305910 0.025627 +4 1 5 1 total 0.861934 0.068281 +5 1 6 1 total 2.895065 0.230223 material delayedgroup group in group out nuclide mean std. dev. -0 10000 1 1 1 total 0.000000 0.000000 -1 10000 2 1 1 total 0.000384 0.000236 -2 10000 3 1 1 total 0.000179 0.000180 -3 10000 4 1 1 total 0.000730 0.000188 -4 10000 5 1 1 total 0.000000 0.000000 -5 10000 6 1 1 total 0.000000 0.000000 +0 1 1 1 1 total 0.000000 0.000000 +1 1 2 1 1 total 0.000384 0.000236 +2 1 3 1 1 total 0.000179 0.000180 +3 1 4 1 1 total 0.000730 0.000188 +4 1 5 1 1 total 0.000000 0.000000 +5 1 6 1 1 total 0.000000 0.000000 material group in nuclide mean std. dev. -0 10001 1 total 0.311594 0.013793 +0 2 1 total 0.311594 0.013793 material group in nuclide mean std. dev. -0 10001 1 total 0.280977 0.015683 +0 2 1 total 0.280977 0.015683 material group in nuclide mean std. dev. -0 10001 1 total 0.280977 0.015683 +0 2 1 total 0.280977 0.015683 material group in nuclide mean std. dev. -0 10001 1 total 0.00221 0.000286 +0 2 1 total 0.00221 0.000286 material group in nuclide mean std. dev. -0 10001 1 total 0.00221 0.000286 +0 2 1 total 0.00221 0.000286 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 0.309384 0.013551 +0 2 1 total 0.309384 0.013551 material group in nuclide mean std. dev. -0 10001 1 total 0.307987 0.029308 +0 2 1 total 0.307987 0.029308 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.307987 0.029308 -1 10001 1 1 total P1 0.030617 0.007464 -2 10001 1 1 total P2 0.018911 0.004323 -3 10001 1 1 total P3 0.006235 0.003338 +0 2 1 1 total P0 0.307987 0.029308 +1 2 1 1 total P1 0.030617 0.007464 +2 2 1 1 total P2 0.018911 0.004323 +3 2 1 1 total P3 0.006235 0.003338 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.307987 0.029308 -1 10001 1 1 total P1 0.030617 0.007464 -2 10001 1 1 total P2 0.018911 0.004323 -3 10001 1 1 total P3 0.006235 0.003338 +0 2 1 1 total P0 0.307987 0.029308 +1 2 1 1 total P1 0.030617 0.007464 +2 2 1 1 total P2 0.018911 0.004323 +3 2 1 1 total P3 0.006235 0.003338 material group in group out nuclide mean std. dev. -0 10001 1 1 total 1.0 0.095039 +0 2 1 1 total 1.0 0.095039 material group in group out nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10001 1 1 total 1.0 0.095039 +0 2 1 1 total 1.0 0.095039 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.309384 0.032376 -1 10001 1 1 total P1 0.030756 0.007617 -2 10001 1 1 total P2 0.018997 0.004420 -3 10001 1 1 total P3 0.006263 0.003364 +0 2 1 1 total P0 0.309384 0.032376 +1 2 1 1 total P1 0.030756 0.007617 +2 2 1 1 total P2 0.018997 0.004420 +3 2 1 1 total P3 0.006263 0.003364 material group in group out nuclide moment mean std. dev. -0 10001 1 1 total P0 0.309384 0.043735 -1 10001 1 1 total P1 0.030756 0.008159 -2 10001 1 1 total P2 0.018997 0.004775 -3 10001 1 1 total P3 0.006263 0.003417 +0 2 1 1 total P0 0.309384 0.043735 +1 2 1 1 total P1 0.030756 0.008159 +2 2 1 1 total P2 0.018997 0.004775 +3 2 1 1 total P3 0.006263 0.003417 material group out nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group out nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10001 1 total 5.454762e-07 4.949807e-08 +0 2 1 total 5.454762e-07 4.949807e-08 material group in nuclide mean std. dev. -0 10001 1 total 0.0 0.0 +0 2 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -2 10001 3 1 total 0.0 0.0 -3 10001 4 1 total 0.0 0.0 -4 10001 5 1 total 0.0 0.0 -5 10001 6 1 total 0.0 0.0 +0 2 1 1 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +2 2 3 1 total 0.0 0.0 +3 2 4 1 total 0.0 0.0 +4 2 5 1 total 0.0 0.0 +5 2 6 1 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -0 10001 1 1 1 total 0.0 0.0 -1 10001 2 1 1 total 0.0 0.0 -2 10001 3 1 1 total 0.0 0.0 -3 10001 4 1 1 total 0.0 0.0 -4 10001 5 1 1 total 0.0 0.0 -5 10001 6 1 1 total 0.0 0.0 +0 2 1 1 1 total 0.0 0.0 +1 2 2 1 1 total 0.0 0.0 +2 2 3 1 1 total 0.0 0.0 +3 2 4 1 1 total 0.0 0.0 +4 2 5 1 1 total 0.0 0.0 +5 2 6 1 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.904999 0.043964 +0 3 1 total 0.904999 0.043964 material group in nuclide mean std. dev. -0 10002 1 total 0.494581 0.046763 +0 3 1 total 0.494581 0.046763 material group in nuclide mean std. dev. -0 10002 1 total 0.494581 0.046763 +0 3 1 total 0.494581 0.046763 material group in nuclide mean std. dev. -0 10002 1 total 0.00606 0.000555 +0 3 1 total 0.00606 0.000555 material group in nuclide mean std. dev. -0 10002 1 total 0.00606 0.000555 +0 3 1 total 0.00606 0.000555 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 0.898938 0.043493 +0 3 1 total 0.898938 0.043493 material group in nuclide mean std. dev. -0 10002 1 total 0.903415 0.043959 +0 3 1 total 0.903415 0.043959 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.903415 0.043586 -1 10002 1 1 total P1 0.410417 0.015877 -2 10002 1 1 total P2 0.143301 0.007187 -3 10002 1 1 total P3 0.008739 0.003571 +0 3 1 1 total P0 0.903415 0.043586 +1 3 1 1 total P1 0.410417 0.015877 +2 3 1 1 total P2 0.143301 0.007187 +3 3 1 1 total P3 0.008739 0.003571 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.903415 0.043586 -1 10002 1 1 total P1 0.410417 0.015877 -2 10002 1 1 total P2 0.143301 0.007187 -3 10002 1 1 total P3 0.008739 0.003571 +0 3 1 1 total P0 0.903415 0.043586 +1 3 1 1 total P1 0.410417 0.015877 +2 3 1 1 total P2 0.143301 0.007187 +3 3 1 1 total P3 0.008739 0.003571 material group in group out nuclide mean std. dev. -0 10002 1 1 total 1.0 0.056867 +0 3 1 1 total 1.0 0.056867 material group in group out nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10002 1 1 total 1.0 0.056867 +0 3 1 1 total 1.0 0.056867 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.898938 0.067118 -1 10002 1 1 total P1 0.408384 0.028127 -2 10002 1 1 total P2 0.142591 0.010824 -3 10002 1 1 total P3 0.008696 0.003588 +0 3 1 1 total P0 0.898938 0.067118 +1 3 1 1 total P1 0.408384 0.028127 +2 3 1 1 total P2 0.142591 0.010824 +3 3 1 1 total P3 0.008696 0.003588 material group in group out nuclide moment mean std. dev. -0 10002 1 1 total P0 0.898938 0.084369 -1 10002 1 1 total P1 0.408384 0.036475 -2 10002 1 1 total P2 0.142591 0.013525 -3 10002 1 1 total P3 0.008696 0.003622 +0 3 1 1 total P0 0.898938 0.084369 +1 3 1 1 total P1 0.408384 0.036475 +2 3 1 1 total P2 0.142591 0.013525 +3 3 1 1 total P3 0.008696 0.003622 material group out nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group out nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in nuclide mean std. dev. -0 10002 1 total 5.773007e-07 5.322133e-08 +0 3 1 total 5.773007e-07 5.322133e-08 material group in nuclide mean std. dev. -0 10002 1 total 0.0 0.0 +0 3 1 total 0.0 0.0 material group in group out nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -2 10002 3 1 total 0.0 0.0 -3 10002 4 1 total 0.0 0.0 -4 10002 5 1 total 0.0 0.0 -5 10002 6 1 total 0.0 0.0 +0 3 1 1 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +2 3 3 1 total 0.0 0.0 +3 3 4 1 total 0.0 0.0 +4 3 5 1 total 0.0 0.0 +5 3 6 1 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -0 10002 1 1 1 total 0.0 0.0 -1 10002 2 1 1 total 0.0 0.0 -2 10002 3 1 1 total 0.0 0.0 -3 10002 4 1 1 total 0.0 0.0 -4 10002 5 1 1 total 0.0 0.0 -5 10002 6 1 1 total 0.0 0.0 +0 3 1 1 1 total 0.0 0.0 +1 3 2 1 1 total 0.0 0.0 +2 3 3 1 1 total 0.0 0.0 +3 3 4 1 1 total 0.0 0.0 +4 3 5 1 1 total 0.0 0.0 +5 3 6 1 1 total 0.0 0.0 diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 44b7eb1d8..c844ea56a 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1,52 +1,52 @@ - - - - - - - - + + + + + + + + 1.26 1.26 17 17 -10.71 -10.71 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10000 10000 10000 -10000 10000 10000 10001 10000 10000 10000 10000 10000 10000 10000 10000 10000 10001 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10001 10000 10000 10000 10000 10000 10000 10000 10000 10000 10001 10000 10000 10000 -10000 10000 10000 10000 10000 10001 10000 10000 10001 10000 10000 10001 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 +1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 +1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - + + + + + + - + - + @@ -54,7 +54,7 @@ - + @@ -77,386 +77,386 @@ - - 10000 + + 1 - + 0.0 20000000.0 - + 0.0 20000000.0 - + 1 2 3 4 5 6 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total nu-scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total kappa-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 + + 1 2 total nu-scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-fission analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-0 analog - - 10000 10001 10004 + + 1 2 5 total scatter-0 analog - - 10000 10001 + + 1 2 total nu-fission analog - - 10000 10004 + + 1 5 total nu-fission analog - - 10000 10001 + + 1 2 total prompt-nu-fission analog - - 10000 10004 + + 1 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total inverse-velocity tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total prompt-nu-fission tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission analog - - 10000 10058 10004 + + 1 59 5 total delayed-nu-fission analog - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total decay-rate tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10058 10001 10004 + + 1 59 2 5 total delayed-nu-fission analog diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index f33efe863..df941a764 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1,25 +1,25 @@ - - - - - - - - - + + + + + + + + + - + - + @@ -27,7 +27,7 @@ - + @@ -50,1139 +50,1139 @@ - - 10000 + + 1 - + 0.0 0.625 20000000.0 - + 0.0 0.625 20000000.0 - + 0.0 20000000.0 - + 1 2 3 4 5 6 - - 10001 + + 2 - - 10002 + + 3 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total nu-scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total kappa-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 + + 1 2 total nu-scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-fission analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-0 analog - - 10000 10001 10004 + + 1 2 5 total scatter-0 analog - - 10000 10045 + + 1 46 total nu-fission analog - - 10000 10004 + + 1 5 total nu-fission analog - - 10000 10045 + + 1 46 total prompt-nu-fission analog - - 10000 10004 + + 1 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total inverse-velocity tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total prompt-nu-fission tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10045 + + 1 59 46 total delayed-nu-fission analog - - 10000 10058 10004 + + 1 59 5 total delayed-nu-fission analog - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total decay-rate tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10058 10001 10004 + + 1 59 2 5 total delayed-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10004 + + 74 5 total scatter-1 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10004 + + 74 5 total nu-scatter-1 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total absorption tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total absorption tracklength - - 10073 10001 + + 74 2 total fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total nu-fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total kappa-fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 + + 74 2 total nu-scatter analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter-P3 analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter analog - - 10073 10001 10004 + + 74 2 5 total scatter analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total nu-fission analog - - 10073 10001 10004 + + 74 2 5 total scatter analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter-0 analog - - 10073 10001 10004 + + 74 2 5 total scatter-0 analog - - 10073 10045 + + 74 46 total nu-fission analog - - 10073 10004 + + 74 5 total nu-fission analog - - 10073 10045 + + 74 46 total prompt-nu-fission analog - - 10073 10004 + + 74 5 total prompt-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total inverse-velocity tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total prompt-nu-fission tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total prompt-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10045 + + 74 59 46 total delayed-nu-fission analog - - 10073 10058 10004 + + 74 59 5 total delayed-nu-fission analog - - 10073 10001 + + 74 2 total nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total decay-rate tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10058 10001 10004 + + 74 59 2 5 total delayed-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10004 + + 147 5 total scatter-1 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10004 + + 147 5 total nu-scatter-1 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total absorption tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total absorption tracklength - - 10146 10001 + + 147 2 total fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total nu-fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total kappa-fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 + + 147 2 total nu-scatter analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter-P3 analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter analog - - 10146 10001 10004 + + 147 2 5 total scatter analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total nu-fission analog - - 10146 10001 10004 + + 147 2 5 total scatter analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter-0 analog - - 10146 10001 10004 + + 147 2 5 total scatter-0 analog - - 10146 10045 + + 147 46 total nu-fission analog - - 10146 10004 + + 147 5 total nu-fission analog - - 10146 10045 + + 147 46 total prompt-nu-fission analog - - 10146 10004 + + 147 5 total prompt-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total inverse-velocity tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total prompt-nu-fission tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total prompt-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10045 + + 147 59 46 total delayed-nu-fission analog - - 10146 10058 10004 + + 147 59 5 total delayed-nu-fission analog - - 10146 10001 + + 147 2 total nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total decay-rate tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10058 10001 10004 + + 147 59 2 5 total delayed-nu-fission analog diff --git a/tests/test_mgxs_library_hdf5/results_true.dat b/tests/test_mgxs_library_hdf5/results_true.dat index 1c9551097..18873664f 100644 --- a/tests/test_mgxs_library_hdf5/results_true.dat +++ b/tests/test_mgxs_library_hdf5/results_true.dat @@ -1,34 +1,34 @@ -domain=10000 type=total +domain=1 type=total [4.14825464e-01 6.60169863e-01] [2.27929105e-02 4.75188999e-02] -domain=10000 type=transport +domain=1 type=transport [3.63092031e-01 6.44850709e-01] [2.38384843e-02 4.76746408e-02] -domain=10000 type=nu-transport +domain=1 type=nu-transport [3.63092031e-01 6.44850709e-01] [2.38384843e-02 4.76746408e-02] -domain=10000 type=absorption +domain=1 type=absorption [2.74078431e-02 2.64510714e-01] [2.69249666e-03 2.33670618e-02] -domain=10000 type=capture +domain=1 type=capture [1.98445483e-02 7.17193458e-02] [2.64330389e-03 2.52078411e-02] -domain=10000 type=fission +domain=1 type=fission [7.56329483e-03 1.92791369e-01] [5.08483896e-04 1.71059103e-02] -domain=10000 type=nu-fission +domain=1 type=nu-fission [1.94317397e-02 4.69774728e-01] [1.32297611e-03 4.16819716e-02] -domain=10000 type=kappa-fission +domain=1 type=kappa-fission [1.47456979e+06 3.72868925e+07] [9.92353629e+04 3.30837549e+06] -domain=10000 type=scatter +domain=1 type=scatter [3.87417621e-01 3.95659148e-01] [2.06257343e-02 2.51250447e-02] -domain=10000 type=nu-scatter +domain=1 type=nu-scatter [3.85188361e-01 4.12389370e-01] [2.69456191e-02 1.54252759e-02] -domain=10000 type=scatter matrix +domain=1 type=scatter matrix [[[3.84199430e-01 5.18702806e-02 2.00688439e-02 9.47771503e-03] [9.88930322e-04 -2.07234582e-04 -1.03366173e-04 2.34290606e-04]] @@ -39,7 +39,7 @@ domain=10000 type=scatter matrix [[9.24883397e-04 7.67907131e-04 4.93918903e-04 1.71542390e-04] [1.52449343e-02 4.50172764e-03 1.05507486e-02 1.04381870e-02]]] -domain=10000 type=nu-scatter matrix +domain=1 type=nu-scatter matrix [[[3.84199430e-01 5.18702806e-02 2.00688439e-02 9.47771503e-03] [9.88930322e-04 -2.07234582e-04 -1.03366173e-04 2.34290606e-04]] @@ -50,22 +50,22 @@ domain=10000 type=nu-scatter matrix [[9.24883397e-04 7.67907131e-04 4.93918903e-04 1.71542390e-04] [1.52449343e-02 4.50172764e-03 1.05507486e-02 1.04381870e-02]]] -domain=10000 type=multiplicity matrix +domain=1 type=multiplicity matrix [[1.00000000e+00 1.00000000e+00] [1.00000000e+00 1.00000000e+00]] [[7.85164550e-02 6.87184271e-01] [1.41421356e+00 4.11303488e-02]] -domain=10000 type=nu-fission matrix +domain=1 type=nu-fission matrix [[2.01424221e-02 0.00000000e+00] [4.54366342e-01 0.00000000e+00]] [[3.14909051e-03 0.00000000e+00] [2.74255162e-02 0.00000000e+00]] -domain=10000 type=scatter probability matrix +domain=1 type=scatter probability matrix [[9.97432606e-01 2.56739409e-03] [2.24215247e-03 9.97757848e-01]] [[7.82243018e-02 1.25560869e-03] [2.24310192e-03 4.10531468e-02]] -domain=10000 type=consistent scatter matrix +domain=1 type=consistent scatter matrix [[[3.86422967e-01 5.21704775e-02 2.01849914e-02 9.53256688e-03] [9.94653712e-04 -2.08433942e-04 -1.03964400e-04 2.35646553e-04]] @@ -76,7 +76,7 @@ domain=10000 type=consistent scatter matrix [[8.89289900e-04 7.38354757e-04 4.74910776e-04 1.64940700e-04] [2.98710064e-02 4.44330993e-03 1.01307463e-02 1.00367467e-02]]] -domain=10000 type=consistent nu-scatter matrix +domain=1 type=consistent nu-scatter matrix [[[3.86422967e-01 5.21704775e-02 2.01849914e-02 9.53256688e-03] [9.94653712e-04 -2.08433942e-04 -1.03964400e-04 2.35646553e-04]] @@ -87,24 +87,24 @@ domain=10000 type=consistent nu-scatter matrix [[1.53780011e-03 1.27679627e-03 8.21237084e-04 2.85222881e-04] [3.39988352e-02 4.49065920e-03 1.01338659e-02 1.00452944e-02]]] -domain=10000 type=chi +domain=1 type=chi [1.00000000e+00 0.00000000e+00] [4.60705493e-02 0.00000000e+00] -domain=10000 type=chi-prompt +domain=1 type=chi-prompt [1.00000000e+00 0.00000000e+00] [5.14714845e-02 0.00000000e+00] -domain=10000 type=inverse-velocity +domain=1 type=inverse-velocity [5.70932437e-08 2.85573948e-06] [4.68793810e-09 2.44216368e-07] -domain=10000 type=prompt-nu-fission +domain=1 type=prompt-nu-fission [1.92392209e-02 4.66718979e-01] [1.30950644e-03 4.14108424e-02] -domain=10000 type=prompt-nu-fission matrix +domain=1 type=prompt-nu-fission matrix [[2.01424221e-02 0.00000000e+00] [4.45819055e-01 0.00000000e+00]] [[3.14909051e-03 0.00000000e+00] [2.86750878e-02 0.00000000e+00]] -domain=10000 type=delayed-nu-fission +domain=1 type=delayed-nu-fission [[4.31687649e-06 1.06974147e-04] [2.69760050e-05 5.52167849e-04] [2.84366794e-05 5.27147626e-04] @@ -117,7 +117,7 @@ domain=10000 type=delayed-nu-fission [5.22610330e-06 1.04867938e-04] [2.99830756e-06 4.29944539e-05] [1.22654681e-06 1.80102228e-05]] -domain=10000 type=chi-delayed +domain=1 type=chi-delayed [[0.00000000e+00 0.00000000e+00] [1.00000000e+00 0.00000000e+00] [1.00000000e+00 0.00000000e+00] @@ -130,7 +130,7 @@ domain=10000 type=chi-delayed [3.60359016e-01 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10000 type=beta +domain=1 type=beta [[2.22155945e-04 2.27713711e-04] [1.38824446e-03 1.17538858e-03] [1.46341397e-03 1.12212853e-03] @@ -143,7 +143,7 @@ domain=10000 type=beta [3.21434953e-04 2.72840272e-04] [1.82980531e-04 1.11860871e-04] [7.48900067e-05 4.68581181e-05]] -domain=10000 type=decay-rate +domain=1 type=decay-rate [[1.34450193e-02 1.33360001e-02] [3.20638663e-02 3.27389978e-02] [1.22136025e-01 1.20780007e-01] @@ -156,7 +156,7 @@ domain=10000 type=decay-rate [2.71748572e-02 3.28353145e-02] [7.93682892e-02 9.21238900e-02] [2.66253284e-01 3.09396760e-01]] -domain=10000 type=delayed-nu-fission matrix +domain=1 type=delayed-nu-fission matrix [[[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] @@ -191,37 +191,37 @@ domain=10000 type=delayed-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]]] -domain=10001 type=total +domain=2 type=total [3.13737666e-01 3.00821380e-01] [1.55819223e-02 2.80524816e-02] -domain=10001 type=transport +domain=2 type=transport [2.75508079e-01 3.12035015e-01] [1.77418855e-02 3.23843473e-02] -domain=10001 type=nu-transport +domain=2 type=nu-transport [2.75508079e-01 3.12035015e-01] [1.77418855e-02 3.23843473e-02] -domain=10001 type=absorption +domain=2 type=absorption [1.57499139e-03 5.40037826e-03] [3.22547919e-04 6.18139027e-04] -domain=10001 type=capture +domain=2 type=capture [1.57499139e-03 5.40037826e-03] [3.22547919e-04 6.18139027e-04] -domain=10001 type=fission +domain=2 type=fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=nu-fission +domain=2 type=nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=kappa-fission +domain=2 type=kappa-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=scatter +domain=2 type=scatter [3.12162675e-01 2.95421002e-01] [1.53219430e-02 2.74455213e-02] -domain=10001 type=nu-scatter +domain=2 type=nu-scatter [3.10120713e-01 2.96264249e-01] [3.37881037e-02 4.37922226e-02] -domain=10001 type=scatter matrix +domain=2 type=scatter matrix [[[3.10120713e-01 3.82295876e-02 2.07449405e-02 7.96429620e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -232,7 +232,7 @@ domain=10001 type=scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [4.37922226e-02 1.61803653e-02 1.15039636e-02 7.32884528e-03]]] -domain=10001 type=nu-scatter matrix +domain=2 type=nu-scatter matrix [[[3.10120713e-01 3.82295876e-02 2.07449405e-02 7.96429620e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -243,22 +243,22 @@ domain=10001 type=nu-scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [4.37922226e-02 1.61803653e-02 1.15039636e-02 7.32884528e-03]]] -domain=10001 type=multiplicity matrix +domain=2 type=multiplicity matrix [[1.00000000e+00 0.00000000e+00] [0.00000000e+00 1.00000000e+00]] [[1.08778697e-01 0.00000000e+00] [0.00000000e+00 1.42427173e-01]] -domain=10001 type=nu-fission matrix +domain=2 type=nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=scatter probability matrix +domain=2 type=scatter probability matrix [[1.00000000e+00 0.00000000e+00] [0.00000000e+00 1.00000000e+00]] [[1.08778697e-01 0.00000000e+00] [0.00000000e+00 1.42427173e-01]] -domain=10001 type=consistent scatter matrix +domain=2 type=consistent scatter matrix [[[3.12162675e-01 3.84813069e-02 2.08815337e-02 8.01673640e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -269,7 +269,7 @@ domain=10001 type=consistent scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [5.02358893e-02 1.61616720e-02 1.14951123e-02 7.31312479e-03]]] -domain=10001 type=consistent nu-scatter matrix +domain=2 type=consistent nu-scatter matrix [[[3.12162675e-01 3.84813069e-02 2.08815337e-02 8.01673640e-03] [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] @@ -280,24 +280,24 @@ domain=10001 type=consistent nu-scatter matrix [[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [6.55288678e-02 1.62399493e-02 1.15634161e-02 7.32785650e-03]]] -domain=10001 type=chi +domain=2 type=chi [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=chi-prompt +domain=2 type=chi-prompt [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=inverse-velocity +domain=2 type=inverse-velocity [5.99597929e-08 2.98549016e-06] [4.55308445e-09 3.41701982e-07] -domain=10001 type=prompt-nu-fission +domain=2 type=prompt-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10001 type=prompt-nu-fission matrix +domain=2 type=prompt-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=delayed-nu-fission +domain=2 type=delayed-nu-fission [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -310,7 +310,7 @@ domain=10001 type=delayed-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=chi-delayed +domain=2 type=chi-delayed [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -323,7 +323,7 @@ domain=10001 type=chi-delayed [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=beta +domain=2 type=beta [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -336,7 +336,7 @@ domain=10001 type=beta [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=decay-rate +domain=2 type=decay-rate [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -349,7 +349,7 @@ domain=10001 type=decay-rate [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10001 type=delayed-nu-fission matrix +domain=2 type=delayed-nu-fission matrix [[[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] @@ -384,37 +384,37 @@ domain=10001 type=delayed-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]]] -domain=10002 type=total +domain=3 type=total [6.64572195e-01 2.05238389e+00] [3.12147473e-02 2.24342891e-01] -domain=10002 type=transport +domain=3 type=transport [2.83322749e-01 1.49973953e+00] [3.52061127e-02 2.30902118e-01] -domain=10002 type=nu-transport +domain=3 type=nu-transport [2.83322749e-01 1.49973953e+00] [3.52061127e-02 2.30902118e-01] -domain=10002 type=absorption +domain=3 type=absorption [6.90399495e-04 3.16872549e-02] [4.41475663e-05 3.74655831e-03] -domain=10002 type=capture +domain=3 type=capture [6.90399495e-04 3.16872549e-02] [4.41475663e-05 3.74655831e-03] -domain=10002 type=fission +domain=3 type=fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=nu-fission +domain=3 type=nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=kappa-fission +domain=3 type=kappa-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=scatter +domain=3 type=scatter [6.63881795e-01 2.02069663e+00] [3.11726794e-02 2.20604438e-01] -domain=10002 type=nu-scatter +domain=3 type=nu-scatter [6.71269157e-01 2.03538818e+00] [2.61863693e-02 2.58060310e-01] -domain=10002 type=scatter matrix +domain=3 type=scatter matrix [[[6.39901439e-01 3.81167422e-01 1.52391887e-01 9.14802163e-03] [3.13677176e-02 8.75772258e-03 -2.56790088e-03 -3.78480261e-03]] @@ -425,7 +425,7 @@ domain=10002 type=scatter matrix [[4.44850361e-04 4.01320154e-04 3.20649120e-04 2.14573982e-04] [2.57799870e-01 5.12359026e-02 1.30198161e-02 8.31235197e-03]]] -domain=10002 type=nu-scatter matrix +domain=3 type=nu-scatter matrix [[[6.39901439e-01 3.81167422e-01 1.52391887e-01 9.14802163e-03] [3.13677176e-02 8.75772258e-03 -2.56790088e-03 -3.78480261e-03]] @@ -436,22 +436,22 @@ domain=10002 type=nu-scatter matrix [[4.44850361e-04 4.01320154e-04 3.20649120e-04 2.14573982e-04] [2.57799870e-01 5.12359026e-02 1.30198161e-02 8.31235197e-03]]] -domain=10002 type=multiplicity matrix +domain=3 type=multiplicity matrix [[1.00000000e+00 1.00000000e+00] [1.00000000e+00 1.00000000e+00]] [[3.86091908e-02 6.76673480e-02] [1.41421356e+00 1.35929207e-01]] -domain=10002 type=nu-fission matrix +domain=3 type=nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=scatter probability matrix +domain=3 type=scatter probability matrix [[9.53271028e-01 4.67289720e-02] [2.17817469e-04 9.99782183e-01]] [[3.60184962e-02 2.54736726e-03] [2.18820864e-04 1.35884974e-01]] -domain=10002 type=consistent scatter matrix +domain=3 type=consistent scatter matrix [[[6.32859281e-01 3.76972649e-01 1.50714804e-01 9.04734705e-03] [3.10225138e-02 8.66134326e-03 -2.53964096e-03 -3.74315061e-03]] @@ -462,7 +462,7 @@ domain=10002 type=consistent scatter matrix [[4.44773843e-04 4.01251123e-04 3.20593966e-04 2.14537073e-04] [3.52193929e-01 7.91402819e-02 1.84875925e-02 8.77085752e-03]]] -domain=10002 type=consistent nu-scatter matrix +domain=3 type=consistent nu-scatter matrix [[[6.32859281e-01 3.76972649e-01 1.50714804e-01 9.04734705e-03] [3.10225138e-02 8.66134326e-03 -2.53964096e-03 -3.74315061e-03]] @@ -473,24 +473,24 @@ domain=10002 type=consistent nu-scatter matrix [[7.65033031e-04 6.90171798e-04 5.51437493e-04 3.69014387e-04] [4.46600759e-01 1.04874946e-01 2.38091367e-02 9.39676938e-03]]] -domain=10002 type=chi +domain=3 type=chi [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=chi-prompt +domain=3 type=chi-prompt [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=inverse-velocity +domain=3 type=inverse-velocity [6.02207835e-08 3.04495548e-06] [3.78043705e-09 3.60007679e-07] -domain=10002 type=prompt-nu-fission +domain=3 type=prompt-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] -domain=10002 type=prompt-nu-fission matrix +domain=3 type=prompt-nu-fission matrix [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=delayed-nu-fission +domain=3 type=delayed-nu-fission [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -503,7 +503,7 @@ domain=10002 type=delayed-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=chi-delayed +domain=3 type=chi-delayed [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -516,7 +516,7 @@ domain=10002 type=chi-delayed [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=beta +domain=3 type=beta [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -529,7 +529,7 @@ domain=10002 type=beta [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=decay-rate +domain=3 type=decay-rate [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -542,7 +542,7 @@ domain=10002 type=decay-rate [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] -domain=10002 type=delayed-nu-fission matrix +domain=3 type=delayed-nu-fission matrix [[[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 365c4a2af..0a4271256 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -314,386 +314,386 @@ -100.0 -100.0 100.0 100.0 - + 1 - + 0.0 20000000.0 - + 0.0 20000000.0 - + 1 2 3 4 5 6 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total nu-scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total kappa-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 + + 1 2 total nu-scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-fission analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-0 analog - - 10000 10001 10004 + + 1 2 5 total scatter-0 analog - - 10000 10001 + + 1 2 total nu-fission analog - - 10000 10004 + + 1 5 total nu-fission analog - - 10000 10001 + + 1 2 total prompt-nu-fission analog - - 10000 10004 + + 1 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total inverse-velocity tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total prompt-nu-fission tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission analog - - 10000 10058 10004 + + 1 59 5 total delayed-nu-fission analog - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total decay-rate tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10058 10001 10004 + + 1 59 2 5 total delayed-nu-fission analog diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index f33efe863..df941a764 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1,25 +1,25 @@ - - - - - - - - - + + + + + + + + + - + - + @@ -27,7 +27,7 @@ - + @@ -50,1139 +50,1139 @@ - - 10000 + + 1 - + 0.0 0.625 20000000.0 - + 0.0 0.625 20000000.0 - + 0.0 20000000.0 - + 1 2 3 4 5 6 - - 10001 + + 2 - - 10002 + + 3 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 total nu-scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total absorption tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total kappa-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 + + 1 2 total nu-scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total nu-fission analog - - 10000 10001 10004 + + 1 2 5 total scatter analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total scatter tracklength - - 10000 10001 10004 + + 1 2 5 total scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 total nu-scatter-0 analog - - 10000 10001 10004 + + 1 2 5 total scatter-0 analog - - 10000 10045 + + 1 46 total nu-fission analog - - 10000 10004 + + 1 5 total nu-fission analog - - 10000 10045 + + 1 46 total prompt-nu-fission analog - - 10000 10004 + + 1 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total inverse-velocity tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 total prompt-nu-fission tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 total prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10045 + + 1 59 46 total delayed-nu-fission analog - - 10000 10058 10004 + + 1 59 5 total delayed-nu-fission analog - - 10000 10001 + + 1 2 total nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total delayed-nu-fission tracklength - - 10000 10058 10001 + + 1 59 2 total decay-rate tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10058 10001 10004 + + 1 59 2 5 total delayed-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10004 + + 74 5 total scatter-1 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total total tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10004 + + 74 5 total nu-scatter-1 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total absorption tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total absorption tracklength - - 10073 10001 + + 74 2 total fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total nu-fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total kappa-fission tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 + + 74 2 total nu-scatter analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter-P3 analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter analog - - 10073 10001 10004 + + 74 2 5 total scatter analog - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total nu-fission analog - - 10073 10001 10004 + + 74 2 5 total scatter analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total scatter tracklength - - 10073 10001 10004 + + 74 2 5 total scatter-P3 analog - - 10073 10001 10004 + + 74 2 5 total nu-scatter-0 analog - - 10073 10001 10004 + + 74 2 5 total scatter-0 analog - - 10073 10045 + + 74 46 total nu-fission analog - - 10073 10004 + + 74 5 total nu-fission analog - - 10073 10045 + + 74 46 total prompt-nu-fission analog - - 10073 10004 + + 74 5 total prompt-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total inverse-velocity tracklength - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10001 + + 74 2 total prompt-nu-fission tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10001 10004 + + 74 2 5 total prompt-nu-fission analog - - 10073 10001 + + 74 2 total flux tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10045 + + 74 59 46 total delayed-nu-fission analog - - 10073 10058 10004 + + 74 59 5 total delayed-nu-fission analog - - 10073 10001 + + 74 2 total nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total delayed-nu-fission tracklength - - 10073 10058 10001 + + 74 59 2 total decay-rate tracklength - - 10073 10001 + + 74 2 total flux analog - - 10073 10058 10001 10004 + + 74 59 2 5 total delayed-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10004 + + 147 5 total scatter-1 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total total tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10004 + + 147 5 total nu-scatter-1 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total absorption tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total absorption tracklength - - 10146 10001 + + 147 2 total fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total nu-fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total kappa-fission tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 + + 147 2 total nu-scatter analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter-P3 analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter analog - - 10146 10001 10004 + + 147 2 5 total scatter analog - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total nu-fission analog - - 10146 10001 10004 + + 147 2 5 total scatter analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total scatter tracklength - - 10146 10001 10004 + + 147 2 5 total scatter-P3 analog - - 10146 10001 10004 + + 147 2 5 total nu-scatter-0 analog - - 10146 10001 10004 + + 147 2 5 total scatter-0 analog - - 10146 10045 + + 147 46 total nu-fission analog - - 10146 10004 + + 147 5 total nu-fission analog - - 10146 10045 + + 147 46 total prompt-nu-fission analog - - 10146 10004 + + 147 5 total prompt-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total inverse-velocity tracklength - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10001 + + 147 2 total prompt-nu-fission tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10001 10004 + + 147 2 5 total prompt-nu-fission analog - - 10146 10001 + + 147 2 total flux tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10045 + + 147 59 46 total delayed-nu-fission analog - - 10146 10058 10004 + + 147 59 5 total delayed-nu-fission analog - - 10146 10001 + + 147 2 total nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total delayed-nu-fission tracklength - - 10146 10058 10001 + + 147 59 2 total decay-rate tracklength - - 10146 10001 + + 147 2 total flux analog - - 10146 10058 10001 10004 + + 147 59 2 5 total delayed-nu-fission analog diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index a6a0c374e..291c87dde 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,621 +1,621 @@ material group in nuclide mean std. dev. -1 10000 1 total 0.414825 0.022793 -0 10000 2 total 0.660170 0.047519 +1 1 1 total 0.414825 0.022793 +0 1 2 total 0.660170 0.047519 material group in nuclide mean std. dev. -1 10000 1 total 0.363092 0.023838 -0 10000 2 total 0.644851 0.047675 +1 1 1 total 0.363092 0.023838 +0 1 2 total 0.644851 0.047675 material group in nuclide mean std. dev. -1 10000 1 total 0.363092 0.023838 -0 10000 2 total 0.644851 0.047675 +1 1 1 total 0.363092 0.023838 +0 1 2 total 0.644851 0.047675 material group in nuclide mean std. dev. -1 10000 1 total 0.027408 0.002692 -0 10000 2 total 0.264511 0.023367 +1 1 1 total 0.027408 0.002692 +0 1 2 total 0.264511 0.023367 material group in nuclide mean std. dev. -1 10000 1 total 0.019845 0.002643 -0 10000 2 total 0.071719 0.025208 +1 1 1 total 0.019845 0.002643 +0 1 2 total 0.071719 0.025208 material group in nuclide mean std. dev. -1 10000 1 total 0.007563 0.000508 -0 10000 2 total 0.192791 0.017106 +1 1 1 total 0.007563 0.000508 +0 1 2 total 0.192791 0.017106 material group in nuclide mean std. dev. -1 10000 1 total 0.019432 0.001323 -0 10000 2 total 0.469775 0.041682 +1 1 1 total 0.019432 0.001323 +0 1 2 total 0.469775 0.041682 material group in nuclide mean std. dev. -1 10000 1 total 1.474570e+06 9.923536e+04 -0 10000 2 total 3.728689e+07 3.308375e+06 +1 1 1 total 1.474570e+06 9.923536e+04 +0 1 2 total 3.728689e+07 3.308375e+06 material group in nuclide mean std. dev. -1 10000 1 total 0.387418 0.020626 -0 10000 2 total 0.395659 0.025125 +1 1 1 total 0.387418 0.020626 +0 1 2 total 0.395659 0.025125 material group in nuclide mean std. dev. -1 10000 1 total 0.385188 0.026946 -0 10000 2 total 0.412389 0.015425 +1 1 1 total 0.385188 0.026946 +0 1 2 total 0.412389 0.015425 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.384199 0.027001 -13 10000 1 1 total P1 0.051870 0.006983 -14 10000 1 1 total P2 0.020069 0.002846 -15 10000 1 1 total P3 0.009478 0.002234 -8 10000 1 2 total P0 0.000989 0.000482 -9 10000 1 2 total P1 -0.000207 0.000149 -10 10000 1 2 total P2 -0.000103 0.000184 -11 10000 1 2 total P3 0.000234 0.000128 -4 10000 2 1 total P0 0.000925 0.000925 -5 10000 2 1 total P1 -0.000768 0.000768 -6 10000 2 1 total P2 0.000494 0.000494 -7 10000 2 1 total P3 -0.000171 0.000172 -0 10000 2 2 total P0 0.411465 0.015245 -1 10000 2 2 total P1 0.016482 0.004502 -2 10000 2 2 total P2 0.006371 0.010551 -3 10000 2 2 total P3 -0.010499 0.010438 +12 1 1 1 total P0 0.384199 0.027001 +13 1 1 1 total P1 0.051870 0.006983 +14 1 1 1 total P2 0.020069 0.002846 +15 1 1 1 total P3 0.009478 0.002234 +8 1 1 2 total P0 0.000989 0.000482 +9 1 1 2 total P1 -0.000207 0.000149 +10 1 1 2 total P2 -0.000103 0.000184 +11 1 1 2 total P3 0.000234 0.000128 +4 1 2 1 total P0 0.000925 0.000925 +5 1 2 1 total P1 -0.000768 0.000768 +6 1 2 1 total P2 0.000494 0.000494 +7 1 2 1 total P3 -0.000171 0.000172 +0 1 2 2 total P0 0.411465 0.015245 +1 1 2 2 total P1 0.016482 0.004502 +2 1 2 2 total P2 0.006371 0.010551 +3 1 2 2 total P3 -0.010499 0.010438 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.384199 0.027001 -13 10000 1 1 total P1 0.051870 0.006983 -14 10000 1 1 total P2 0.020069 0.002846 -15 10000 1 1 total P3 0.009478 0.002234 -8 10000 1 2 total P0 0.000989 0.000482 -9 10000 1 2 total P1 -0.000207 0.000149 -10 10000 1 2 total P2 -0.000103 0.000184 -11 10000 1 2 total P3 0.000234 0.000128 -4 10000 2 1 total P0 0.000925 0.000925 -5 10000 2 1 total P1 -0.000768 0.000768 -6 10000 2 1 total P2 0.000494 0.000494 -7 10000 2 1 total P3 -0.000171 0.000172 -0 10000 2 2 total P0 0.411465 0.015245 -1 10000 2 2 total P1 0.016482 0.004502 -2 10000 2 2 total P2 0.006371 0.010551 -3 10000 2 2 total P3 -0.010499 0.010438 +12 1 1 1 total P0 0.384199 0.027001 +13 1 1 1 total P1 0.051870 0.006983 +14 1 1 1 total P2 0.020069 0.002846 +15 1 1 1 total P3 0.009478 0.002234 +8 1 1 2 total P0 0.000989 0.000482 +9 1 1 2 total P1 -0.000207 0.000149 +10 1 1 2 total P2 -0.000103 0.000184 +11 1 1 2 total P3 0.000234 0.000128 +4 1 2 1 total P0 0.000925 0.000925 +5 1 2 1 total P1 -0.000768 0.000768 +6 1 2 1 total P2 0.000494 0.000494 +7 1 2 1 total P3 -0.000171 0.000172 +0 1 2 2 total P0 0.411465 0.015245 +1 1 2 2 total P1 0.016482 0.004502 +2 1 2 2 total P2 0.006371 0.010551 +3 1 2 2 total P3 -0.010499 0.010438 material group in group out nuclide mean std. dev. -3 10000 1 1 total 1.0 0.078516 -2 10000 1 2 total 1.0 0.687184 -1 10000 2 1 total 1.0 1.414214 -0 10000 2 2 total 1.0 0.041130 +3 1 1 1 total 1.0 0.078516 +2 1 1 2 total 1.0 0.687184 +1 1 2 1 total 1.0 1.414214 +0 1 2 2 total 1.0 0.041130 material group in group out nuclide mean std. dev. -3 10000 1 1 total 0.020142 0.003149 -2 10000 1 2 total 0.000000 0.000000 -1 10000 2 1 total 0.454366 0.027426 -0 10000 2 2 total 0.000000 0.000000 +3 1 1 1 total 0.020142 0.003149 +2 1 1 2 total 0.000000 0.000000 +1 1 2 1 total 0.454366 0.027426 +0 1 2 2 total 0.000000 0.000000 material group in group out nuclide mean std. dev. -3 10000 1 1 total 0.997433 0.078224 -2 10000 1 2 total 0.002567 0.001256 -1 10000 2 1 total 0.002242 0.002243 -0 10000 2 2 total 0.997758 0.041053 +3 1 1 1 total 0.997433 0.078224 +2 1 1 2 total 0.002567 0.001256 +1 1 2 1 total 0.002242 0.002243 +0 1 2 2 total 0.997758 0.041053 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.386423 0.036629 -13 10000 1 1 total P1 0.052170 0.007767 -14 10000 1 1 total P2 0.020185 0.003138 -15 10000 1 1 total P3 0.009533 0.002327 -8 10000 1 2 total P0 0.000995 0.000489 -9 10000 1 2 total P1 -0.000208 0.000150 -10 10000 1 2 total P2 -0.000104 0.000186 -11 10000 1 2 total P3 0.000236 0.000130 -4 10000 2 1 total P0 0.000887 0.000889 -5 10000 2 1 total P1 -0.000737 0.000738 -6 10000 2 1 total P2 0.000474 0.000475 -7 10000 2 1 total P3 -0.000165 0.000165 -0 10000 2 2 total P0 0.394772 0.029871 -1 10000 2 2 total P1 0.015813 0.004443 -2 10000 2 2 total P2 0.006113 0.010131 -3 10000 2 2 total P3 -0.010073 0.010037 +12 1 1 1 total P0 0.386423 0.036629 +13 1 1 1 total P1 0.052170 0.007767 +14 1 1 1 total P2 0.020185 0.003138 +15 1 1 1 total P3 0.009533 0.002327 +8 1 1 2 total P0 0.000995 0.000489 +9 1 1 2 total P1 -0.000208 0.000150 +10 1 1 2 total P2 -0.000104 0.000186 +11 1 1 2 total P3 0.000236 0.000130 +4 1 2 1 total P0 0.000887 0.000889 +5 1 2 1 total P1 -0.000737 0.000738 +6 1 2 1 total P2 0.000474 0.000475 +7 1 2 1 total P3 -0.000165 0.000165 +0 1 2 2 total P0 0.394772 0.029871 +1 1 2 2 total P1 0.015813 0.004443 +2 1 2 2 total P2 0.006113 0.010131 +3 1 2 2 total P3 -0.010073 0.010037 material group in group out nuclide moment mean std. dev. -12 10000 1 1 total P0 0.386423 0.047563 -13 10000 1 1 total P1 0.052170 0.008781 -14 10000 1 1 total P2 0.020185 0.003515 -15 10000 1 1 total P3 0.009533 0.002444 -8 10000 1 2 total P0 0.000995 0.000841 -9 10000 1 2 total P1 -0.000208 0.000208 -10 10000 1 2 total P2 -0.000104 0.000199 -11 10000 1 2 total P3 0.000236 0.000208 -4 10000 2 1 total P0 0.000887 0.001538 -5 10000 2 1 total P1 -0.000737 0.001277 -6 10000 2 1 total P2 0.000474 0.000821 -7 10000 2 1 total P3 -0.000165 0.000285 -0 10000 2 2 total P0 0.394772 0.033999 -1 10000 2 2 total P1 0.015813 0.004491 -2 10000 2 2 total P2 0.006113 0.010134 -3 10000 2 2 total P3 -0.010073 0.010045 +12 1 1 1 total P0 0.386423 0.047563 +13 1 1 1 total P1 0.052170 0.008781 +14 1 1 1 total P2 0.020185 0.003515 +15 1 1 1 total P3 0.009533 0.002444 +8 1 1 2 total P0 0.000995 0.000841 +9 1 1 2 total P1 -0.000208 0.000208 +10 1 1 2 total P2 -0.000104 0.000199 +11 1 1 2 total P3 0.000236 0.000208 +4 1 2 1 total P0 0.000887 0.001538 +5 1 2 1 total P1 -0.000737 0.001277 +6 1 2 1 total P2 0.000474 0.000821 +7 1 2 1 total P3 -0.000165 0.000285 +0 1 2 2 total P0 0.394772 0.033999 +1 1 2 2 total P1 0.015813 0.004491 +2 1 2 2 total P2 0.006113 0.010134 +3 1 2 2 total P3 -0.010073 0.010045 material group out nuclide mean std. dev. -1 10000 1 total 1.0 0.046071 -0 10000 2 total 0.0 0.000000 +1 1 1 total 1.0 0.046071 +0 1 2 total 0.0 0.000000 material group out nuclide mean std. dev. -1 10000 1 total 1.0 0.051471 -0 10000 2 total 0.0 0.000000 +1 1 1 total 1.0 0.051471 +0 1 2 total 0.0 0.000000 material group in nuclide mean std. dev. -1 10000 1 total 5.709324e-08 4.687938e-09 -0 10000 2 total 2.855739e-06 2.442164e-07 +1 1 1 total 5.709324e-08 4.687938e-09 +0 1 2 total 2.855739e-06 2.442164e-07 material group in nuclide mean std. dev. -1 10000 1 total 0.019239 0.001310 -0 10000 2 total 0.466719 0.041411 +1 1 1 total 0.019239 0.001310 +0 1 2 total 0.466719 0.041411 material group in group out nuclide mean std. dev. -3 10000 1 1 total 0.020142 0.003149 -2 10000 1 2 total 0.000000 0.000000 -1 10000 2 1 total 0.445819 0.028675 -0 10000 2 2 total 0.000000 0.000000 +3 1 1 1 total 0.020142 0.003149 +2 1 1 2 total 0.000000 0.000000 +1 1 2 1 total 0.445819 0.028675 +0 1 2 2 total 0.000000 0.000000 material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.000004 2.897486e-07 -3 10000 2 1 total 0.000027 1.850038e-06 -5 10000 3 1 total 0.000028 1.970979e-06 -7 10000 4 1 total 0.000074 5.226103e-06 -9 10000 5 1 total 0.000041 2.998308e-06 -11 10000 6 1 total 0.000017 1.226547e-06 -0 10000 1 2 total 0.000107 9.491556e-06 -2 10000 2 2 total 0.000552 4.899251e-05 -4 10000 3 2 total 0.000527 4.677253e-05 -6 10000 4 2 total 0.001182 1.048679e-04 -8 10000 5 2 total 0.000485 4.299445e-05 -10 10000 6 2 total 0.000203 1.801022e-05 +1 1 1 1 total 0.000004 2.897486e-07 +3 1 2 1 total 0.000027 1.850038e-06 +5 1 3 1 total 0.000028 1.970979e-06 +7 1 4 1 total 0.000074 5.226103e-06 +9 1 5 1 total 0.000041 2.998308e-06 +11 1 6 1 total 0.000017 1.226547e-06 +0 1 1 2 total 0.000107 9.491556e-06 +2 1 2 2 total 0.000552 4.899251e-05 +4 1 3 2 total 0.000527 4.677253e-05 +6 1 4 2 total 0.001182 1.048679e-04 +8 1 5 2 total 0.000485 4.299445e-05 +10 1 6 2 total 0.000203 1.801022e-05 material delayedgroup group out nuclide mean std. dev. -1 10000 1 1 total 0.0 0.000000 -3 10000 2 1 total 1.0 0.869128 -5 10000 3 1 total 1.0 1.414214 -7 10000 4 1 total 1.0 0.360359 -9 10000 5 1 total 0.0 0.000000 -11 10000 6 1 total 0.0 0.000000 -0 10000 1 2 total 0.0 0.000000 -2 10000 2 2 total 0.0 0.000000 -4 10000 3 2 total 0.0 0.000000 -6 10000 4 2 total 0.0 0.000000 -8 10000 5 2 total 0.0 0.000000 -10 10000 6 2 total 0.0 0.000000 +1 1 1 1 total 0.0 0.000000 +3 1 2 1 total 1.0 0.869128 +5 1 3 1 total 1.0 1.414214 +7 1 4 1 total 1.0 0.360359 +9 1 5 1 total 0.0 0.000000 +11 1 6 1 total 0.0 0.000000 +0 1 1 2 total 0.0 0.000000 +2 1 2 2 total 0.0 0.000000 +4 1 3 2 total 0.0 0.000000 +6 1 4 2 total 0.0 0.000000 +8 1 5 2 total 0.0 0.000000 +10 1 6 2 total 0.0 0.000000 material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.000222 0.000018 -3 10000 2 1 total 0.001388 0.000115 -5 10000 3 1 total 0.001463 0.000122 -7 10000 4 1 total 0.003822 0.000321 -9 10000 5 1 total 0.002135 0.000183 -11 10000 6 1 total 0.000875 0.000075 -0 10000 1 2 total 0.000228 0.000025 -2 10000 2 2 total 0.001175 0.000127 -4 10000 3 2 total 0.001122 0.000122 -6 10000 4 2 total 0.002516 0.000273 -8 10000 5 2 total 0.001031 0.000112 -10 10000 6 2 total 0.000432 0.000047 +1 1 1 1 total 0.000222 0.000018 +3 1 2 1 total 0.001388 0.000115 +5 1 3 1 total 0.001463 0.000122 +7 1 4 1 total 0.003822 0.000321 +9 1 5 1 total 0.002135 0.000183 +11 1 6 1 total 0.000875 0.000075 +0 1 1 2 total 0.000228 0.000025 +2 1 2 2 total 0.001175 0.000127 +4 1 3 2 total 0.001122 0.000122 +6 1 4 2 total 0.002516 0.000273 +8 1 5 2 total 0.001031 0.000112 +10 1 6 2 total 0.000432 0.000047 material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.013445 0.001084 -3 10000 2 1 total 0.032064 0.002658 -5 10000 3 1 total 0.122136 0.010296 -7 10000 4 1 total 0.315269 0.027175 -9 10000 5 1 total 0.889233 0.079368 -11 10000 6 1 total 2.989404 0.266253 -0 10000 1 2 total 0.013336 0.001446 -2 10000 2 2 total 0.032739 0.003550 -4 10000 3 2 total 0.120780 0.013098 -6 10000 4 2 total 0.302780 0.032835 -8 10000 5 2 total 0.849490 0.092124 -10 10000 6 2 total 2.853001 0.309397 +1 1 1 1 total 0.013445 0.001084 +3 1 2 1 total 0.032064 0.002658 +5 1 3 1 total 0.122136 0.010296 +7 1 4 1 total 0.315269 0.027175 +9 1 5 1 total 0.889233 0.079368 +11 1 6 1 total 2.989404 0.266253 +0 1 1 2 total 0.013336 0.001446 +2 1 2 2 total 0.032739 0.003550 +4 1 3 2 total 0.120780 0.013098 +6 1 4 2 total 0.302780 0.032835 +8 1 5 2 total 0.849490 0.092124 +10 1 6 2 total 2.853001 0.309397 material delayedgroup group in group out nuclide mean std. dev. -3 10000 1 1 1 total 0.000000 0.000000 -7 10000 2 1 1 total 0.000000 0.000000 -11 10000 3 1 1 total 0.000000 0.000000 -15 10000 4 1 1 total 0.000000 0.000000 -19 10000 5 1 1 total 0.000000 0.000000 -23 10000 6 1 1 total 0.000000 0.000000 -2 10000 1 1 2 total 0.000000 0.000000 -6 10000 2 1 2 total 0.000000 0.000000 -10 10000 3 1 2 total 0.000000 0.000000 -14 10000 4 1 2 total 0.000000 0.000000 -18 10000 5 1 2 total 0.000000 0.000000 -22 10000 6 1 2 total 0.000000 0.000000 -1 10000 1 2 1 total 0.000000 0.000000 -5 10000 2 2 1 total 0.002538 0.001561 -9 10000 3 2 1 total 0.001186 0.001186 -13 10000 4 2 1 total 0.004823 0.001234 -17 10000 5 2 1 total 0.000000 0.000000 -21 10000 6 2 1 total 0.000000 0.000000 -0 10000 1 2 2 total 0.000000 0.000000 -4 10000 2 2 2 total 0.000000 0.000000 -8 10000 3 2 2 total 0.000000 0.000000 -12 10000 4 2 2 total 0.000000 0.000000 -16 10000 5 2 2 total 0.000000 0.000000 -20 10000 6 2 2 total 0.000000 0.000000 +3 1 1 1 1 total 0.000000 0.000000 +7 1 2 1 1 total 0.000000 0.000000 +11 1 3 1 1 total 0.000000 0.000000 +15 1 4 1 1 total 0.000000 0.000000 +19 1 5 1 1 total 0.000000 0.000000 +23 1 6 1 1 total 0.000000 0.000000 +2 1 1 1 2 total 0.000000 0.000000 +6 1 2 1 2 total 0.000000 0.000000 +10 1 3 1 2 total 0.000000 0.000000 +14 1 4 1 2 total 0.000000 0.000000 +18 1 5 1 2 total 0.000000 0.000000 +22 1 6 1 2 total 0.000000 0.000000 +1 1 1 2 1 total 0.000000 0.000000 +5 1 2 2 1 total 0.002538 0.001561 +9 1 3 2 1 total 0.001186 0.001186 +13 1 4 2 1 total 0.004823 0.001234 +17 1 5 2 1 total 0.000000 0.000000 +21 1 6 2 1 total 0.000000 0.000000 +0 1 1 2 2 total 0.000000 0.000000 +4 1 2 2 2 total 0.000000 0.000000 +8 1 3 2 2 total 0.000000 0.000000 +12 1 4 2 2 total 0.000000 0.000000 +16 1 5 2 2 total 0.000000 0.000000 +20 1 6 2 2 total 0.000000 0.000000 material group in nuclide mean std. dev. -1 10001 1 total 0.313738 0.015582 -0 10001 2 total 0.300821 0.028052 +1 2 1 total 0.313738 0.015582 +0 2 2 total 0.300821 0.028052 material group in nuclide mean std. dev. -1 10001 1 total 0.275508 0.017742 -0 10001 2 total 0.312035 0.032384 +1 2 1 total 0.275508 0.017742 +0 2 2 total 0.312035 0.032384 material group in nuclide mean std. dev. -1 10001 1 total 0.275508 0.017742 -0 10001 2 total 0.312035 0.032384 +1 2 1 total 0.275508 0.017742 +0 2 2 total 0.312035 0.032384 material group in nuclide mean std. dev. -1 10001 1 total 0.001575 0.000323 -0 10001 2 total 0.005400 0.000618 +1 2 1 total 0.001575 0.000323 +0 2 2 total 0.005400 0.000618 material group in nuclide mean std. dev. -1 10001 1 total 0.001575 0.000323 -0 10001 2 total 0.005400 0.000618 +1 2 1 total 0.001575 0.000323 +0 2 2 total 0.005400 0.000618 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 0.312163 0.015322 -0 10001 2 total 0.295421 0.027446 +1 2 1 total 0.312163 0.015322 +0 2 2 total 0.295421 0.027446 material group in nuclide mean std. dev. -1 10001 1 total 0.310121 0.033788 -0 10001 2 total 0.296264 0.043792 +1 2 1 total 0.310121 0.033788 +0 2 2 total 0.296264 0.043792 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.310121 0.033788 -13 10001 1 1 total P1 0.038230 0.008484 -14 10001 1 1 total P2 0.020745 0.004696 -15 10001 1 1 total P3 0.007964 0.003732 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.296264 0.043792 -1 10001 2 2 total P1 -0.011214 0.016180 -2 10001 2 2 total P2 0.008837 0.011504 -3 10001 2 2 total P3 -0.003270 0.007329 +12 2 1 1 total P0 0.310121 0.033788 +13 2 1 1 total P1 0.038230 0.008484 +14 2 1 1 total P2 0.020745 0.004696 +15 2 1 1 total P3 0.007964 0.003732 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.296264 0.043792 +1 2 2 2 total P1 -0.011214 0.016180 +2 2 2 2 total P2 0.008837 0.011504 +3 2 2 2 total P3 -0.003270 0.007329 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.310121 0.033788 -13 10001 1 1 total P1 0.038230 0.008484 -14 10001 1 1 total P2 0.020745 0.004696 -15 10001 1 1 total P3 0.007964 0.003732 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.296264 0.043792 -1 10001 2 2 total P1 -0.011214 0.016180 -2 10001 2 2 total P2 0.008837 0.011504 -3 10001 2 2 total P3 -0.003270 0.007329 +12 2 1 1 total P0 0.310121 0.033788 +13 2 1 1 total P1 0.038230 0.008484 +14 2 1 1 total P2 0.020745 0.004696 +15 2 1 1 total P3 0.007964 0.003732 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.296264 0.043792 +1 2 2 2 total P1 -0.011214 0.016180 +2 2 2 2 total P2 0.008837 0.011504 +3 2 2 2 total P3 -0.003270 0.007329 material group in group out nuclide mean std. dev. -3 10001 1 1 total 1.0 0.108779 -2 10001 1 2 total 0.0 0.000000 -1 10001 2 1 total 0.0 0.000000 -0 10001 2 2 total 1.0 0.142427 +3 2 1 1 total 1.0 0.108779 +2 2 1 2 total 0.0 0.000000 +1 2 2 1 total 0.0 0.000000 +0 2 2 2 total 1.0 0.142427 material group in group out nuclide mean std. dev. -3 10001 1 1 total 0.0 0.0 -2 10001 1 2 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -0 10001 2 2 total 0.0 0.0 +3 2 1 1 total 0.0 0.0 +2 2 1 2 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +0 2 2 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10001 1 1 total 1.0 0.108779 -2 10001 1 2 total 0.0 0.000000 -1 10001 2 1 total 0.0 0.000000 -0 10001 2 2 total 1.0 0.142427 +3 2 1 1 total 1.0 0.108779 +2 2 1 2 total 0.0 0.000000 +1 2 2 1 total 0.0 0.000000 +0 2 2 2 total 1.0 0.142427 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.312163 0.037253 -13 10001 1 1 total P1 0.038481 0.008743 -14 10001 1 1 total P2 0.020882 0.004835 -15 10001 1 1 total P3 0.008017 0.003776 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.295421 0.050236 -1 10001 2 2 total P1 -0.011182 0.016162 -2 10001 2 2 total P2 0.008811 0.011495 -3 10001 2 2 total P3 -0.003261 0.007313 +12 2 1 1 total P0 0.312163 0.037253 +13 2 1 1 total P1 0.038481 0.008743 +14 2 1 1 total P2 0.020882 0.004835 +15 2 1 1 total P3 0.008017 0.003776 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.295421 0.050236 +1 2 2 2 total P1 -0.011182 0.016162 +2 2 2 2 total P2 0.008811 0.011495 +3 2 2 2 total P3 -0.003261 0.007313 material group in group out nuclide moment mean std. dev. -12 10001 1 1 total P0 0.312163 0.050407 -13 10001 1 1 total P1 0.038481 0.009693 -14 10001 1 1 total P2 0.020882 0.005342 -15 10001 1 1 total P3 0.008017 0.003876 -8 10001 1 2 total P0 0.000000 0.000000 -9 10001 1 2 total P1 0.000000 0.000000 -10 10001 1 2 total P2 0.000000 0.000000 -11 10001 1 2 total P3 0.000000 0.000000 -4 10001 2 1 total P0 0.000000 0.000000 -5 10001 2 1 total P1 0.000000 0.000000 -6 10001 2 1 total P2 0.000000 0.000000 -7 10001 2 1 total P3 0.000000 0.000000 -0 10001 2 2 total P0 0.295421 0.065529 -1 10001 2 2 total P1 -0.011182 0.016240 -2 10001 2 2 total P2 0.008811 0.011563 -3 10001 2 2 total P3 -0.003261 0.007328 +12 2 1 1 total P0 0.312163 0.050407 +13 2 1 1 total P1 0.038481 0.009693 +14 2 1 1 total P2 0.020882 0.005342 +15 2 1 1 total P3 0.008017 0.003876 +8 2 1 2 total P0 0.000000 0.000000 +9 2 1 2 total P1 0.000000 0.000000 +10 2 1 2 total P2 0.000000 0.000000 +11 2 1 2 total P3 0.000000 0.000000 +4 2 2 1 total P0 0.000000 0.000000 +5 2 2 1 total P1 0.000000 0.000000 +6 2 2 1 total P2 0.000000 0.000000 +7 2 2 1 total P3 0.000000 0.000000 +0 2 2 2 total P0 0.295421 0.065529 +1 2 2 2 total P1 -0.011182 0.016240 +2 2 2 2 total P2 0.008811 0.011563 +3 2 2 2 total P3 -0.003261 0.007328 material group out nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group out nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10001 1 total 5.995979e-08 4.553084e-09 -0 10001 2 total 2.985490e-06 3.417020e-07 +1 2 1 total 5.995979e-08 4.553084e-09 +0 2 2 total 2.985490e-06 3.417020e-07 material group in nuclide mean std. dev. -1 10001 1 total 0.0 0.0 -0 10001 2 total 0.0 0.0 +1 2 1 total 0.0 0.0 +0 2 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10001 1 1 total 0.0 0.0 -2 10001 1 2 total 0.0 0.0 -1 10001 2 1 total 0.0 0.0 -0 10001 2 2 total 0.0 0.0 +3 2 1 1 total 0.0 0.0 +2 2 1 2 total 0.0 0.0 +1 2 2 1 total 0.0 0.0 +0 2 2 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 -3 10001 2 1 total 0.0 0.0 -5 10001 3 1 total 0.0 0.0 -7 10001 4 1 total 0.0 0.0 -9 10001 5 1 total 0.0 0.0 -11 10001 6 1 total 0.0 0.0 -0 10001 1 2 total 0.0 0.0 -2 10001 2 2 total 0.0 0.0 -4 10001 3 2 total 0.0 0.0 -6 10001 4 2 total 0.0 0.0 -8 10001 5 2 total 0.0 0.0 -10 10001 6 2 total 0.0 0.0 +1 2 1 1 total 0.0 0.0 +3 2 2 1 total 0.0 0.0 +5 2 3 1 total 0.0 0.0 +7 2 4 1 total 0.0 0.0 +9 2 5 1 total 0.0 0.0 +11 2 6 1 total 0.0 0.0 +0 2 1 2 total 0.0 0.0 +2 2 2 2 total 0.0 0.0 +4 2 3 2 total 0.0 0.0 +6 2 4 2 total 0.0 0.0 +8 2 5 2 total 0.0 0.0 +10 2 6 2 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -3 10001 1 1 1 total 0.0 0.0 -7 10001 2 1 1 total 0.0 0.0 -11 10001 3 1 1 total 0.0 0.0 -15 10001 4 1 1 total 0.0 0.0 -19 10001 5 1 1 total 0.0 0.0 -23 10001 6 1 1 total 0.0 0.0 -2 10001 1 1 2 total 0.0 0.0 -6 10001 2 1 2 total 0.0 0.0 -10 10001 3 1 2 total 0.0 0.0 -14 10001 4 1 2 total 0.0 0.0 -18 10001 5 1 2 total 0.0 0.0 -22 10001 6 1 2 total 0.0 0.0 -1 10001 1 2 1 total 0.0 0.0 -5 10001 2 2 1 total 0.0 0.0 -9 10001 3 2 1 total 0.0 0.0 -13 10001 4 2 1 total 0.0 0.0 -17 10001 5 2 1 total 0.0 0.0 -21 10001 6 2 1 total 0.0 0.0 -0 10001 1 2 2 total 0.0 0.0 -4 10001 2 2 2 total 0.0 0.0 -8 10001 3 2 2 total 0.0 0.0 -12 10001 4 2 2 total 0.0 0.0 -16 10001 5 2 2 total 0.0 0.0 -20 10001 6 2 2 total 0.0 0.0 +3 2 1 1 1 total 0.0 0.0 +7 2 2 1 1 total 0.0 0.0 +11 2 3 1 1 total 0.0 0.0 +15 2 4 1 1 total 0.0 0.0 +19 2 5 1 1 total 0.0 0.0 +23 2 6 1 1 total 0.0 0.0 +2 2 1 1 2 total 0.0 0.0 +6 2 2 1 2 total 0.0 0.0 +10 2 3 1 2 total 0.0 0.0 +14 2 4 1 2 total 0.0 0.0 +18 2 5 1 2 total 0.0 0.0 +22 2 6 1 2 total 0.0 0.0 +1 2 1 2 1 total 0.0 0.0 +5 2 2 2 1 total 0.0 0.0 +9 2 3 2 1 total 0.0 0.0 +13 2 4 2 1 total 0.0 0.0 +17 2 5 2 1 total 0.0 0.0 +21 2 6 2 1 total 0.0 0.0 +0 2 1 2 2 total 0.0 0.0 +4 2 2 2 2 total 0.0 0.0 +8 2 3 2 2 total 0.0 0.0 +12 2 4 2 2 total 0.0 0.0 +16 2 5 2 2 total 0.0 0.0 +20 2 6 2 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.664572 0.031215 -0 10002 2 total 2.052384 0.224343 +1 3 1 total 0.664572 0.031215 +0 3 2 total 2.052384 0.224343 material group in nuclide mean std. dev. -1 10002 1 total 0.283323 0.035206 -0 10002 2 total 1.499740 0.230902 +1 3 1 total 0.283323 0.035206 +0 3 2 total 1.499740 0.230902 material group in nuclide mean std. dev. -1 10002 1 total 0.283323 0.035206 -0 10002 2 total 1.499740 0.230902 +1 3 1 total 0.283323 0.035206 +0 3 2 total 1.499740 0.230902 material group in nuclide mean std. dev. -1 10002 1 total 0.000690 0.000044 -0 10002 2 total 0.031687 0.003747 +1 3 1 total 0.000690 0.000044 +0 3 2 total 0.031687 0.003747 material group in nuclide mean std. dev. -1 10002 1 total 0.000690 0.000044 -0 10002 2 total 0.031687 0.003747 +1 3 1 total 0.000690 0.000044 +0 3 2 total 0.031687 0.003747 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 0.663882 0.031173 -0 10002 2 total 2.020697 0.220604 +1 3 1 total 0.663882 0.031173 +0 3 2 total 2.020697 0.220604 material group in nuclide mean std. dev. -1 10002 1 total 0.671269 0.026186 -0 10002 2 total 2.035388 0.258060 +1 3 1 total 0.671269 0.026186 +0 3 2 total 2.035388 0.258060 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.639901 0.024709 -13 10002 1 1 total P1 0.381167 0.016243 -14 10002 1 1 total P2 0.152392 0.008156 -15 10002 1 1 total P3 0.009148 0.003889 -8 10002 1 2 total P0 0.031368 0.001728 -9 10002 1 2 total P1 0.008758 0.000926 -10 10002 1 2 total P2 -0.002568 0.001014 -11 10002 1 2 total P3 -0.003785 0.000817 -4 10002 2 1 total P0 0.000443 0.000445 -5 10002 2 1 total P1 0.000400 0.000401 -6 10002 2 1 total P2 0.000320 0.000321 -7 10002 2 1 total P3 0.000214 0.000215 -0 10002 2 2 total P0 2.034945 0.257800 -1 10002 2 2 total P1 0.509940 0.051236 -2 10002 2 2 total P2 0.111175 0.013020 -3 10002 2 2 total P3 0.024988 0.008312 +12 3 1 1 total P0 0.639901 0.024709 +13 3 1 1 total P1 0.381167 0.016243 +14 3 1 1 total P2 0.152392 0.008156 +15 3 1 1 total P3 0.009148 0.003889 +8 3 1 2 total P0 0.031368 0.001728 +9 3 1 2 total P1 0.008758 0.000926 +10 3 1 2 total P2 -0.002568 0.001014 +11 3 1 2 total P3 -0.003785 0.000817 +4 3 2 1 total P0 0.000443 0.000445 +5 3 2 1 total P1 0.000400 0.000401 +6 3 2 1 total P2 0.000320 0.000321 +7 3 2 1 total P3 0.000214 0.000215 +0 3 2 2 total P0 2.034945 0.257800 +1 3 2 2 total P1 0.509940 0.051236 +2 3 2 2 total P2 0.111175 0.013020 +3 3 2 2 total P3 0.024988 0.008312 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.639901 0.024709 -13 10002 1 1 total P1 0.381167 0.016243 -14 10002 1 1 total P2 0.152392 0.008156 -15 10002 1 1 total P3 0.009148 0.003889 -8 10002 1 2 total P0 0.031368 0.001728 -9 10002 1 2 total P1 0.008758 0.000926 -10 10002 1 2 total P2 -0.002568 0.001014 -11 10002 1 2 total P3 -0.003785 0.000817 -4 10002 2 1 total P0 0.000443 0.000445 -5 10002 2 1 total P1 0.000400 0.000401 -6 10002 2 1 total P2 0.000320 0.000321 -7 10002 2 1 total P3 0.000214 0.000215 -0 10002 2 2 total P0 2.034945 0.257800 -1 10002 2 2 total P1 0.509940 0.051236 -2 10002 2 2 total P2 0.111175 0.013020 -3 10002 2 2 total P3 0.024988 0.008312 +12 3 1 1 total P0 0.639901 0.024709 +13 3 1 1 total P1 0.381167 0.016243 +14 3 1 1 total P2 0.152392 0.008156 +15 3 1 1 total P3 0.009148 0.003889 +8 3 1 2 total P0 0.031368 0.001728 +9 3 1 2 total P1 0.008758 0.000926 +10 3 1 2 total P2 -0.002568 0.001014 +11 3 1 2 total P3 -0.003785 0.000817 +4 3 2 1 total P0 0.000443 0.000445 +5 3 2 1 total P1 0.000400 0.000401 +6 3 2 1 total P2 0.000320 0.000321 +7 3 2 1 total P3 0.000214 0.000215 +0 3 2 2 total P0 2.034945 0.257800 +1 3 2 2 total P1 0.509940 0.051236 +2 3 2 2 total P2 0.111175 0.013020 +3 3 2 2 total P3 0.024988 0.008312 material group in group out nuclide mean std. dev. -3 10002 1 1 total 1.0 0.038609 -2 10002 1 2 total 1.0 0.067667 -1 10002 2 1 total 1.0 1.414214 -0 10002 2 2 total 1.0 0.135929 +3 3 1 1 total 1.0 0.038609 +2 3 1 2 total 1.0 0.067667 +1 3 2 1 total 1.0 1.414214 +0 3 2 2 total 1.0 0.135929 material group in group out nuclide mean std. dev. -3 10002 1 1 total 0.0 0.0 -2 10002 1 2 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -0 10002 2 2 total 0.0 0.0 +3 3 1 1 total 0.0 0.0 +2 3 1 2 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +0 3 2 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10002 1 1 total 0.953271 0.036018 -2 10002 1 2 total 0.046729 0.002547 -1 10002 2 1 total 0.000218 0.000219 -0 10002 2 2 total 0.999782 0.135885 +3 3 1 1 total 0.953271 0.036018 +2 3 1 2 total 0.046729 0.002547 +1 3 2 1 total 0.000218 0.000219 +0 3 2 2 total 0.999782 0.135885 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.632859 0.038142 -13 10002 1 1 total P1 0.376973 0.023715 -14 10002 1 1 total P2 0.150715 0.010664 -15 10002 1 1 total P3 0.009047 0.003868 -8 10002 1 2 total P0 0.031023 0.002232 -9 10002 1 2 total P1 0.008661 0.000999 -10 10002 1 2 total P2 -0.002540 0.001010 -11 10002 1 2 total P3 -0.003743 0.000826 -4 10002 2 1 total P0 0.000440 0.000445 -5 10002 2 1 total P1 0.000397 0.000401 -6 10002 2 1 total P2 0.000317 0.000321 -7 10002 2 1 total P3 0.000212 0.000215 -0 10002 2 2 total P0 2.020256 0.352194 -1 10002 2 2 total P1 0.506260 0.079140 -2 10002 2 2 total P2 0.110372 0.018488 -3 10002 2 2 total P3 0.024808 0.008771 +12 3 1 1 total P0 0.632859 0.038142 +13 3 1 1 total P1 0.376973 0.023715 +14 3 1 1 total P2 0.150715 0.010664 +15 3 1 1 total P3 0.009047 0.003868 +8 3 1 2 total P0 0.031023 0.002232 +9 3 1 2 total P1 0.008661 0.000999 +10 3 1 2 total P2 -0.002540 0.001010 +11 3 1 2 total P3 -0.003743 0.000826 +4 3 2 1 total P0 0.000440 0.000445 +5 3 2 1 total P1 0.000397 0.000401 +6 3 2 1 total P2 0.000317 0.000321 +7 3 2 1 total P3 0.000212 0.000215 +0 3 2 2 total P0 2.020256 0.352194 +1 3 2 2 total P1 0.506260 0.079140 +2 3 2 2 total P2 0.110372 0.018488 +3 3 2 2 total P3 0.024808 0.008771 material group in group out nuclide moment mean std. dev. -12 10002 1 1 total P0 0.632859 0.045297 -13 10002 1 1 total P1 0.376973 0.027825 -14 10002 1 1 total P2 0.150715 0.012148 -15 10002 1 1 total P3 0.009047 0.003884 -8 10002 1 2 total P0 0.031023 0.003064 -9 10002 1 2 total P1 0.008661 0.001159 -10 10002 1 2 total P2 -0.002540 0.001024 -11 10002 1 2 total P3 -0.003743 0.000864 -4 10002 2 1 total P0 0.000440 0.000765 -5 10002 2 1 total P1 0.000397 0.000690 -6 10002 2 1 total P2 0.000317 0.000551 -7 10002 2 1 total P3 0.000212 0.000369 -0 10002 2 2 total P0 2.020256 0.446601 -1 10002 2 2 total P1 0.506260 0.104875 -2 10002 2 2 total P2 0.110372 0.023809 -3 10002 2 2 total P3 0.024808 0.009397 +12 3 1 1 total P0 0.632859 0.045297 +13 3 1 1 total P1 0.376973 0.027825 +14 3 1 1 total P2 0.150715 0.012148 +15 3 1 1 total P3 0.009047 0.003884 +8 3 1 2 total P0 0.031023 0.003064 +9 3 1 2 total P1 0.008661 0.001159 +10 3 1 2 total P2 -0.002540 0.001024 +11 3 1 2 total P3 -0.003743 0.000864 +4 3 2 1 total P0 0.000440 0.000765 +5 3 2 1 total P1 0.000397 0.000690 +6 3 2 1 total P2 0.000317 0.000551 +7 3 2 1 total P3 0.000212 0.000369 +0 3 2 2 total P0 2.020256 0.446601 +1 3 2 2 total P1 0.506260 0.104875 +2 3 2 2 total P2 0.110372 0.023809 +3 3 2 2 total P3 0.024808 0.009397 material group out nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group out nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in nuclide mean std. dev. -1 10002 1 total 6.022078e-08 3.780437e-09 -0 10002 2 total 3.044955e-06 3.600077e-07 +1 3 1 total 6.022078e-08 3.780437e-09 +0 3 2 total 3.044955e-06 3.600077e-07 material group in nuclide mean std. dev. -1 10002 1 total 0.0 0.0 -0 10002 2 total 0.0 0.0 +1 3 1 total 0.0 0.0 +0 3 2 total 0.0 0.0 material group in group out nuclide mean std. dev. -3 10002 1 1 total 0.0 0.0 -2 10002 1 2 total 0.0 0.0 -1 10002 2 1 total 0.0 0.0 -0 10002 2 2 total 0.0 0.0 +3 3 1 1 total 0.0 0.0 +2 3 1 2 total 0.0 0.0 +1 3 2 1 total 0.0 0.0 +0 3 2 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group out nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 -3 10002 2 1 total 0.0 0.0 -5 10002 3 1 total 0.0 0.0 -7 10002 4 1 total 0.0 0.0 -9 10002 5 1 total 0.0 0.0 -11 10002 6 1 total 0.0 0.0 -0 10002 1 2 total 0.0 0.0 -2 10002 2 2 total 0.0 0.0 -4 10002 3 2 total 0.0 0.0 -6 10002 4 2 total 0.0 0.0 -8 10002 5 2 total 0.0 0.0 -10 10002 6 2 total 0.0 0.0 +1 3 1 1 total 0.0 0.0 +3 3 2 1 total 0.0 0.0 +5 3 3 1 total 0.0 0.0 +7 3 4 1 total 0.0 0.0 +9 3 5 1 total 0.0 0.0 +11 3 6 1 total 0.0 0.0 +0 3 1 2 total 0.0 0.0 +2 3 2 2 total 0.0 0.0 +4 3 3 2 total 0.0 0.0 +6 3 4 2 total 0.0 0.0 +8 3 5 2 total 0.0 0.0 +10 3 6 2 total 0.0 0.0 material delayedgroup group in group out nuclide mean std. dev. -3 10002 1 1 1 total 0.0 0.0 -7 10002 2 1 1 total 0.0 0.0 -11 10002 3 1 1 total 0.0 0.0 -15 10002 4 1 1 total 0.0 0.0 -19 10002 5 1 1 total 0.0 0.0 -23 10002 6 1 1 total 0.0 0.0 -2 10002 1 1 2 total 0.0 0.0 -6 10002 2 1 2 total 0.0 0.0 -10 10002 3 1 2 total 0.0 0.0 -14 10002 4 1 2 total 0.0 0.0 -18 10002 5 1 2 total 0.0 0.0 -22 10002 6 1 2 total 0.0 0.0 -1 10002 1 2 1 total 0.0 0.0 -5 10002 2 2 1 total 0.0 0.0 -9 10002 3 2 1 total 0.0 0.0 -13 10002 4 2 1 total 0.0 0.0 -17 10002 5 2 1 total 0.0 0.0 -21 10002 6 2 1 total 0.0 0.0 -0 10002 1 2 2 total 0.0 0.0 -4 10002 2 2 2 total 0.0 0.0 -8 10002 3 2 2 total 0.0 0.0 -12 10002 4 2 2 total 0.0 0.0 -16 10002 5 2 2 total 0.0 0.0 -20 10002 6 2 2 total 0.0 0.0 +3 3 1 1 1 total 0.0 0.0 +7 3 2 1 1 total 0.0 0.0 +11 3 3 1 1 total 0.0 0.0 +15 3 4 1 1 total 0.0 0.0 +19 3 5 1 1 total 0.0 0.0 +23 3 6 1 1 total 0.0 0.0 +2 3 1 1 2 total 0.0 0.0 +6 3 2 1 2 total 0.0 0.0 +10 3 3 1 2 total 0.0 0.0 +14 3 4 1 2 total 0.0 0.0 +18 3 5 1 2 total 0.0 0.0 +22 3 6 1 2 total 0.0 0.0 +1 3 1 2 1 total 0.0 0.0 +5 3 2 2 1 total 0.0 0.0 +9 3 3 2 1 total 0.0 0.0 +13 3 4 2 1 total 0.0 0.0 +17 3 5 2 1 total 0.0 0.0 +21 3 6 2 1 total 0.0 0.0 +0 3 1 2 2 total 0.0 0.0 +4 3 2 2 2 total 0.0 0.0 +8 3 3 2 2 total 0.0 0.0 +12 3 4 2 2 total 0.0 0.0 +16 3 5 2 2 total 0.0 0.0 +20 3 6 2 2 total 0.0 0.0 diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 72195e90b..39828be87 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1,25 +1,25 @@ - - - - - - - - - + + + + + + + + + - + - + @@ -27,7 +27,7 @@ - + @@ -50,956 +50,956 @@ - - 10000 + + 1 - + 0.0 0.625 20000000.0 - + 0.0 0.625 20000000.0 - + 0.0 20000000.0 - - 10001 + + 2 - - 10002 + + 3 - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 total tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 U234 U235 U238 O16 scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 total tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10004 + + 1 5 U234 U235 U238 O16 nu-scatter-1 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 absorption tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 absorption tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 nu-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 kappa-fission tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 scatter tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 + + 1 2 U234 U235 U238 O16 nu-scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 scatter-P3 analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 nu-scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 nu-scatter analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 scatter analog - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 nu-fission analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 scatter analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 scatter tracklength - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 scatter-P3 analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 scatter tracklength - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 scatter-P3 analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 nu-scatter-0 analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 scatter-0 analog - - 10000 10045 + + 1 46 U234 U235 U238 O16 nu-fission analog - - 10000 10004 + + 1 5 U234 U235 U238 O16 nu-fission analog - - 10000 10045 + + 1 46 U234 U235 U238 O16 prompt-nu-fission analog - - 10000 10004 + + 1 5 U234 U235 U238 O16 prompt-nu-fission analog - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 inverse-velocity tracklength - - 10000 10001 + + 1 2 total flux tracklength - - 10000 10001 + + 1 2 U234 U235 U238 O16 prompt-nu-fission tracklength - - 10000 10001 + + 1 2 total flux analog - - 10000 10001 10004 + + 1 2 5 U234 U235 U238 O16 prompt-nu-fission analog - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 total tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 total tracklength - - 10056 10001 + + 57 2 total flux analog - - 10056 10004 + + 57 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter-1 analog - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 total tracklength - - 10056 10001 + + 57 2 total flux analog - - 10056 10004 + + 57 5 Zr90 Zr91 Zr92 Zr94 Zr96 nu-scatter-1 analog - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 absorption tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 absorption tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 fission tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 fission tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 nu-fission tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 kappa-fission tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 scatter tracklength - - 10056 10001 + + 57 2 total flux analog - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 nu-scatter analog - - 10056 10001 + + 57 2 total flux analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter-P3 analog - - 10056 10001 + + 57 2 total flux analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 nu-scatter-P3 analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 nu-scatter analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter analog - - 10056 10001 + + 57 2 total flux analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 nu-fission analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter analog - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 scatter tracklength - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter-P3 analog - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 scatter tracklength - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter-P3 analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 nu-scatter-0 analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 scatter-0 analog - - 10056 10045 + + 57 46 Zr90 Zr91 Zr92 Zr94 Zr96 nu-fission analog - - 10056 10004 + + 57 5 Zr90 Zr91 Zr92 Zr94 Zr96 nu-fission analog - - 10056 10045 + + 57 46 Zr90 Zr91 Zr92 Zr94 Zr96 prompt-nu-fission analog - - 10056 10004 + + 57 5 Zr90 Zr91 Zr92 Zr94 Zr96 prompt-nu-fission analog - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 inverse-velocity tracklength - - 10056 10001 + + 57 2 total flux tracklength - - 10056 10001 + + 57 2 Zr90 Zr91 Zr92 Zr94 Zr96 prompt-nu-fission tracklength - - 10056 10001 + + 57 2 total flux analog - - 10056 10001 10004 + + 57 2 5 Zr90 Zr91 Zr92 Zr94 Zr96 prompt-nu-fission analog - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 total tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 total tracklength - - 10112 10001 + + 113 2 total flux analog - - 10112 10004 + + 113 5 H1 O16 B10 B11 scatter-1 analog - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 total tracklength - - 10112 10001 + + 113 2 total flux analog - - 10112 10004 + + 113 5 H1 O16 B10 B11 nu-scatter-1 analog - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 absorption tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 absorption tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 fission tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 fission tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 nu-fission tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 kappa-fission tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 scatter tracklength - - 10112 10001 + + 113 2 total flux analog - - 10112 10001 + + 113 2 H1 O16 B10 B11 nu-scatter analog - - 10112 10001 + + 113 2 total flux analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 scatter-P3 analog - - 10112 10001 + + 113 2 total flux analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 nu-scatter-P3 analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 nu-scatter analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 scatter analog - - 10112 10001 + + 113 2 total flux analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 nu-fission analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 scatter analog - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 scatter tracklength - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 scatter-P3 analog - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 scatter tracklength - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 scatter-P3 analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 nu-scatter-0 analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 scatter-0 analog - - 10112 10045 + + 113 46 H1 O16 B10 B11 nu-fission analog - - 10112 10004 + + 113 5 H1 O16 B10 B11 nu-fission analog - - 10112 10045 + + 113 46 H1 O16 B10 B11 prompt-nu-fission analog - - 10112 10004 + + 113 5 H1 O16 B10 B11 prompt-nu-fission analog - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 inverse-velocity tracklength - - 10112 10001 + + 113 2 total flux tracklength - - 10112 10001 + + 113 2 H1 O16 B10 B11 prompt-nu-fission tracklength - - 10112 10001 + + 113 2 total flux analog - - 10112 10001 10004 + + 113 2 5 H1 O16 B10 B11 prompt-nu-fission analog diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 1b47f7126..a0315ebbc 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -ea1c7567cb5399ab26297b5df0c1c21b52863303746d04f1698760d88b1aafb625d5743969ad30b194c353d106ed4287a8bc755ea6404c2f5dafb2ea930444a7 \ No newline at end of file +174d1593a15de41e2aba88cc4c48fc3a400314b400571a0328dfdf7482df111b3ac9701dbd196d06668b49d3acaa67d766702db0942c03140e9e004942f7bdfd \ No newline at end of file diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index fdedc5425..0be2eb89c 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1,9 +1,9 @@ - - - + + + 2.0 2.0 1 @@ -13,11 +13,11 @@ 11 11 11 11 - - - - - + + + + + @@ -48,7 +48,7 @@ - + U235 O16 total total fission (n,gamma) elastic (n,p) diff --git a/tests/test_multipole/results_true.dat b/tests/test_multipole/results_true.dat index c2111bff4..0ab4191d8 100644 --- a/tests/test_multipole/results_true.dat +++ b/tests/test_multipole/results_true.dat @@ -35,7 +35,7 @@ Cell ID = 11 Name = Fill = Material 2 - Region = -10000 + Region = -1 Rotation = None Temperature = [ 500. 0. 700. 800.] Translation = None diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index 745fd30c3..63a7931a7 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1,7 +1,7 @@ - - + + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index ed24f4652..9e452698b 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -314,192 +314,192 @@ -182.07 -182.07 182.07 182.07 - + -3.14159 -1.885 -0.6283 0.6283 1.885 3.14159 - + 1 - + 10 21 22 23 - + 1 2 3 4 5 6 - + 0.0 0.253 1000.0 1000000.0 20000000.0 - + 0.0 0.253 1000.0 1000000.0 20000000.0 - + 1 2 3 4 - + -1.0 -0.5 0.0 0.5 1.0 - + 0.0 0.6283 1.2566 1.885 2.5132 3.14159 - + 1 2 3 4 6 8 - + 10 21 22 23 60 - + 21 22 23 27 28 29 60 - - 10000 + + 1 flux tracklength - - 10000 + + 1 flux analog - - 10000 10001 + + 1 2 flux tracklength - - 10002 + + 3 total - - 10003 + + 4 delayed-nu-fission - - 10004 + + 5 total - - 10005 + + 6 scatter - - 10004 10005 + + 5 6 scatter nu-fission - - 10006 + + 7 total - - 10007 + + 8 scatter nu-scatter - - 10007 10001 + + 8 2 scatter nu-scatter - - 10008 + + 9 flux tracklength - - 10008 + + 9 flux analog - - 10008 10001 + + 9 2 flux tracklength - - 10009 + + 10 total - - 10010 + + 11 absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable tracklength - - 10010 + + 11 absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable analog - - 10010 + + 11 absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable collision - - 10011 + + 12 flux - - 10011 + + 12 flux-y5 tracklength - - 10011 + + 12 flux-y5 analog - - 10011 + + 12 flux-y5 collision - - 10010 + + 11 scatter scatter-1 scatter-2 scatter-3 scatter-4 nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - 10010 + + 11 scatter-p4 scatter-y4 nu-scatter-p4 nu-scatter-y3 - - 10010 + + 11 total - - 10010 + + 11 U235 total total-y4 tracklength - - 10010 + + 11 U235 total total-y4 analog - - 10010 + + 11 U235 total total-y4 collision - - 10010 + + 11 all total tracklength - - 10010 + + 11 all total collision - - 10001 + + 2 all total tracklength - - 10001 + + 2 U235 total tracklength diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 15071c5e4..05499cd14 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -309,14 +309,14 @@ - + 0.0 0.253 1000.0 1000000.0 20000000.0 - + 60 - - 10000 10001 + + 1 2 U234 U235 U238 nu-fission total diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index 197bc1c92..1a8888cdf 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -314,25 +314,25 @@ -160.0 -160.0 -183.0 160.0 160.0 183.0 - + 1 3 - + 0.0 2.53e-07 0.001 1.0 20.0 - + 60 - + 1 - - 10001 10000 10002 + + 2 1 3 U234 U235 nu-fission total - - 10000 10003 + + 1 4 U238 U235 total fission diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index 3ae7d29dc..e2b76aed2 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -310,37 +310,37 @@ - + 2 2 -50.0 -50.0 50.0 50.0 - + 21 27 - + 0.0 0.625 20000000.0 - + 21 - - 10000 + + 1 - - 10015 10007 + + 16 8 U235 U238 fission nu-fission tracklength - - 10005 10007 + + 6 8 U235 U238 fission nu-fission tracklength - - 10006 10007 + + 7 8 U235 U238 fission nu-fission tracklength diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 35d2675cc..ffa9ffc5e 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1,428 +1,428 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.333333333333 0.333333333333 0.333333333333 - 10029 + 38 3 3 3 -0.5 -0.5 -0.5 -10008 10009 10010 -10005 10006 10007 -10002 10003 10004 +17 18 19 +14 15 16 +11 12 13 -10017 10018 10019 -10014 10015 10016 -10011 10012 10013 +26 27 28 +23 24 25 +20 21 22 -10026 10027 10028 -10023 10024 10025 -10020 10021 10022 +35 36 37 +32 33 34 +29 30 31 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + From 8265c75cb07c08ba4ce2cb5b78528d255efca1ef Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Jun 2017 13:40:35 -0500 Subject: [PATCH 019/123] Sort XML elements by integer ID, use 2 spaces per indent level Some test results actually change because the different ordering of materials in the XML file results in a different order in which nuclides are loaded in. Because probability table sampling is sensitive to the order of nuclides, the RNG stream ends up being different. --- openmc/clean_xml.py | 6 +- tests/test_asymmetric_lattice/inputs_true.dat | 390 +-- .../test_asymmetric_lattice/results_true.dat | 2 +- .../inputs_true.dat | 50 +- tests/test_diff_tally/inputs_true.dat | 702 ++--- tests/test_diff_tally/results_true.dat | 220 +- tests/test_distribmat/inputs_true.dat | 96 +- tests/test_energy_cutoff/inputs_true.dat | 60 +- tests/test_filter_energyfun/inputs_true.dat | 476 ++-- tests/test_filter_energyfun/results_true.dat | 2 +- tests/test_filter_mesh/inputs_true.dat | 544 ++-- tests/test_filter_mesh/results_true.dat | 2 +- tests/test_iso_in_lab/inputs_true.dat | 448 ++-- tests/test_iso_in_lab/results_true.dat | 2 +- tests/test_mg_basic/inputs_true.dat | 176 +- tests/test_mg_convert/inputs_true.dat | 40 +- tests/test_mg_legendre/inputs_true.dat | 74 +- tests/test_mg_max_order/inputs_true.dat | 70 +- tests/test_mg_nuclide/inputs_true.dat | 176 +- .../test_mg_survival_biasing/inputs_true.dat | 178 +- tests/test_mg_tallies/inputs_true.dat | 434 +-- .../inputs_true.dat | 472 ++-- .../inputs_true.dat | 2356 ++++++++--------- .../inputs_true.dat | 870 +++--- tests/test_mgxs_library_hdf5/inputs_true.dat | 2356 ++++++++--------- tests/test_mgxs_library_mesh/inputs_true.dat | 1226 ++++----- tests/test_mgxs_library_mesh/results_true.dat | 472 ++-- .../inputs_true.dat | 2356 ++++++++--------- .../inputs_true.dat | 1990 +++++++------- tests/test_multipole/inputs_true.dat | 82 +- tests/test_periodic/inputs_true.dat | 56 +- .../test_resonance_scattering/inputs_true.dat | 50 +- tests/test_source/inputs_true.dat | 90 +- tests/test_tallies/inputs_true.dat | 838 +++--- tests/test_tallies/results_true.dat | 2 +- tests/test_tally_aggregation/inputs_true.dat | 470 ++-- tests/test_tally_aggregation/results_true.dat | 2 +- tests/test_tally_arithmetic/inputs_true.dat | 502 ++-- tests/test_tally_slice_merge/inputs_true.dat | 520 ++-- tests/test_tally_slice_merge/results_true.dat | 96 +- tests/test_triso/inputs_true.dat | 844 +++--- tests/test_volume_calc/inputs_true.dat | 84 +- 42 files changed, 9941 insertions(+), 9941 deletions(-) diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index 6aaf64c66..2497d0d9f 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -45,8 +45,8 @@ def sort_xml_elements(tree): key = element.get('id') # If this element has an "ID" tag, append it to the list to sort - if not key is None: - tagged_data.append((key, element)) + if key is not None: + tagged_data.append((int(key), element)) # Sort the elements according to the IDs for this tag tagged_data.sort() @@ -65,7 +65,7 @@ def sort_xml_elements(tree): tree.extend(sorted_elements) -def clean_xml_indentation(element, level=0, spaces_per_level=4): +def clean_xml_indentation(element, level=0, spaces_per_level=2): """ copy and paste from http://effbot.org/zone/elementent-lib.htm#prettyprint it basically walks your tree and adds spaces and newlines so the tree is diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index 808e9f56a..672f6bee1 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -1,19 +1,19 @@ - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -31,197 +31,197 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 3 3 - -32.13 -32.13 - + + + 21.42 21.42 + 3 3 + -32.13 -32.13 + 8 7 7 8 8 8 7 7 7 - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -32 -32 0 32 32 32 - - + eigenvalue + 100 + 10 + 5 + + + -32 -32 0 32 32 32 + + - - 27 - - - 1 - nu-fission - + + 27 + + + 1 + nu-fission + diff --git a/tests/test_asymmetric_lattice/results_true.dat b/tests/test_asymmetric_lattice/results_true.dat index 3e318c343..ef7608f2f 100644 --- a/tests/test_asymmetric_lattice/results_true.dat +++ b/tests/test_asymmetric_lattice/results_true.dat @@ -1 +1 @@ -f388c07481a7333bde8044d2e8805954ec41cc3e73d00f1b92b6acff03dad06e62a74e8b7595994e877f69a051ff34d8e498de69ac0efec6e396434007c10b0c \ No newline at end of file +3b76b468b9c0e7df6508189b75748a1b7b4f2b37486396749e1a15e536526336f70b60bb207095c39ecbd46822e8c8705ea81184a3c8546e7da09bb905d74637 \ No newline at end of file diff --git a/tests/test_create_fission_neutrons/inputs_true.dat b/tests/test_create_fission_neutrons/inputs_true.dat index b4245d2c8..9aeabbb57 100644 --- a/tests/test_create_fission_neutrons/inputs_true.dat +++ b/tests/test_create_fission_neutrons/inputs_true.dat @@ -1,37 +1,37 @@ - - - - - - - + + + + + + + - - - - - + + + + + - fixed source - 100 - 10 - - - -1 -1 -1 1 1 1 - - - - false + fixed source + 100 + 10 + + + -1 -1 -1 1 1 1 + + + + false - - flux - + + flux + diff --git a/tests/test_diff_tally/inputs_true.dat b/tests/test_diff_tally/inputs_true.dat index 624279df1..ff134bd5c 100644 --- a/tests/test_diff_tally/inputs_true.dat +++ b/tests/test_diff_tally/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,313 +127,313 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 3 - 0 - - - -160 -160 -183 160 160 183 - - - true + eigenvalue + 100 + 3 + 0 + + + -160 -160 -183 160 160 183 + + + true - - 1 3 - - - 0.0 0.625 20000000.0 - - - 1 - flux - 1 - - - 1 - flux - 2 - - - 1 - flux - 3 - - - 1 - flux - 4 - - - 1 - flux - 5 - - - 1 - total U235 - total absorption scatter fission nu-fission - 1 - - - 1 - total U235 - total absorption scatter fission nu-fission - 2 - - - 1 - total U235 - total absorption scatter fission nu-fission - 3 - - - 1 - total U235 - total absorption scatter fission nu-fission - 4 - - - 1 - total U235 - total absorption scatter fission nu-fission - 5 - - - 1 - absorption - analog - 1 - - - 1 - absorption - analog - 2 - - - 1 - absorption - analog - 3 - - - 1 - absorption - analog - 4 - - - 1 - absorption - analog - 5 - - - 1 2 - total U235 - nu-fission scatter - 1 - - - 1 2 - total U235 - nu-fission scatter - 2 - - - 1 2 - U235 - nu-fission scatter - 3 - - - 1 2 - U235 - nu-fission scatter - 4 - - - 1 2 - U235 - nu-fission scatter - 5 - - - - - - + + 1 3 + + + 0.0 0.625 20000000.0 + + + 1 + flux + 1 + + + 1 + flux + 2 + + + 1 + flux + 3 + + + 1 + flux + 4 + + + 1 + flux + 5 + + + 1 + total U235 + total absorption scatter fission nu-fission + 1 + + + 1 + total U235 + total absorption scatter fission nu-fission + 2 + + + 1 + total U235 + total absorption scatter fission nu-fission + 3 + + + 1 + total U235 + total absorption scatter fission nu-fission + 4 + + + 1 + total U235 + total absorption scatter fission nu-fission + 5 + + + 1 + absorption + analog + 1 + + + 1 + absorption + analog + 2 + + + 1 + absorption + analog + 3 + + + 1 + absorption + analog + 4 + + + 1 + absorption + analog + 5 + + + 1 2 + total U235 + nu-fission scatter + 1 + + + 1 2 + total U235 + nu-fission scatter + 2 + + + 1 2 + U235 + nu-fission scatter + 3 + + + 1 2 + U235 + nu-fission scatter + 4 + + + 1 2 + U235 + nu-fission scatter + 5 + + + + + + diff --git a/tests/test_diff_tally/results_true.dat b/tests/test_diff_tally/results_true.dat index 50e0060dc..29c906f2e 100644 --- a/tests/test_diff_tally/results_true.dat +++ b/tests/test_diff_tally/results_true.dat @@ -1,27 +1,27 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. -3,,density,flux,-7.6179773e+00,5.0326448e+00 -3,,density,flux,-1.6242019e+01,6.6231769e+00 -1,,density,flux,-2.2394711e-01,5.4534246e-02 -1,,density,flux,-5.7132388e-02,1.6898131e-01 -1,O16,nuclide_density,flux,-1.3403627e+01,1.3017120e+01 -1,O16,nuclide_density,flux,-1.0499675e+01,2.1684952e+01 -1,U235,nuclide_density,flux,-2.4741168e+03,5.7986931e+01 -1,U235,nuclide_density,flux,-1.9955529e+03,4.3254814e+02 -1,,temperature,flux,1.0601812e-04,3.3076564e-04 -1,,temperature,flux,1.6664397e-04,2.8761161e-04 -3,,density,total,-3.3161583e+00,2.5615932e+00 -3,,density,absorption,-4.3491247e-01,5.1559026e-01 -3,,density,scatter,-2.8812458e+00,2.0540304e+00 -3,,density,fission,-2.3060366e-01,3.1191112e-01 -3,,density,nu-fission,-5.6817321e-01,7.6143397e-01 -3,,density,total,-2.8908006e-01,3.9383187e-01 -3,,density,absorption,-2.5237484e-01,3.6565057e-01 -3,,density,scatter,-3.6705219e-02,2.9275369e-02 -3,,density,fission,-2.1271120e-01,3.0873701e-01 -3,,density,nu-fission,-5.1866339e-01,7.5235541e-01 -3,,density,total,2.7320555e+00,8.7709460e+00 -3,,density,absorption,8.4322459e-02,1.2807898e-01 -3,,density,scatter,2.6477331e+00,8.6432562e+00 +3,,density,flux,-4.5951022e+00,4.0201889e-01 +3,,density,flux,-9.9630192e+00,1.8897688e+00 +1,,density,flux,-4.2074596e-01,6.8569557e-02 +1,,density,flux,-2.8861314e-01,1.0032157e-01 +1,O16,nuclide_density,flux,-1.7146771e+01,1.8740496e+01 +1,O16,nuclide_density,flux,-1.4411733e+01,1.5986415e+01 +1,U235,nuclide_density,flux,-3.1082590e+03,3.5930199e+02 +1,U235,nuclide_density,flux,-2.5816702e+03,2.4275334e+02 +1,,temperature,flux,-2.2847162e-06,3.5489476e-04 +1,,temperature,flux,-8.5566667e-05,4.3023777e-04 +3,,density,total,-1.5582276e+00,2.8496759e-01 +3,,density,absorption,1.5711173e-01,1.7341244e-01 +3,,density,scatter,-1.7153393e+00,1.9431809e-01 +3,,density,fission,2.0152323e-01,7.4786095e-02 +3,,density,nu-fission,4.8687131e-01,1.8265878e-01 +3,,density,total,2.2943608e-01,8.6539576e-02 +3,,density,absorption,2.4646330e-01,8.6186628e-02 +3,,density,scatter,-1.7027217e-02,3.1732345e-03 +3,,density,fission,2.1668870e-01,7.5183313e-02 +3,,density,nu-fission,5.2774399e-01,1.8320780e-01 +3,,density,total,1.3300225e+01,4.2626034e+00 +3,,density,absorption,2.3903751e-01,8.9355264e-02 +3,,density,scatter,1.3061188e+01,4.1751261e+00 3,,density,fission,0.0000000e+00,0.0000000e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,total,0.0000000e+00,0.0000000e+00 @@ -29,19 +29,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 3,,density,scatter,0.0000000e+00,0.0000000e+00 3,,density,fission,0.0000000e+00,0.0000000e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,total,4.7523458e-01,2.5651989e-02 -1,,density,absorption,3.1301277e-02,7.6793124e-03 -1,,density,scatter,4.4393330e-01,1.8023240e-02 -1,,density,fission,1.5559382e-02,3.2310296e-03 -1,,density,nu-fission,3.8658175e-02,7.8012239e-03 -1,,density,total,2.2062973e-02,4.3689056e-03 -1,,density,absorption,1.6845658e-02,4.0750597e-03 -1,,density,scatter,5.2173154e-03,2.9663441e-04 -1,,density,fission,1.3503676e-02,3.2642872e-03 -1,,density,nu-fission,3.2945540e-02,7.9507678e-03 -1,,density,total,-9.4735075e-02,2.5584662e-01 -1,,density,absorption,-4.0246308e-03,5.2111771e-03 -1,,density,scatter,-9.0710444e-02,2.5073759e-01 +1,,density,total,3.3373495e-01,4.6827421e-02 +1,,density,absorption,6.7487092e-04,6.5232977e-03 +1,,density,scatter,3.3306008e-01,4.0307583e-02 +1,,density,fission,-1.8402784e-03,4.2206212e-03 +1,,density,nu-fission,-3.8312038e-03,1.0337874e-02 +1,,density,total,-2.4831544e-04,5.5020059e-03 +1,,density,absorption,-4.0311629e-03,5.0266899e-03 +1,,density,scatter,3.7828475e-03,4.8043964e-04 +1,,density,fission,-3.6379968e-03,4.1821819e-03 +1,,density,nu-fission,-8.8266852e-03,1.0193373e-02 +1,,density,total,-3.6848185e-01,1.9314902e-01 +1,,density,absorption,-7.3640407e-03,4.0184508e-03 +1,,density,scatter,-3.6111780e-01,1.8936612e-01 1,,density,fission,0.0000000e+00,0.0000000e+00 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 1,,density,total,0.0000000e+00,0.0000000e+00 @@ -49,19 +49,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,,density,scatter,0.0000000e+00,0.0000000e+00 1,,density,fission,0.0000000e+00,0.0000000e+00 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,total,4.4488235e+01,5.3981552e+00 -1,O16,nuclide_density,absorption,-2.9372260e-01,9.3282726e-01 -1,O16,nuclide_density,scatter,4.4781958e+01,4.5257514e+00 -1,O16,nuclide_density,fission,9.9830021e-02,4.0698873e-01 -1,O16,nuclide_density,nu-fission,2.3343404e-01,9.8749080e-01 -1,O16,nuclide_density,total,4.0916790e-02,6.2301743e-01 -1,O16,nuclide_density,absorption,8.8291907e-02,5.5570859e-01 -1,O16,nuclide_density,scatter,-4.7375117e-02,6.7714014e-02 -1,O16,nuclide_density,fission,1.3678946e-01,4.4006360e-01 -1,O16,nuclide_density,nu-fission,3.3258041e-01,1.0719299e+00 -1,O16,nuclide_density,total,-1.6055867e+01,2.3439329e+01 -1,O16,nuclide_density,absorption,-3.9601159e-01,3.0131618e-01 -1,O16,nuclide_density,scatter,-1.5659856e+01,2.3140401e+01 +1,O16,nuclide_density,total,3.9050701e+01,8.5131265e+00 +1,O16,nuclide_density,absorption,-7.7573286e-01,7.1182570e-01 +1,O16,nuclide_density,scatter,3.9826434e+01,7.8536529e+00 +1,O16,nuclide_density,fission,-4.2193390e-01,6.0091792e-01 +1,O16,nuclide_density,nu-fission,-1.0411912e+00,1.4662352e+00 +1,O16,nuclide_density,total,-5.8976625e-01,7.9559349e-01 +1,O16,nuclide_density,absorption,-5.0047331e-01,7.1666177e-01 +1,O16,nuclide_density,scatter,-8.9292946e-02,8.9937898e-02 +1,O16,nuclide_density,fission,-3.6634959e-01,6.1270658e-01 +1,O16,nuclide_density,nu-fission,-8.9338374e-01,1.4932014e+00 +1,O16,nuclide_density,total,-3.3511352e+00,2.2365725e+01 +1,O16,nuclide_density,absorption,1.5473875e-01,4.3692662e-01 +1,O16,nuclide_density,scatter,-3.5058740e+00,2.1928948e+01 1,O16,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,total,0.0000000e+00,0.0000000e+00 @@ -69,19 +69,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,total,-6.1444882e+02,6.0111765e+01 -1,U235,nuclide_density,absorption,2.3977145e+02,4.5868416e+01 -1,U235,nuclide_density,scatter,-8.5422027e+02,2.4877998e+01 -1,U235,nuclide_density,fission,3.1319140e+02,3.1465133e+01 -1,U235,nuclide_density,nu-fission,7.6415485e+02,7.6501622e+01 -1,U235,nuclide_density,total,5.0916190e+02,3.5499332e+01 -1,U235,nuclide_density,absorption,3.9477370e+02,3.4326175e+01 -1,U235,nuclide_density,scatter,1.1438820e+02,2.7378233e+00 -1,U235,nuclide_density,fission,3.1360747e+02,3.2243613e+01 -1,U235,nuclide_density,nu-fission,7.6527247e+02,7.8683716e+01 -1,U235,nuclide_density,total,-4.1815705e+03,8.7796625e+02 -1,U235,nuclide_density,absorption,-1.0563225e+02,2.5308631e+01 -1,U235,nuclide_density,scatter,-4.0759382e+03,8.5332198e+02 +1,U235,nuclide_density,total,-9.1643805e+02,1.8814046e+02 +1,U235,nuclide_density,absorption,1.8114000e+02,4.6345847e+01 +1,U235,nuclide_density,scatter,-1.0975781e+03,1.4310981e+02 +1,U235,nuclide_density,fission,2.8765342e+02,2.2586319e+01 +1,U235,nuclide_density,nu-fission,7.0175585e+02,5.5024716e+01 +1,U235,nuclide_density,total,4.6786282e+02,2.8271731e+01 +1,U235,nuclide_density,absorption,3.6134508e+02,2.8453765e+01 +1,U235,nuclide_density,scatter,1.0651774e+02,1.3120589e+00 +1,U235,nuclide_density,fission,2.8859249e+02,2.2522591e+01 +1,U235,nuclide_density,nu-fission,7.0430623e+02,5.4858487e+01 +1,U235,nuclide_density,total,-5.0586963e+03,6.7151365e+02 +1,U235,nuclide_density,absorption,-1.2315731e+02,1.8905184e+01 +1,U235,nuclide_density,scatter,-4.9355390e+03,6.5260939e+02 1,U235,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,total,0.0000000e+00,0.0000000e+00 @@ -89,19 +89,19 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,total,2.1367126e-04,1.8632825e-04 -1,,temperature,absorption,6.9456243e-05,3.2199405e-05 -1,,temperature,scatter,1.4421502e-04,1.5754186e-04 -1,,temperature,fission,3.0674921e-06,1.8048386e-05 -1,,temperature,nu-fission,7.4768732e-06,4.3976788e-05 -1,,temperature,total,5.8223046e-06,2.3786485e-05 -1,,temperature,absorption,5.2142631e-06,2.1901921e-05 -1,,temperature,scatter,6.0804154e-07,1.9834897e-06 -1,,temperature,fission,3.0674141e-06,1.8048551e-05 -1,,temperature,nu-fission,7.4766883e-06,4.3977175e-05 -1,,temperature,total,2.1510094e-04,4.6388764e-04 -1,,temperature,absorption,2.2409493e-06,8.2901087e-06 -1,,temperature,scatter,2.1285999e-04,4.5560092e-04 +1,,temperature,total,8.6368265e-05,1.7363899e-04 +1,,temperature,absorption,1.9220262e-05,3.4988977e-05 +1,,temperature,scatter,6.7148003e-05,1.4635162e-04 +1,,temperature,fission,-5.2927287e-06,1.2158338e-05 +1,,temperature,nu-fission,-1.2897086e-05,2.9622912e-05 +1,,temperature,total,-4.2009323e-06,1.8263855e-05 +1,,temperature,absorption,-4.3037914e-06,1.6219907e-05 +1,,temperature,scatter,1.0285902e-07,2.0676492e-06 +1,,temperature,fission,-5.2953783e-06,1.2158786e-05 +1,,temperature,nu-fission,-1.2903531e-05,2.9624000e-05 +1,,temperature,total,-1.1160261e-04,6.1705782e-04 +1,,temperature,absorption,-2.0394397e-06,8.4055062e-06 +1,,temperature,scatter,-1.0956317e-04,6.0869070e-04 1,,temperature,fission,0.0000000e+00,0.0000000e+00 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 1,,temperature,total,0.0000000e+00,0.0000000e+00 @@ -109,68 +109,68 @@ d_material,d_nuclide,d_variable,score,mean,std. dev. 1,,temperature,scatter,0.0000000e+00,0.0000000e+00 1,,temperature,fission,0.0000000e+00,0.0000000e+00 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,absorption,-1.6517209e-01,3.0984748e-01 -3,,density,absorption,8.0401451e-03,1.4689308e-01 -1,,density,absorption,2.9069923e-02,2.2139686e-03 -1,,density,absorption,-9.4690017e-03,8.6605404e-03 -1,O16,nuclide_density,absorption,7.6912288e-01,4.1945623e-01 -1,O16,nuclide_density,absorption,-6.3724748e-01,6.6341497e-01 -1,U235,nuclide_density,absorption,1.4109552e+02,1.8518919e+01 -1,U235,nuclide_density,absorption,-1.2052821e+02,3.2084005e+01 -1,,temperature,absorption,3.9995382e-05,2.1703359e-05 -1,,temperature,absorption,2.7274368e-06,8.9339250e-06 +3,,density,absorption,1.3594219e-01,1.0122046e-01 +3,,density,absorption,2.8656499e-01,3.7923985e-02 +1,,density,absorption,-2.2106085e-03,9.8387075e-03 +1,,density,absorption,-3.3239716e-03,8.7768141e-03 +1,O16,nuclide_density,absorption,-1.2640173e+00,9.1596515e-01 +1,O16,nuclide_density,absorption,1.3146714e-01,9.9380272e-01 +1,U235,nuclide_density,absorption,1.5677452e+02,8.1085465e+01 +1,U235,nuclide_density,absorption,-1.4334804e+02,3.2100956e+01 +1,,temperature,absorption,-8.9633351e-06,3.5750907e-05 +1,,temperature,absorption,7.0140498e-07,1.1694324e-05 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,-8.7934549e-01,1.0210652e+00 +3,,density,scatter,4.7213241e-01,1.6556808e-01 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,-3.5236517e-03,3.5236517e-03 -3,,density,nu-fission,7.2952775e-02,2.9725868e-01 -3,,density,scatter,-2.2716407e+00,1.2546346e+00 -3,,density,nu-fission,8.9171241e-02,3.0634860e-01 -3,,density,scatter,-1.0151726e-03,9.6296789e-03 +3,,density,scatter,3.4067110e-02,2.1267271e-02 +3,,density,nu-fission,4.1265284e-01,1.3891654e-01 +3,,density,scatter,-2.1663022e+00,3.2444877e-01 +3,,density,nu-fission,4.4524898e-01,1.4098968e-01 +3,,density,scatter,-2.1357153e-02,1.7423446e-02 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,2.3163919e+00,4.8766694e+00 +3,,density,scatter,8.6343785e+00,2.9292930e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,scatter,0.0000000e+00,0.0000000e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 -3,,density,scatter,4.0762347e-01,3.8504133e+00 +3,,density,scatter,4.3792818e+00,1.9915652e+00 3,,density,nu-fission,0.0000000e+00,0.0000000e+00 3,,density,scatter,0.0000000e+00,0.0000000e+00 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,3.9903014e-02,9.1258569e-03 +1,,density,scatter,-5.0479210e-03,9.5688761e-03 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,9.8213753e-04,9.8213753e-04 -1,,density,nu-fission,2.7945436e-02,2.0999385e-02 -1,,density,scatter,4.0626164e-01,1.7017647e-02 -1,,density,nu-fission,2.4595326e-02,2.1224461e-02 -1,,density,scatter,2.6505966e-03,2.3698970e-03 +1,,density,scatter,4.4418327e-04,7.8121620e-04 +1,,density,nu-fission,-1.9240114e-02,1.4935352e-02 +1,,density,scatter,3.4099348e-01,2.8182893e-02 +1,,density,nu-fission,-2.4226858e-02,1.4481188e-02 +1,,density,scatter,1.1073847e-03,2.7478584e-04 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,-1.2721691e-01,1.8810988e-01 +1,,density,scatter,-2.7695506e-01,1.3529978e-01 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 1,,density,scatter,0.0000000e+00,0.0000000e+00 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 -1,,density,scatter,4.1950837e-02,7.3679973e-02 +1,,density,scatter,-8.8202815e-02,7.8863942e-02 1,,density,nu-fission,0.0000000e+00,0.0000000e+00 1,,density,scatter,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,O16,nuclide_density,scatter,-1.9798569e-02,1.9798569e-02 -1,O16,nuclide_density,nu-fission,9.3633316e-01,2.0322303e+00 -1,O16,nuclide_density,scatter,-2.2042880e-01,1.6781769e-01 +1,O16,nuclide_density,scatter,1.1279170e-01,6.9836765e-02 +1,O16,nuclide_density,nu-fission,-1.6695105e+00,1.6777445e+00 +1,O16,nuclide_density,scatter,-1.0671543e-01,1.9127943e-01 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,O16,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 -1,U235,nuclide_density,scatter,2.3761278e+00,2.3761278e+00 -1,U235,nuclide_density,nu-fission,7.7441706e+02,8.6460966e+01 -1,U235,nuclide_density,scatter,9.6917110e+01,1.0750583e+01 +1,U235,nuclide_density,scatter,6.3235790e+00,3.9733167e+00 +1,U235,nuclide_density,nu-fission,6.2368225e+02,1.0172850e+02 +1,U235,nuclide_density,scatter,3.2601903e+01,6.2672072e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,nu-fission,0.0000000e+00,0.0000000e+00 1,U235,nuclide_density,scatter,0.0000000e+00,0.0000000e+00 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 -1,,temperature,scatter,-2.0607997e-06,2.0607997e-06 -1,,temperature,nu-fission,3.8846012e-06,3.5405078e-05 -1,,temperature,scatter,-6.6772461e-07,2.0750790e-07 +1,,temperature,scatter,-2.0884127e-06,1.6684645e-06 +1,,temperature,nu-fission,-1.5670247e-05,4.5939944e-05 +1,,temperature,scatter,3.9749436e-06,3.9749436e-06 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 1,,temperature,scatter,0.0000000e+00,0.0000000e+00 1,,temperature,nu-fission,0.0000000e+00,0.0000000e+00 diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index 5adb9d250..85d35b081 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1,62 +1,62 @@ - - - - - - 2.0 2.0 - 1 - 2 2 - -2.0 -2.0 - + + + + + + 2.0 2.0 + 1 + 2 2 + -2.0 -2.0 + 11 11 11 11 - - - - - - + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - eigenvalue - 1000 - 5 - 0 - - - -1 -1 -1 1 1 1 - - + eigenvalue + 1000 + 5 + 0 + + + -1 -1 -1 1 1 1 + + - - 0 0 0 - 7 7 - 400 400 - - - 0 0 0 - 7 7 - 400 400 - + + 0 0 0 + 7 7 + 400 400 + + + 0 0 0 + 7 7 + 400 400 + diff --git a/tests/test_energy_cutoff/inputs_true.dat b/tests/test_energy_cutoff/inputs_true.dat index 1e22c9514..17851b05a 100644 --- a/tests/test_energy_cutoff/inputs_true.dat +++ b/tests/test_energy_cutoff/inputs_true.dat @@ -1,42 +1,42 @@ - - - - - - - + + + + + + + - - - - + + + + - fixed source - 100 - 10 - - - -1 -1 -1 1 1 1 - - - - - 4.0 - + fixed source + 100 + 10 + + + -1 -1 -1 1 1 1 + + + + + 4.0 + - - 0.0 4.0 - - - 1 - flux - + + 0.0 4.0 + + + 1 + flux + diff --git a/tests/test_filter_energyfun/inputs_true.dat b/tests/test_filter_energyfun/inputs_true.dat index 643ead7fb..d857451cb 100644 --- a/tests/test_filter_energyfun/inputs_true.dat +++ b/tests/test_filter_energyfun/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,200 +127,200 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 1e-05 0.369 1000.0 100000.0 600000.0 1000000.0 2000000.0 4000000.0 30000000.0 - 0.1 0.1 0.1333 0.158 0.18467 0.25618 0.4297 0.48 0.48 - - - Am241 - (n,gamma) - - - 1 - Am241 - (n,gamma) - + + 1e-05 0.369 1000.0 100000.0 600000.0 1000000.0 2000000.0 4000000.0 30000000.0 + 0.1 0.1 0.1333 0.158 0.18467 0.25618 0.4297 0.48 0.48 + + + Am241 + (n,gamma) + + + 1 + Am241 + (n,gamma) + diff --git a/tests/test_filter_energyfun/results_true.dat b/tests/test_filter_energyfun/results_true.dat index 5f1a8827f..4c9f5ec0a 100644 --- a/tests/test_filter_energyfun/results_true.dat +++ b/tests/test_filter_energyfun/results_true.dat @@ -1,2 +1,2 @@ energyfunction nuclide score mean std. dev. -0 02180f5f310ee4 Am241 (n,gamma) 1.00e-01 6.22e-03 +0 02180f5f310ee4 Am241 (n,gamma) 1.00e-01 9.97e-03 diff --git a/tests/test_filter_mesh/inputs_true.dat b/tests/test_filter_mesh/inputs_true.dat index 333f976db..6d14f9e7e 100644 --- a/tests/test_filter_mesh/inputs_true.dat +++ b/tests/test_filter_mesh/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,234 +127,234 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 17 - -182.07 - 182.07 - - - 17 17 - -182.07 -182.07 - 182.07 182.07 - - - 17 17 17 - -182.07 -182.07 -183.0 - 182.07 182.07 183.0 - - - 1 - - - 2 - - - 3 - - - 1 - total - - - 1 - current - - - 2 - total - - - 2 - current - - - 3 - total - - - 3 - current - + + 17 + -182.07 + 182.07 + + + 17 17 + -182.07 -182.07 + 182.07 182.07 + + + 17 17 17 + -182.07 -182.07 -183.0 + 182.07 182.07 183.0 + + + 1 + + + 2 + + + 3 + + + 1 + total + + + 1 + current + + + 2 + total + + + 2 + current + + + 3 + total + + + 3 + current + diff --git a/tests/test_filter_mesh/results_true.dat b/tests/test_filter_mesh/results_true.dat index 61ba50e20..ac3439da5 100644 --- a/tests/test_filter_mesh/results_true.dat +++ b/tests/test_filter_mesh/results_true.dat @@ -1 +1 @@ -2416e74f84dd57c46a6e2fc94e8f794d9725cae964beaf4659f06aae5ed2b804b968cf2ca512b461d6e59e998f61a967db2f2fe97ce22e7607444f50ca38f646 \ No newline at end of file +804d161cb8eae506d3247a533d122f44a01d3cedd566b3c65c71a0b51326dd9b97f8bbf45af7304b500476f3f854d91b10ccad94122d15f23641b05b835fada6 \ No newline at end of file diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 9eee57672..098056f5b 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,183 +127,183 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + diff --git a/tests/test_iso_in_lab/results_true.dat b/tests/test_iso_in_lab/results_true.dat index c3fc1cf05..844bc2e8e 100644 --- a/tests/test_iso_in_lab/results_true.dat +++ b/tests/test_iso_in_lab/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.753410E-01 6.608253E-02 +9.672875E-01 3.577848E-02 diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index 47e1c94dd..220b1de24 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -1,97 +1,97 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group diff --git a/tests/test_mg_convert/inputs_true.dat b/tests/test_mg_convert/inputs_true.dat index 85eeb3a24..e2c3a01fa 100644 --- a/tests/test_mg_convert/inputs_true.dat +++ b/tests/test_mg_convert/inputs_true.dat @@ -1,29 +1,29 @@ - - - - - + + + + + - ./mgxs.h5 - - - - + ./mgxs.h5 + + + + - eigenvalue - 100 - 10 - 5 - - - -5 -5 -5 5 5 5 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + -5 -5 -5 5 5 5 + + + multi-group diff --git a/tests/test_mg_legendre/inputs_true.dat b/tests/test_mg_legendre/inputs_true.dat index 10615ed13..9b63fb944 100644 --- a/tests/test_mg_legendre/inputs_true.dat +++ b/tests/test_mg_legendre/inputs_true.dat @@ -1,46 +1,46 @@ - - - - - - - - - - - + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group - - false - + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + + false + diff --git a/tests/test_mg_max_order/inputs_true.dat b/tests/test_mg_max_order/inputs_true.dat index c777dcbbf..3954bc73a 100644 --- a/tests/test_mg_max_order/inputs_true.dat +++ b/tests/test_mg_max_order/inputs_true.dat @@ -1,44 +1,44 @@ - - - - - - - - - - - + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group - 1 + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + 1 diff --git a/tests/test_mg_nuclide/inputs_true.dat b/tests/test_mg_nuclide/inputs_true.dat index c840f4194..d42b15480 100644 --- a/tests/test_mg_nuclide/inputs_true.dat +++ b/tests/test_mg_nuclide/inputs_true.dat @@ -1,97 +1,97 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group diff --git a/tests/test_mg_survival_biasing/inputs_true.dat b/tests/test_mg_survival_biasing/inputs_true.dat index 49d34e915..057af6810 100644 --- a/tests/test_mg_survival_biasing/inputs_true.dat +++ b/tests/test_mg_survival_biasing/inputs_true.dat @@ -1,98 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group - true + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + true diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index 34da51c18..0c71689ae 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -1,229 +1,229 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ../1d_mgxs.h5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - 0.0 0.0 0.0 10.0 10.0 5.0 - - - multi-group + eigenvalue + 100 + 10 + 5 + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group - - 1 1 10 - 0.0 0.0 0.0 - 10 10 5 - - - 1 - - - 1 2 3 4 5 6 7 8 9 10 11 12 - - - 0.0 20000000.0 - - - 0.0 20000000.0 - - - 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 - - - 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 - - - 5 - total absorption flux fission nu-fission - analog - - - 5 - total absorption flux fission nu-fission - tracklength - - - 6 1 - total absorption flux fission nu-fission scatter nu-scatter - analog - - - 6 1 - total absorption flux fission nu-fission - collision - - - 6 1 - total absorption flux fission nu-fission - tracklength - - - 6 1 2 - scatter nu-scatter nu-fission - - - 6 3 - total absorption flux fission nu-fission scatter nu-scatter - analog - - - 6 3 - total absorption flux fission nu-fission - collision - - - 6 3 - total absorption flux fission nu-fission - tracklength - - - 6 3 4 - scatter nu-scatter nu-fission - - - 5 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - analog - - - 5 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - tracklength - - - 6 1 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission scatter nu-scatter - analog - - - 6 1 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - collision - - - 6 1 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - tracklength - - - 6 1 2 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - scatter nu-scatter nu-fission - - - 6 3 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission scatter nu-scatter - analog - - - 6 3 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - collision - - - 6 3 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - total absorption fission nu-fission - tracklength - - - 6 3 4 - uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu - scatter nu-scatter nu-fission - + + 1 1 10 + 0.0 0.0 0.0 + 10 10 5 + + + 1 + + + 1 2 3 4 5 6 7 8 9 10 11 12 + + + 0.0 20000000.0 + + + 0.0 20000000.0 + + + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 + + + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 + + + 5 + total absorption flux fission nu-fission + analog + + + 5 + total absorption flux fission nu-fission + tracklength + + + 6 1 + total absorption flux fission nu-fission scatter nu-scatter + analog + + + 6 1 + total absorption flux fission nu-fission + collision + + + 6 1 + total absorption flux fission nu-fission + tracklength + + + 6 1 2 + scatter nu-scatter nu-fission + + + 6 3 + total absorption flux fission nu-fission scatter nu-scatter + analog + + + 6 3 + total absorption flux fission nu-fission + collision + + + 6 3 + total absorption flux fission nu-fission + tracklength + + + 6 3 4 + scatter nu-scatter nu-fission + + + 5 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + analog + + + 5 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + 6 1 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission scatter nu-scatter + analog + + + 6 1 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + collision + + + 6 1 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + 6 1 2 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + scatter nu-scatter nu-fission + + + 6 3 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission scatter nu-scatter + analog + + + 6 3 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + collision + + + 6 3 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + total absorption fission nu-fission + tracklength + + + 6 3 4 + uo2_ang uo2_ang_mu uo2_iso uo2_iso_mu clad_ang clad_ang_mu clad_iso clad_iso_mu lwtr_ang lwtr_ang_mu lwtr_iso lwtr_iso_mu + scatter nu-scatter nu-fission + diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index 21c879694..8e8cde281 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -1,248 +1,248 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 1 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 2 - - - 3 - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - flux - analog - - - 1 2 7 - total - nu-fission - analog - - - 1 2 - total - flux - analog - - - 1 2 7 - total - nu-scatter-P3 - analog - - - 1 2 7 - total - nu-scatter - analog - - - 1 2 7 - total - scatter - analog - - - 14 2 - total - flux - tracklength - - - 14 2 - total - total - tracklength - - - 14 2 - total - flux - tracklength - - - 14 2 - total - absorption - tracklength - - - 14 2 - total - flux - analog - - - 14 2 7 - total - nu-fission - analog - - - 14 2 - total - flux - analog - - - 14 2 7 - total - nu-scatter-P3 - analog - - - 14 2 7 - total - nu-scatter - analog - - - 14 2 7 - total - scatter - analog - - - 27 2 - total - flux - tracklength - - - 27 2 - total - total - tracklength - - - 27 2 - total - flux - tracklength - - - 27 2 - total - absorption - tracklength - - - 27 2 - total - flux - analog - - - 27 2 7 - total - nu-fission - analog - - - 27 2 - total - flux - analog - - - 27 2 7 - total - nu-scatter-P3 - analog - - - 27 2 7 - total - nu-scatter - analog - - - 27 2 7 - total - scatter - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + analog + + + 1 2 7 + total + nu-fission + analog + + + 1 2 + total + flux + analog + + + 1 2 7 + total + nu-scatter-P3 + analog + + + 1 2 7 + total + nu-scatter + analog + + + 1 2 7 + total + scatter + analog + + + 14 2 + total + flux + tracklength + + + 14 2 + total + total + tracklength + + + 14 2 + total + flux + tracklength + + + 14 2 + total + absorption + tracklength + + + 14 2 + total + flux + analog + + + 14 2 7 + total + nu-fission + analog + + + 14 2 + total + flux + analog + + + 14 2 7 + total + nu-scatter-P3 + analog + + + 14 2 7 + total + nu-scatter + analog + + + 14 2 7 + total + scatter + analog + + + 27 2 + total + flux + tracklength + + + 27 2 + total + total + tracklength + + + 27 2 + total + flux + tracklength + + + 27 2 + total + absorption + tracklength + + + 27 2 + total + flux + analog + + + 27 2 7 + total + nu-fission + analog + + + 27 2 + total + flux + analog + + + 27 2 7 + total + nu-scatter-P3 + analog + + + 27 2 7 + total + nu-scatter + analog + + + 27 2 7 + total + scatter + analog + diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index df941a764..d2f28d0fe 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1,1190 +1,1190 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 1 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 2 - - - 3 - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - nu-scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - nu-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - kappa-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 - total - flux - analog - - - 1 2 - total - nu-scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-scatter-P3 - analog - - - 1 2 5 - total - nu-scatter - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-fission - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 5 - total - nu-scatter-0 - analog - - - 1 2 5 - total - scatter-0 - analog - - - 1 46 - total - nu-fission - analog - - - 1 5 - total - nu-fission - analog - - - 1 46 - total - prompt-nu-fission - analog - - - 1 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - inverse-velocity - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - prompt-nu-fission - tracklength - - - 1 2 - total - flux - analog - - - 1 2 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 46 - total - delayed-nu-fission - analog - - - 1 59 5 - total - delayed-nu-fission - analog - - - 1 2 - total - nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - decay-rate - tracklength - - - 1 2 - total - flux - analog - - - 1 59 2 5 - total - delayed-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - analog - - - 74 5 - total - scatter-1 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - analog - - - 74 5 - total - nu-scatter-1 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - absorption - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - absorption - tracklength - - - 74 2 - total - fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - nu-fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - kappa-fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 - total - flux - analog - - - 74 2 - total - nu-scatter - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - nu-scatter-P3 - analog - - - 74 2 5 - total - nu-scatter - analog - - - 74 2 5 - total - scatter - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - nu-fission - analog - - - 74 2 5 - total - scatter - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 5 - total - nu-scatter-0 - analog - - - 74 2 5 - total - scatter-0 - analog - - - 74 46 - total - nu-fission - analog - - - 74 5 - total - nu-fission - analog - - - 74 46 - total - prompt-nu-fission - analog - - - 74 5 - total - prompt-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - inverse-velocity - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - prompt-nu-fission - tracklength - - - 74 2 - total - flux - analog - - - 74 2 5 - total - prompt-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 46 - total - delayed-nu-fission - analog - - - 74 59 5 - total - delayed-nu-fission - analog - - - 74 2 - total - nu-fission - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 2 - total - decay-rate - tracklength - - - 74 2 - total - flux - analog - - - 74 59 2 5 - total - delayed-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - analog - - - 147 5 - total - scatter-1 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - analog - - - 147 5 - total - nu-scatter-1 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - absorption - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - absorption - tracklength - - - 147 2 - total - fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - nu-fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - kappa-fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 - total - flux - analog - - - 147 2 - total - nu-scatter - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - nu-scatter-P3 - analog - - - 147 2 5 - total - nu-scatter - analog - - - 147 2 5 - total - scatter - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - nu-fission - analog - - - 147 2 5 - total - scatter - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 5 - total - nu-scatter-0 - analog - - - 147 2 5 - total - scatter-0 - analog - - - 147 46 - total - nu-fission - analog - - - 147 5 - total - nu-fission - analog - - - 147 46 - total - prompt-nu-fission - analog - - - 147 5 - total - prompt-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - inverse-velocity - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - prompt-nu-fission - tracklength - - - 147 2 - total - flux - analog - - - 147 2 5 - total - prompt-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 46 - total - delayed-nu-fission - analog - - - 147 59 5 - total - delayed-nu-fission - analog - - - 147 2 - total - nu-fission - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 2 - total - decay-rate - tracklength - - - 147 2 - total - flux - analog - - - 147 59 2 5 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 46 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 46 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 46 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + nu-scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + nu-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + kappa-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 + total + flux + analog + + + 74 2 + total + nu-scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-scatter-P3 + analog + + + 74 2 5 + total + nu-scatter + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-fission + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 5 + total + nu-scatter-0 + analog + + + 74 2 5 + total + scatter-0 + analog + + + 74 46 + total + nu-fission + analog + + + 74 5 + total + nu-fission + analog + + + 74 46 + total + prompt-nu-fission + analog + + + 74 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + inverse-velocity + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + prompt-nu-fission + tracklength + + + 74 2 + total + flux + analog + + + 74 2 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 46 + total + delayed-nu-fission + analog + + + 74 59 5 + total + delayed-nu-fission + analog + + + 74 2 + total + nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + decay-rate + tracklength + + + 74 2 + total + flux + analog + + + 74 59 2 5 + total + delayed-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + nu-scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + nu-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + kappa-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 + total + flux + analog + + + 147 2 + total + nu-scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-scatter-P3 + analog + + + 147 2 5 + total + nu-scatter + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-fission + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 5 + total + nu-scatter-0 + analog + + + 147 2 5 + total + scatter-0 + analog + + + 147 46 + total + nu-fission + analog + + + 147 5 + total + nu-fission + analog + + + 147 46 + total + prompt-nu-fission + analog + + + 147 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + inverse-velocity + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + prompt-nu-fission + tracklength + + + 147 2 + total + flux + analog + + + 147 2 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 46 + total + delayed-nu-fission + analog + + + 147 59 5 + total + delayed-nu-fission + analog + + + 147 2 + total + nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + decay-rate + tracklength + + + 147 2 + total + flux + analog + + + 147 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index c844ea56a..d7a4a186a 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1,17 +1,17 @@ - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -29,436 +29,436 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -10.71 -10.71 -1 10.71 10.71 1 - - + eigenvalue + 100 + 10 + 5 + + + -10.71 -10.71 -1 10.71 10.71 1 + + - - 1 - - - 0.0 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - nu-scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - nu-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - kappa-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 - total - flux - analog - - - 1 2 - total - nu-scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-scatter-P3 - analog - - - 1 2 5 - total - nu-scatter - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-fission - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 5 - total - nu-scatter-0 - analog - - - 1 2 5 - total - scatter-0 - analog - - - 1 2 - total - nu-fission - analog - - - 1 5 - total - nu-fission - analog - - - 1 2 - total - prompt-nu-fission - analog - - - 1 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - inverse-velocity - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - prompt-nu-fission - tracklength - - - 1 2 - total - flux - analog - - - 1 2 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - analog - - - 1 59 5 - total - delayed-nu-fission - analog - - - 1 2 - total - nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - decay-rate - tracklength - - - 1 2 - total - flux - analog - - - 1 59 2 5 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 2 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 2 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index df941a764..d2f28d0fe 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1,1190 +1,1190 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 1 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 2 - - - 3 - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - nu-scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - nu-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - kappa-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 - total - flux - analog - - - 1 2 - total - nu-scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-scatter-P3 - analog - - - 1 2 5 - total - nu-scatter - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-fission - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 5 - total - nu-scatter-0 - analog - - - 1 2 5 - total - scatter-0 - analog - - - 1 46 - total - nu-fission - analog - - - 1 5 - total - nu-fission - analog - - - 1 46 - total - prompt-nu-fission - analog - - - 1 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - inverse-velocity - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - prompt-nu-fission - tracklength - - - 1 2 - total - flux - analog - - - 1 2 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 46 - total - delayed-nu-fission - analog - - - 1 59 5 - total - delayed-nu-fission - analog - - - 1 2 - total - nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - decay-rate - tracklength - - - 1 2 - total - flux - analog - - - 1 59 2 5 - total - delayed-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - analog - - - 74 5 - total - scatter-1 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - analog - - - 74 5 - total - nu-scatter-1 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - absorption - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - absorption - tracklength - - - 74 2 - total - fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - nu-fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - kappa-fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 - total - flux - analog - - - 74 2 - total - nu-scatter - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - nu-scatter-P3 - analog - - - 74 2 5 - total - nu-scatter - analog - - - 74 2 5 - total - scatter - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - nu-fission - analog - - - 74 2 5 - total - scatter - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 5 - total - nu-scatter-0 - analog - - - 74 2 5 - total - scatter-0 - analog - - - 74 46 - total - nu-fission - analog - - - 74 5 - total - nu-fission - analog - - - 74 46 - total - prompt-nu-fission - analog - - - 74 5 - total - prompt-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - inverse-velocity - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - prompt-nu-fission - tracklength - - - 74 2 - total - flux - analog - - - 74 2 5 - total - prompt-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 46 - total - delayed-nu-fission - analog - - - 74 59 5 - total - delayed-nu-fission - analog - - - 74 2 - total - nu-fission - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 2 - total - decay-rate - tracklength - - - 74 2 - total - flux - analog - - - 74 59 2 5 - total - delayed-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - analog - - - 147 5 - total - scatter-1 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - analog - - - 147 5 - total - nu-scatter-1 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - absorption - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - absorption - tracklength - - - 147 2 - total - fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - nu-fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - kappa-fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 - total - flux - analog - - - 147 2 - total - nu-scatter - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - nu-scatter-P3 - analog - - - 147 2 5 - total - nu-scatter - analog - - - 147 2 5 - total - scatter - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - nu-fission - analog - - - 147 2 5 - total - scatter - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 5 - total - nu-scatter-0 - analog - - - 147 2 5 - total - scatter-0 - analog - - - 147 46 - total - nu-fission - analog - - - 147 5 - total - nu-fission - analog - - - 147 46 - total - prompt-nu-fission - analog - - - 147 5 - total - prompt-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - inverse-velocity - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - prompt-nu-fission - tracklength - - - 147 2 - total - flux - analog - - - 147 2 5 - total - prompt-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 46 - total - delayed-nu-fission - analog - - - 147 59 5 - total - delayed-nu-fission - analog - - - 147 2 - total - nu-fission - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 2 - total - decay-rate - tracklength - - - 147 2 - total - flux - analog - - - 147 59 2 5 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 46 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 46 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 46 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + nu-scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + nu-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + kappa-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 + total + flux + analog + + + 74 2 + total + nu-scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-scatter-P3 + analog + + + 74 2 5 + total + nu-scatter + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-fission + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 5 + total + nu-scatter-0 + analog + + + 74 2 5 + total + scatter-0 + analog + + + 74 46 + total + nu-fission + analog + + + 74 5 + total + nu-fission + analog + + + 74 46 + total + prompt-nu-fission + analog + + + 74 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + inverse-velocity + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + prompt-nu-fission + tracklength + + + 74 2 + total + flux + analog + + + 74 2 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 46 + total + delayed-nu-fission + analog + + + 74 59 5 + total + delayed-nu-fission + analog + + + 74 2 + total + nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + decay-rate + tracklength + + + 74 2 + total + flux + analog + + + 74 59 2 5 + total + delayed-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + nu-scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + nu-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + kappa-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 + total + flux + analog + + + 147 2 + total + nu-scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-scatter-P3 + analog + + + 147 2 5 + total + nu-scatter + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-fission + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 5 + total + nu-scatter-0 + analog + + + 147 2 5 + total + scatter-0 + analog + + + 147 46 + total + nu-fission + analog + + + 147 5 + total + nu-fission + analog + + + 147 46 + total + prompt-nu-fission + analog + + + 147 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + inverse-velocity + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + prompt-nu-fission + tracklength + + + 147 2 + total + flux + analog + + + 147 2 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 46 + total + delayed-nu-fission + analog + + + 147 59 5 + total + delayed-nu-fission + analog + + + 147 2 + total + nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + decay-rate + tracklength + + + 147 2 + total + flux + analog + + + 147 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 0a4271256..4756b27bf 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,575 +127,575 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 2 2 - -100.0 -100.0 - 100.0 100.0 - - - 1 - - - 0.0 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - nu-scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - nu-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - kappa-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 - total - flux - analog - - - 1 2 - total - nu-scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-scatter-P3 - analog - - - 1 2 5 - total - nu-scatter - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-fission - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 5 - total - nu-scatter-0 - analog - - - 1 2 5 - total - scatter-0 - analog - - - 1 2 - total - nu-fission - analog - - - 1 5 - total - nu-fission - analog - - - 1 2 - total - prompt-nu-fission - analog - - - 1 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - inverse-velocity - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - prompt-nu-fission - tracklength - - - 1 2 - total - flux - analog - - - 1 2 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - analog - - - 1 59 5 - total - delayed-nu-fission - analog - - - 1 2 - total - nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - decay-rate - tracklength - - - 1 2 - total - flux - analog - - - 1 59 2 5 - total - delayed-nu-fission - analog - + + 2 2 + -100.0 -100.0 + 100.0 100.0 + + + 1 + + + 0.0 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 2 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 2 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_mesh/results_true.dat b/tests/test_mgxs_library_mesh/results_true.dat index 527c91d66..c167628bc 100644 --- a/tests/test_mgxs_library_mesh/results_true.dat +++ b/tests/test_mgxs_library_mesh/results_true.dat @@ -1,216 +1,216 @@ mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.654966 0.098415 -1 1 2 1 1 total 0.639357 0.282107 -2 2 1 1 1 total 0.713534 0.079788 -3 2 2 1 1 total 0.641095 0.091519 +0 1 1 1 1 total 0.762544 0.085298 +1 1 2 1 1 total 0.653375 0.153317 +2 2 1 1 1 total 0.644837 0.088457 +3 2 2 1 1 total 0.676480 0.094215 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.407867 0.104648 -1 1 2 1 1 total 0.417805 0.300173 -2 2 1 1 1 total 0.451699 0.087229 -3 2 2 1 1 total 0.396449 0.095884 +0 1 1 1 1 total 0.473988 0.088732 +1 1 2 1 1 total 0.379821 0.167092 +2 2 1 1 1 total 0.399254 0.091318 +3 2 2 1 1 total 0.424265 0.099551 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.407867 0.104648 -1 1 2 1 1 total 0.417805 0.300173 -2 2 1 1 1 total 0.451699 0.087229 -3 2 2 1 1 total 0.396449 0.095884 +0 1 1 1 1 total 0.473988 0.088732 +1 1 2 1 1 total 0.379821 0.167092 +2 2 1 1 1 total 0.399254 0.091318 +3 2 2 1 1 total 0.424265 0.099551 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.021476 0.004248 -1 1 2 1 1 total 0.020653 0.008355 -2 2 1 1 1 total 0.027384 0.003568 -3 2 2 1 1 total 0.021826 0.004584 +0 1 1 1 1 total 0.027288 0.005813 +1 1 2 1 1 total 0.019449 0.004420 +2 2 1 1 1 total 0.020262 0.003701 +3 2 2 1 1 total 0.021266 0.002869 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.013234 0.004146 -1 1 2 1 1 total 0.012342 0.006800 -2 2 1 1 1 total 0.016807 0.003428 -3 2 2 1 1 total 0.013253 0.004795 +0 1 1 1 1 total 0.016037 0.006339 +1 1 2 1 1 total 0.012153 0.003804 +2 2 1 1 1 total 0.013018 0.003521 +3 2 2 1 1 total 0.012965 0.002454 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.008241 0.001798 -1 1 2 1 1 total 0.008311 0.003296 -2 2 1 1 1 total 0.010577 0.001333 -3 2 2 1 1 total 0.008573 0.002017 +0 1 1 1 1 total 0.011251 0.003050 +1 1 2 1 1 total 0.007296 0.001795 +2 2 1 1 1 total 0.007243 0.001219 +3 2 2 1 1 total 0.008301 0.001066 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.020322 0.004415 -1 1 2 1 1 total 0.020546 0.008145 -2 2 1 1 1 total 0.026008 0.003213 -3 2 2 1 1 total 0.021015 0.004911 +0 1 1 1 1 total 0.027498 0.007445 +1 1 2 1 1 total 0.017912 0.004426 +2 2 1 1 1 total 0.017954 0.003077 +3 2 2 1 1 total 0.020469 0.002617 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 1.596881e+06 348355.002874 -1 1 2 1 1 total 1.610266e+06 638514.779022 -2 2 1 1 1 total 2.048208e+06 257681.650350 -3 2 2 1 1 total 1.660283e+06 390011.381149 +0 1 1 1 1 total 2.177345e+06 589804.299388 +1 1 2 1 1 total 1.413154e+06 347806.623417 +2 2 1 1 1 total 1.404096e+06 236476.851953 +3 2 2 1 1 total 1.608259e+06 206502.707865 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.633490 0.094536 -1 1 2 1 1 total 0.618705 0.273934 -2 2 1 1 1 total 0.686150 0.076703 -3 2 2 1 1 total 0.619269 0.087616 +0 1 1 1 1 total 0.735256 0.080216 +1 1 2 1 1 total 0.633925 0.149098 +2 2 1 1 1 total 0.624575 0.084974 +3 2 2 1 1 total 0.655214 0.091422 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.638348 0.097266 -1 1 2 1 1 total 0.588378 0.266032 -2 2 1 1 1 total 0.698373 0.092394 -3 2 2 1 1 total 0.625643 0.075089 +0 1 1 1 1 total 0.763779 0.070696 +1 1 2 1 1 total 0.640809 0.158369 +2 2 1 1 1 total 0.628158 0.064356 +3 2 2 1 1 total 0.645171 0.080467 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.638348 0.097266 -1 1 1 1 1 1 total P1 0.247099 0.035574 -2 1 1 1 1 1 total P2 0.092195 0.010891 -3 1 1 1 1 1 total P3 0.013224 0.004528 -4 1 2 1 1 1 total P0 0.588378 0.266032 -5 1 2 1 1 1 total P1 0.221552 0.102564 -6 1 2 1 1 1 total P2 0.069798 0.034699 -7 1 2 1 1 1 total P3 -0.003039 0.009633 -8 2 1 1 1 1 total P0 0.698373 0.092394 -9 2 1 1 1 1 total P1 0.261835 0.035253 -10 2 1 1 1 1 total P2 0.096206 0.013947 -11 2 1 1 1 1 total P3 0.016973 0.004808 -12 2 2 1 1 1 total P0 0.625643 0.075089 -13 2 2 1 1 1 total P1 0.244646 0.028604 -14 2 2 1 1 1 total P2 0.088580 0.012369 -15 2 2 1 1 1 total P3 0.019989 0.013950 +0 1 1 1 1 1 total P0 0.763779 0.070696 +1 1 1 1 1 1 total P1 0.288556 0.024446 +2 1 1 1 1 1 total P2 0.082441 0.011443 +3 1 1 1 1 1 total P3 -0.005627 0.012638 +4 1 2 1 1 1 total P0 0.640809 0.158369 +5 1 2 1 1 1 total P1 0.273553 0.066437 +6 1 2 1 1 1 total P2 0.108446 0.024435 +7 1 2 1 1 1 total P3 0.012229 0.003785 +8 2 1 1 1 1 total P0 0.628158 0.064356 +9 2 1 1 1 1 total P1 0.245583 0.022676 +10 2 1 1 1 1 total P2 0.086370 0.007833 +11 2 1 1 1 1 total P3 0.019590 0.005345 +12 2 2 1 1 1 total P0 0.645171 0.080467 +13 2 2 1 1 1 total P1 0.252215 0.032154 +14 2 2 1 1 1 total P2 0.089251 0.009734 +15 2 2 1 1 1 total P3 0.004748 0.002987 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.638348 0.097266 -1 1 1 1 1 1 total P1 0.247099 0.035574 -2 1 1 1 1 1 total P2 0.092195 0.010891 -3 1 1 1 1 1 total P3 0.013224 0.004528 -4 1 2 1 1 1 total P0 0.588378 0.266032 -5 1 2 1 1 1 total P1 0.221552 0.102564 -6 1 2 1 1 1 total P2 0.069798 0.034699 -7 1 2 1 1 1 total P3 -0.003039 0.009633 -8 2 1 1 1 1 total P0 0.698373 0.092394 -9 2 1 1 1 1 total P1 0.261835 0.035253 -10 2 1 1 1 1 total P2 0.096206 0.013947 -11 2 1 1 1 1 total P3 0.016973 0.004808 -12 2 2 1 1 1 total P0 0.625643 0.075089 -13 2 2 1 1 1 total P1 0.244646 0.028604 -14 2 2 1 1 1 total P2 0.088580 0.012369 -15 2 2 1 1 1 total P3 0.019989 0.013950 +0 1 1 1 1 1 total P0 0.763779 0.070696 +1 1 1 1 1 1 total P1 0.288556 0.024446 +2 1 1 1 1 1 total P2 0.082441 0.011443 +3 1 1 1 1 1 total P3 -0.005627 0.012638 +4 1 2 1 1 1 total P0 0.640809 0.158369 +5 1 2 1 1 1 total P1 0.273553 0.066437 +6 1 2 1 1 1 total P2 0.108446 0.024435 +7 1 2 1 1 1 total P3 0.012229 0.003785 +8 2 1 1 1 1 total P0 0.628158 0.064356 +9 2 1 1 1 1 total P1 0.245583 0.022676 +10 2 1 1 1 1 total P2 0.086370 0.007833 +11 2 1 1 1 1 total P3 0.019590 0.005345 +12 2 2 1 1 1 total P0 0.645171 0.080467 +13 2 2 1 1 1 total P1 0.252215 0.032154 +14 2 2 1 1 1 total P2 0.089251 0.009734 +15 2 2 1 1 1 total P3 0.004748 0.002987 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 1.0 0.153265 -1 1 2 1 1 1 total 1.0 0.454973 -2 2 1 1 1 1 total 1.0 0.146747 -3 2 2 1 1 1 total 1.0 0.141824 +0 1 1 1 1 1 total 1.0 0.108337 +1 1 2 1 1 1 total 1.0 0.238517 +2 2 1 1 1 1 total 1.0 0.113128 +3 2 2 1 1 1 total 1.0 0.132597 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.021059 0.003031 -1 1 2 1 1 1 total 0.017348 0.008786 -2 2 1 1 1 1 total 0.020409 0.003354 -3 2 2 1 1 1 total 0.011105 0.003806 +0 1 1 1 1 1 total 0.015584 0.003404 +1 1 2 1 1 1 total 0.014200 0.003676 +2 2 1 1 1 1 total 0.017684 0.002499 +3 2 2 1 1 1 total 0.022409 0.002481 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 1.0 0.153265 -1 1 2 1 1 1 total 1.0 0.454973 -2 2 1 1 1 1 total 1.0 0.146747 -3 2 2 1 1 1 total 1.0 0.141824 +0 1 1 1 1 1 total 1.0 0.108337 +1 1 2 1 1 1 total 1.0 0.238517 +2 2 1 1 1 1 total 1.0 0.113128 +3 2 2 1 1 1 total 1.0 0.132597 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.633490 0.135514 -1 1 1 1 1 1 total P1 0.245219 0.051009 -2 1 1 1 1 1 total P2 0.091493 0.017479 -3 1 1 1 1 1 total P3 0.013124 0.004906 -4 1 2 1 1 1 total P0 0.618705 0.392783 -5 1 2 1 1 1 total P1 0.232972 0.149703 -6 1 2 1 1 1 total P2 0.073396 0.049002 -7 1 2 1 1 1 total P3 -0.003195 0.010229 -8 2 1 1 1 1 total P0 0.686150 0.126578 -9 2 1 1 1 1 total P1 0.257252 0.047890 -10 2 1 1 1 1 total P2 0.094522 0.018315 -11 2 1 1 1 1 total P3 0.016676 0.005187 -12 2 2 1 1 1 total P0 0.619269 0.124057 -13 2 2 1 1 1 total P1 0.242153 0.048064 -14 2 2 1 1 1 total P2 0.087677 0.018646 -15 2 2 1 1 1 total P3 0.019785 0.014168 +0 1 1 1 1 1 total P0 0.735256 0.113047 +1 1 1 1 1 1 total P1 0.277780 0.041434 +2 1 1 1 1 1 total P2 0.079362 0.014706 +3 1 1 1 1 1 total P3 -0.005417 0.012184 +4 1 2 1 1 1 total P0 0.633925 0.212349 +5 1 2 1 1 1 total P1 0.270615 0.089799 +6 1 2 1 1 1 total P2 0.107281 0.034246 +7 1 2 1 1 1 total P3 0.012098 0.004637 +8 2 1 1 1 1 total P0 0.624575 0.110512 +9 2 1 1 1 1 total P1 0.244182 0.041824 +10 2 1 1 1 1 total P2 0.085877 0.014634 +11 2 1 1 1 1 total P3 0.019478 0.006012 +12 2 2 1 1 1 total P0 0.655214 0.126119 +13 2 2 1 1 1 total P1 0.256141 0.049765 +14 2 2 1 1 1 total P2 0.090641 0.016563 +15 2 2 1 1 1 total P3 0.004822 0.003115 mesh 1 group in group out nuclide moment mean std. dev. x y z -0 1 1 1 1 1 total P0 0.633490 0.166706 -1 1 1 1 1 1 total P1 0.245219 0.063359 -2 1 1 1 1 1 total P2 0.091493 0.022409 -3 1 1 1 1 1 total P3 0.013124 0.005303 -4 1 2 1 1 1 total P0 0.618705 0.483237 -5 1 2 1 1 1 total P1 0.232972 0.183428 -6 1 2 1 1 1 total P2 0.073396 0.059298 -7 1 2 1 1 1 total P3 -0.003195 0.010332 -8 2 1 1 1 1 total P0 0.686150 0.161742 -9 2 1 1 1 1 total P1 0.257252 0.060980 -10 2 1 1 1 1 total P2 0.094522 0.022975 -11 2 1 1 1 1 total P3 0.016676 0.005736 -12 2 2 1 1 1 total P0 0.619269 0.152000 -13 2 2 1 1 1 total P1 0.242153 0.059073 -14 2 2 1 1 1 total P2 0.087677 0.022412 -15 2 2 1 1 1 total P3 0.019785 0.014443 +0 1 1 1 1 1 total P0 0.735256 0.138292 +1 1 1 1 1 1 total P1 0.277780 0.051210 +2 1 1 1 1 1 total P2 0.079362 0.017035 +3 1 1 1 1 1 total P3 -0.005417 0.012198 +4 1 2 1 1 1 total P0 0.633925 0.260681 +5 1 2 1 1 1 total P1 0.270615 0.110590 +6 1 2 1 1 1 total P2 0.107281 0.042750 +7 1 2 1 1 1 total P3 0.012098 0.005462 +8 2 1 1 1 1 total P0 0.624575 0.131169 +9 2 1 1 1 1 total P1 0.244182 0.050123 +10 2 1 1 1 1 total P2 0.085877 0.017565 +11 2 1 1 1 1 total P3 0.019478 0.006403 +12 2 2 1 1 1 total P0 0.655214 0.153147 +13 2 2 1 1 1 total P1 0.256141 0.060250 +14 2 2 1 1 1 total P2 0.090641 0.020464 +15 2 2 1 1 1 total P3 0.004822 0.003180 mesh 1 group out nuclide mean std. dev. x y z -0 1 1 1 1 total 1.0 0.135958 -1 1 2 1 1 total 1.0 0.557756 -2 2 1 1 1 total 1.0 0.201340 -3 2 2 1 1 total 1.0 0.475608 +0 1 1 1 1 total 1.0 0.300047 +1 1 2 1 1 total 1.0 0.262180 +2 2 1 1 1 total 1.0 0.178169 +3 2 2 1 1 total 1.0 0.104797 mesh 1 group out nuclide mean std. dev. x y z -0 1 1 1 1 total 1.0 0.133151 -1 1 2 1 1 total 1.0 0.557756 -2 2 1 1 1 total 1.0 0.201340 -3 2 2 1 1 total 1.0 0.475608 +0 1 1 1 1 total 1.0 0.300047 +1 1 2 1 1 total 1.0 0.262180 +2 2 1 1 1 total 1.0 0.178169 +3 2 2 1 1 total 1.0 0.108931 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 4.697404e-07 8.304376e-08 -1 1 2 1 1 total 4.173069e-07 1.694647e-07 -2 2 1 1 1 total 6.581421e-07 1.337227e-07 -3 2 2 1 1 total 4.714011e-07 1.140489e-07 +0 1 1 1 1 total 7.097008e-07 1.458546e-07 +1 1 2 1 1 total 3.984535e-07 1.157576e-07 +2 2 1 1 1 total 4.407745e-07 7.903907e-08 +3 2 2 1 1 total 4.750476e-07 6.207437e-08 mesh 1 group in nuclide mean std. dev. x y z -0 1 1 1 1 total 0.020173 0.004383 -1 1 2 1 1 total 0.020397 0.008086 -2 2 1 1 1 total 0.025824 0.003192 -3 2 2 1 1 total 0.020865 0.004879 +0 1 1 1 1 total 0.027311 0.007397 +1 1 2 1 1 total 0.017783 0.004394 +2 2 1 1 1 total 0.017820 0.003054 +3 2 2 1 1 total 0.020320 0.002598 mesh 1 group in group out nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.020874 0.002977 -1 1 2 1 1 1 total 0.017348 0.008786 -2 2 1 1 1 1 total 0.020409 0.003354 -3 2 2 1 1 1 total 0.011105 0.003806 +0 1 1 1 1 1 total 0.015584 0.003404 +1 1 2 1 1 1 total 0.014200 0.003676 +2 2 1 1 1 1 total 0.017684 0.002499 +3 2 2 1 1 1 total 0.022259 0.002508 mesh 1 delayedgroup group in nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.000005 1.004638e-06 -1 1 1 1 2 1 total 0.000025 5.397978e-06 -2 1 1 1 3 1 total 0.000025 5.275050e-06 -3 1 1 1 4 1 total 0.000058 1.230443e-05 -4 1 1 1 5 1 total 0.000026 5.548743e-06 -5 1 1 1 6 1 total 0.000011 2.307020e-06 -6 1 2 1 1 1 total 0.000005 1.838266e-06 -7 1 2 1 2 1 total 0.000025 9.941991e-06 -8 1 2 1 3 1 total 0.000025 9.753804e-06 -9 1 2 1 4 1 total 0.000058 2.290678e-05 -10 1 2 1 5 1 total 0.000026 1.050498e-05 -11 1 2 1 6 1 total 0.000011 4.361882e-06 -12 2 1 1 1 1 total 0.000006 7.462654e-07 -13 2 1 1 2 1 total 0.000031 3.842479e-06 -14 2 1 1 3 1 total 0.000031 3.666594e-06 -15 2 1 1 4 1 total 0.000071 8.228616e-06 -16 2 1 1 5 1 total 0.000031 3.416659e-06 -17 2 1 1 6 1 total 0.000013 1.428970e-06 -18 2 2 1 1 1 total 0.000005 1.117984e-06 -19 2 2 1 2 1 total 0.000026 5.744801e-06 -20 2 2 1 3 1 total 0.000025 5.480526e-06 -21 2 2 1 4 1 total 0.000058 1.231604e-05 -22 2 2 1 5 1 total 0.000026 5.181495e-06 -23 2 2 1 6 1 total 0.000011 2.163732e-06 +0 1 1 1 1 1 total 0.000006 1.689606e-06 +1 1 1 1 2 1 total 0.000033 8.718916e-06 +2 1 1 1 3 1 total 0.000032 8.323051e-06 +3 1 1 1 4 1 total 0.000072 1.866015e-05 +4 1 1 1 5 1 total 0.000031 7.654909e-06 +5 1 1 1 6 1 total 0.000013 3.206343e-06 +6 1 2 1 1 1 total 0.000004 1.003100e-06 +7 1 2 1 2 1 total 0.000022 5.425275e-06 +8 1 2 1 3 1 total 0.000021 5.324236e-06 +9 1 2 1 4 1 total 0.000050 1.251572e-05 +10 1 2 1 5 1 total 0.000022 5.762184e-06 +11 1 2 1 6 1 total 0.000009 2.391676e-06 +12 2 1 1 1 1 total 0.000004 6.723192e-07 +13 2 1 1 2 1 total 0.000022 3.706235e-06 +14 2 1 1 3 1 total 0.000022 3.674263e-06 +15 2 1 1 4 1 total 0.000052 8.774048e-06 +16 2 1 1 5 1 total 0.000024 4.168024e-06 +17 2 1 1 6 1 total 0.000010 1.726268e-06 +18 2 2 1 1 1 total 0.000005 5.962367e-07 +19 2 2 1 2 1 total 0.000025 3.200900e-06 +20 2 2 1 3 1 total 0.000025 3.127442e-06 +21 2 2 1 4 1 total 0.000058 7.296157e-06 +22 2 2 1 5 1 total 0.000026 3.298196e-06 +23 2 2 1 6 1 total 0.000011 1.370918e-06 mesh 1 delayedgroup group out nuclide mean std. dev. x y z 0 1 1 1 1 1 total 0.0 0.000000 1 1 1 1 2 1 total 0.0 0.000000 2 1 1 1 3 1 total 0.0 0.000000 3 1 1 1 4 1 total 0.0 0.000000 -4 1 1 1 5 1 total 1.0 1.414214 +4 1 1 1 5 1 total 0.0 0.000000 5 1 1 1 6 1 total 0.0 0.000000 6 1 2 1 1 1 total 0.0 0.000000 7 1 2 1 2 1 total 0.0 0.000000 @@ -226,85 +226,85 @@ 17 2 1 1 6 1 total 0.0 0.000000 18 2 2 1 1 1 total 0.0 0.000000 19 2 2 1 2 1 total 0.0 0.000000 -20 2 2 1 3 1 total 0.0 0.000000 +20 2 2 1 3 1 total 1.0 1.414214 21 2 2 1 4 1 total 0.0 0.000000 22 2 2 1 5 1 total 0.0 0.000000 23 2 2 1 6 1 total 0.0 0.000000 mesh 1 delayedgroup group in nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.000227 0.000061 -1 1 1 1 2 1 total 0.001228 0.000327 -2 1 1 1 3 1 total 0.001206 0.000320 -3 1 1 1 4 1 total 0.002835 0.000748 -4 1 1 1 5 1 total 0.001300 0.000340 -5 1 1 1 6 1 total 0.000540 0.000141 -6 1 2 1 1 1 total 0.000226 0.000076 -7 1 2 1 2 1 total 0.001220 0.000412 -8 1 2 1 3 1 total 0.001197 0.000404 -9 1 2 1 4 1 total 0.002809 0.000949 -10 1 2 1 5 1 total 0.001284 0.000436 -11 1 2 1 6 1 total 0.000533 0.000181 -12 2 1 1 1 1 total 0.000226 0.000033 -13 2 1 1 2 1 total 0.001207 0.000174 -14 2 1 1 3 1 total 0.001175 0.000167 -15 2 1 1 4 1 total 0.002721 0.000378 -16 2 1 1 5 1 total 0.001207 0.000160 -17 2 1 1 6 1 total 0.000502 0.000067 -18 2 2 1 1 1 total 0.000228 0.000071 -19 2 2 1 2 1 total 0.001221 0.000373 -20 2 2 1 3 1 total 0.001190 0.000360 -21 2 2 1 4 1 total 0.002767 0.000822 -22 2 2 1 5 1 total 0.001238 0.000357 -23 2 2 1 6 1 total 0.000515 0.000149 +0 1 1 1 1 1 total 0.000228 0.000084 +1 1 1 1 2 1 total 0.001195 0.000438 +2 1 1 1 3 1 total 0.001153 0.000420 +3 1 1 1 4 1 total 0.002629 0.000950 +4 1 1 1 5 1 total 0.001125 0.000398 +5 1 1 1 6 1 total 0.000470 0.000166 +6 1 2 1 1 1 total 0.000228 0.000057 +7 1 2 1 2 1 total 0.001222 0.000309 +8 1 2 1 3 1 total 0.001193 0.000304 +9 1 2 1 4 1 total 0.002780 0.000713 +10 1 2 1 5 1 total 0.001250 0.000328 +11 1 2 1 6 1 total 0.000520 0.000136 +12 2 1 1 1 1 total 0.000225 0.000044 +13 2 1 1 2 1 total 0.001232 0.000242 +14 2 1 1 3 1 total 0.001216 0.000239 +15 2 1 1 4 1 total 0.002882 0.000570 +16 2 1 1 5 1 total 0.001345 0.000270 +17 2 1 1 6 1 total 0.000558 0.000112 +18 2 2 1 1 1 total 0.000227 0.000027 +19 2 2 1 2 1 total 0.001225 0.000143 +20 2 2 1 3 1 total 0.001201 0.000140 +21 2 2 1 4 1 total 0.002815 0.000326 +22 2 2 1 5 1 total 0.001284 0.000147 +23 2 2 1 6 1 total 0.000533 0.000061 mesh 1 delayedgroup group in nuclide mean std. dev. x y z -0 1 1 1 1 1 total 0.013362 0.003586 -1 1 1 1 2 1 total 0.032554 0.008645 -2 1 1 1 3 1 total 0.121179 0.031941 -3 1 1 1 4 1 total 0.306858 0.079971 -4 1 1 1 5 1 total 0.865303 0.220418 -5 1 1 1 6 1 total 2.906554 0.741592 -6 1 2 1 1 1 total 0.013361 0.004515 -7 1 2 1 2 1 total 0.032560 0.010992 -8 1 2 1 3 1 total 0.121165 0.040913 -9 1 2 1 4 1 total 0.306728 0.103786 -10 1 2 1 5 1 total 0.864851 0.295633 -11 1 2 1 6 1 total 2.905009 0.992039 -12 2 1 1 1 1 total 0.013353 0.002006 -13 2 1 1 2 1 total 0.032614 0.004676 -14 2 1 1 3 1 total 0.121052 0.016784 -15 2 1 1 4 1 total 0.305600 0.040195 -16 2 1 1 5 1 total 0.860792 0.101702 -17 2 1 1 6 1 total 2.891182 0.344181 -18 2 2 1 1 1 total 0.013355 0.004172 -19 2 2 1 2 1 total 0.032599 0.009758 -20 2 2 1 3 1 total 0.121084 0.035213 -21 2 2 1 4 1 total 0.305920 0.085294 -22 2 2 1 5 1 total 0.861968 0.224059 -23 2 2 1 6 1 total 2.895182 0.755656 - mesh 1 delayedgroup group in group out nuclide mean std. dev. - x y z -0 1 1 1 1 1 1 total 0.000000 0.000000 -1 1 1 1 2 1 1 total 0.000000 0.000000 -2 1 1 1 3 1 1 total 0.000000 0.000000 -3 1 1 1 4 1 1 total 0.000000 0.000000 -4 1 1 1 5 1 1 total 0.000185 0.000186 -5 1 1 1 6 1 1 total 0.000000 0.000000 -6 1 2 1 1 1 1 total 0.000000 0.000000 -7 1 2 1 2 1 1 total 0.000000 0.000000 -8 1 2 1 3 1 1 total 0.000000 0.000000 -9 1 2 1 4 1 1 total 0.000000 0.000000 -10 1 2 1 5 1 1 total 0.000000 0.000000 -11 1 2 1 6 1 1 total 0.000000 0.000000 -12 2 1 1 1 1 1 total 0.000000 0.000000 -13 2 1 1 2 1 1 total 0.000000 0.000000 -14 2 1 1 3 1 1 total 0.000000 0.000000 -15 2 1 1 4 1 1 total 0.000000 0.000000 -16 2 1 1 5 1 1 total 0.000000 0.000000 -17 2 1 1 6 1 1 total 0.000000 0.000000 -18 2 2 1 1 1 1 total 0.000000 0.000000 -19 2 2 1 2 1 1 total 0.000000 0.000000 -20 2 2 1 3 1 1 total 0.000000 0.000000 -21 2 2 1 4 1 1 total 0.000000 0.000000 -22 2 2 1 5 1 1 total 0.000000 0.000000 -23 2 2 1 6 1 1 total 0.000000 0.000000 +0 1 1 1 1 1 total 0.013345 0.004923 +1 1 1 1 2 1 total 0.032674 0.011850 +2 1 1 1 3 1 total 0.120923 0.043307 +3 1 1 1 4 1 total 0.304289 0.106753 +4 1 1 1 5 1 total 0.855760 0.286466 +5 1 1 1 6 1 total 2.874120 0.965609 +6 1 2 1 1 1 total 0.013357 0.003345 +7 1 2 1 2 1 total 0.032590 0.008273 +8 1 2 1 3 1 total 0.121103 0.031074 +9 1 2 1 4 1 total 0.306111 0.080011 +10 1 2 1 5 1 total 0.862660 0.235694 +11 1 2 1 6 1 total 2.897534 0.788926 +12 2 1 1 1 1 total 0.013367 0.002548 +13 2 1 1 2 1 total 0.032520 0.006266 +14 2 1 1 3 1 total 0.121250 0.023544 +15 2 1 1 4 1 total 0.307552 0.060464 +16 2 1 1 5 1 total 0.867665 0.175131 +17 2 1 1 6 1 total 2.914635 0.587161 +18 2 2 1 1 1 total 0.013360 0.001587 +19 2 2 1 2 1 total 0.032564 0.003810 +20 2 2 1 3 1 total 0.121158 0.014038 +21 2 2 1 4 1 total 0.306653 0.035052 +22 2 2 1 5 1 total 0.864587 0.096680 +23 2 2 1 6 1 total 2.904111 0.325170 + mesh 1 delayedgroup group in group out nuclide mean std. dev. + x y z +0 1 1 1 1 1 1 total 0.00000 0.000000 +1 1 1 1 2 1 1 total 0.00000 0.000000 +2 1 1 1 3 1 1 total 0.00000 0.000000 +3 1 1 1 4 1 1 total 0.00000 0.000000 +4 1 1 1 5 1 1 total 0.00000 0.000000 +5 1 1 1 6 1 1 total 0.00000 0.000000 +6 1 2 1 1 1 1 total 0.00000 0.000000 +7 1 2 1 2 1 1 total 0.00000 0.000000 +8 1 2 1 3 1 1 total 0.00000 0.000000 +9 1 2 1 4 1 1 total 0.00000 0.000000 +10 1 2 1 5 1 1 total 0.00000 0.000000 +11 1 2 1 6 1 1 total 0.00000 0.000000 +12 2 1 1 1 1 1 total 0.00000 0.000000 +13 2 1 1 2 1 1 total 0.00000 0.000000 +14 2 1 1 3 1 1 total 0.00000 0.000000 +15 2 1 1 4 1 1 total 0.00000 0.000000 +16 2 1 1 5 1 1 total 0.00000 0.000000 +17 2 1 1 6 1 1 total 0.00000 0.000000 +18 2 2 1 1 1 1 total 0.00000 0.000000 +19 2 2 1 2 1 1 total 0.00000 0.000000 +20 2 2 1 3 1 1 total 0.00015 0.000151 +21 2 2 1 4 1 1 total 0.00000 0.000000 +22 2 2 1 5 1 1 total 0.00000 0.000000 +23 2 2 1 6 1 1 total 0.00000 0.000000 diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index df941a764..d2f28d0fe 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1,1190 +1,1190 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 1 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 1 2 3 4 5 6 - - - 2 - - - 3 - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - total - nu-scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - absorption - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - nu-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - kappa-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 - total - flux - analog - - - 1 2 - total - nu-scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-scatter-P3 - analog - - - 1 2 5 - total - nu-scatter - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - total - nu-fission - analog - - - 1 2 5 - total - scatter - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - scatter - tracklength - - - 1 2 5 - total - scatter-P3 - analog - - - 1 2 5 - total - nu-scatter-0 - analog - - - 1 2 5 - total - scatter-0 - analog - - - 1 46 - total - nu-fission - analog - - - 1 5 - total - nu-fission - analog - - - 1 46 - total - prompt-nu-fission - analog - - - 1 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - total - inverse-velocity - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - total - prompt-nu-fission - tracklength - - - 1 2 - total - flux - analog - - - 1 2 5 - total - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 46 - total - delayed-nu-fission - analog - - - 1 59 5 - total - delayed-nu-fission - analog - - - 1 2 - total - nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - delayed-nu-fission - tracklength - - - 1 59 2 - total - decay-rate - tracklength - - - 1 2 - total - flux - analog - - - 1 59 2 5 - total - delayed-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - analog - - - 74 5 - total - scatter-1 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - total - tracklength - - - 74 2 - total - flux - analog - - - 74 5 - total - nu-scatter-1 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - absorption - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - absorption - tracklength - - - 74 2 - total - fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - nu-fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - kappa-fission - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 - total - flux - analog - - - 74 2 - total - nu-scatter - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - nu-scatter-P3 - analog - - - 74 2 5 - total - nu-scatter - analog - - - 74 2 5 - total - scatter - analog - - - 74 2 - total - flux - analog - - - 74 2 5 - total - nu-fission - analog - - - 74 2 5 - total - scatter - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - scatter - tracklength - - - 74 2 5 - total - scatter-P3 - analog - - - 74 2 5 - total - nu-scatter-0 - analog - - - 74 2 5 - total - scatter-0 - analog - - - 74 46 - total - nu-fission - analog - - - 74 5 - total - nu-fission - analog - - - 74 46 - total - prompt-nu-fission - analog - - - 74 5 - total - prompt-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 2 - total - inverse-velocity - tracklength - - - 74 2 - total - flux - tracklength - - - 74 2 - total - prompt-nu-fission - tracklength - - - 74 2 - total - flux - analog - - - 74 2 5 - total - prompt-nu-fission - analog - - - 74 2 - total - flux - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 46 - total - delayed-nu-fission - analog - - - 74 59 5 - total - delayed-nu-fission - analog - - - 74 2 - total - nu-fission - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 2 - total - delayed-nu-fission - tracklength - - - 74 59 2 - total - decay-rate - tracklength - - - 74 2 - total - flux - analog - - - 74 59 2 5 - total - delayed-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - analog - - - 147 5 - total - scatter-1 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - total - tracklength - - - 147 2 - total - flux - analog - - - 147 5 - total - nu-scatter-1 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - absorption - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - absorption - tracklength - - - 147 2 - total - fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - nu-fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - kappa-fission - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 - total - flux - analog - - - 147 2 - total - nu-scatter - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - nu-scatter-P3 - analog - - - 147 2 5 - total - nu-scatter - analog - - - 147 2 5 - total - scatter - analog - - - 147 2 - total - flux - analog - - - 147 2 5 - total - nu-fission - analog - - - 147 2 5 - total - scatter - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - scatter - tracklength - - - 147 2 5 - total - scatter-P3 - analog - - - 147 2 5 - total - nu-scatter-0 - analog - - - 147 2 5 - total - scatter-0 - analog - - - 147 46 - total - nu-fission - analog - - - 147 5 - total - nu-fission - analog - - - 147 46 - total - prompt-nu-fission - analog - - - 147 5 - total - prompt-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 2 - total - inverse-velocity - tracklength - - - 147 2 - total - flux - tracklength - - - 147 2 - total - prompt-nu-fission - tracklength - - - 147 2 - total - flux - analog - - - 147 2 5 - total - prompt-nu-fission - analog - - - 147 2 - total - flux - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 46 - total - delayed-nu-fission - analog - - - 147 59 5 - total - delayed-nu-fission - analog - - - 147 2 - total - nu-fission - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 2 - total - delayed-nu-fission - tracklength - - - 147 59 2 - total - decay-rate - tracklength - - - 147 2 - total - flux - analog - - - 147 59 2 5 - total - delayed-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 1 2 3 4 5 6 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + total + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + absorption + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + total + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-scatter-P3 + analog + + + 1 2 5 + total + nu-scatter + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + total + nu-fission + analog + + + 1 2 5 + total + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + scatter + tracklength + + + 1 2 5 + total + scatter-P3 + analog + + + 1 2 5 + total + nu-scatter-0 + analog + + + 1 2 5 + total + scatter-0 + analog + + + 1 46 + total + nu-fission + analog + + + 1 5 + total + nu-fission + analog + + + 1 46 + total + prompt-nu-fission + analog + + + 1 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + total + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + total + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + total + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 46 + total + delayed-nu-fission + analog + + + 1 59 5 + total + delayed-nu-fission + analog + + + 1 2 + total + nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + delayed-nu-fission + tracklength + + + 1 59 2 + total + decay-rate + tracklength + + + 1 2 + total + flux + analog + + + 1 59 2 5 + total + delayed-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + total + tracklength + + + 74 2 + total + flux + analog + + + 74 5 + total + nu-scatter-1 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + absorption + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + nu-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + kappa-fission + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 + total + flux + analog + + + 74 2 + total + nu-scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-scatter-P3 + analog + + + 74 2 5 + total + nu-scatter + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + analog + + + 74 2 5 + total + nu-fission + analog + + + 74 2 5 + total + scatter + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + scatter + tracklength + + + 74 2 5 + total + scatter-P3 + analog + + + 74 2 5 + total + nu-scatter-0 + analog + + + 74 2 5 + total + scatter-0 + analog + + + 74 46 + total + nu-fission + analog + + + 74 5 + total + nu-fission + analog + + + 74 46 + total + prompt-nu-fission + analog + + + 74 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 2 + total + inverse-velocity + tracklength + + + 74 2 + total + flux + tracklength + + + 74 2 + total + prompt-nu-fission + tracklength + + + 74 2 + total + flux + analog + + + 74 2 5 + total + prompt-nu-fission + analog + + + 74 2 + total + flux + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 46 + total + delayed-nu-fission + analog + + + 74 59 5 + total + delayed-nu-fission + analog + + + 74 2 + total + nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + delayed-nu-fission + tracklength + + + 74 59 2 + total + decay-rate + tracklength + + + 74 2 + total + flux + analog + + + 74 59 2 5 + total + delayed-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + total + tracklength + + + 147 2 + total + flux + analog + + + 147 5 + total + nu-scatter-1 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + absorption + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + nu-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + kappa-fission + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 + total + flux + analog + + + 147 2 + total + nu-scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-scatter-P3 + analog + + + 147 2 5 + total + nu-scatter + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + analog + + + 147 2 5 + total + nu-fission + analog + + + 147 2 5 + total + scatter + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + scatter + tracklength + + + 147 2 5 + total + scatter-P3 + analog + + + 147 2 5 + total + nu-scatter-0 + analog + + + 147 2 5 + total + scatter-0 + analog + + + 147 46 + total + nu-fission + analog + + + 147 5 + total + nu-fission + analog + + + 147 46 + total + prompt-nu-fission + analog + + + 147 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 2 + total + inverse-velocity + tracklength + + + 147 2 + total + flux + tracklength + + + 147 2 + total + prompt-nu-fission + tracklength + + + 147 2 + total + flux + analog + + + 147 2 5 + total + prompt-nu-fission + analog + + + 147 2 + total + flux + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 46 + total + delayed-nu-fission + analog + + + 147 59 5 + total + delayed-nu-fission + analog + + + 147 2 + total + nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + delayed-nu-fission + tracklength + + + 147 59 2 + total + decay-rate + tracklength + + + 147 2 + total + flux + analog + + + 147 59 2 5 + total + delayed-nu-fission + analog + diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 39828be87..826eb5b62 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1,1007 +1,1007 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -0.63 -0.63 -1 0.63 0.63 1 - - + eigenvalue + 100 + 10 + 5 + + + -0.63 -0.63 -1 0.63 0.63 1 + + - - 1 - - - 0.0 0.625 20000000.0 - - - 0.0 0.625 20000000.0 - - - 0.0 20000000.0 - - - 2 - - - 3 - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - total - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - U234 U235 U238 O16 - scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - total - tracklength - - - 1 2 - total - flux - analog - - - 1 5 - U234 U235 U238 O16 - nu-scatter-1 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - absorption - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - absorption - tracklength - - - 1 2 - U234 U235 U238 O16 - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - nu-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - kappa-fission - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - scatter - tracklength - - - 1 2 - total - flux - analog - - - 1 2 - U234 U235 U238 O16 - nu-scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - U234 U235 U238 O16 - scatter-P3 - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - U234 U235 U238 O16 - nu-scatter-P3 - analog - - - 1 2 5 - U234 U235 U238 O16 - nu-scatter - analog - - - 1 2 5 - U234 U235 U238 O16 - scatter - analog - - - 1 2 - total - flux - analog - - - 1 2 5 - U234 U235 U238 O16 - nu-fission - analog - - - 1 2 5 - U234 U235 U238 O16 - scatter - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - scatter - tracklength - - - 1 2 5 - U234 U235 U238 O16 - scatter-P3 - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - scatter - tracklength - - - 1 2 5 - U234 U235 U238 O16 - scatter-P3 - analog - - - 1 2 5 - U234 U235 U238 O16 - nu-scatter-0 - analog - - - 1 2 5 - U234 U235 U238 O16 - scatter-0 - analog - - - 1 46 - U234 U235 U238 O16 - nu-fission - analog - - - 1 5 - U234 U235 U238 O16 - nu-fission - analog - - - 1 46 - U234 U235 U238 O16 - prompt-nu-fission - analog - - - 1 5 - U234 U235 U238 O16 - prompt-nu-fission - analog - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - inverse-velocity - tracklength - - - 1 2 - total - flux - tracklength - - - 1 2 - U234 U235 U238 O16 - prompt-nu-fission - tracklength - - - 1 2 - total - flux - analog - - - 1 2 5 - U234 U235 U238 O16 - prompt-nu-fission - analog - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - total - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - total - tracklength - - - 57 2 - total - flux - analog - - - 57 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-1 - analog - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - total - tracklength - - - 57 2 - total - flux - analog - - - 57 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter-1 - analog - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - absorption - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - absorption - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - fission - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - fission - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - kappa-fission - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - tracklength - - - 57 2 - total - flux - analog - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter - analog - - - 57 2 - total - flux - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-P3 - analog - - - 57 2 - total - flux - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter-P3 - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - analog - - - 57 2 - total - flux - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - analog - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - tracklength - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-P3 - analog - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter - tracklength - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-P3 - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-scatter-0 - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - scatter-0 - analog - - - 57 46 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - analog - - - 57 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - nu-fission - analog - - - 57 46 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - analog - - - 57 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - analog - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - inverse-velocity - tracklength - - - 57 2 - total - flux - tracklength - - - 57 2 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - tracklength - - - 57 2 - total - flux - analog - - - 57 2 5 - Zr90 Zr91 Zr92 Zr94 Zr96 - prompt-nu-fission - analog - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - total - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - total - tracklength - - - 113 2 - total - flux - analog - - - 113 5 - H1 O16 B10 B11 - scatter-1 - analog - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - total - tracklength - - - 113 2 - total - flux - analog - - - 113 5 - H1 O16 B10 B11 - nu-scatter-1 - analog - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - absorption - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - absorption - tracklength - - - 113 2 - H1 O16 B10 B11 - fission - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - fission - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - nu-fission - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - kappa-fission - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - scatter - tracklength - - - 113 2 - total - flux - analog - - - 113 2 - H1 O16 B10 B11 - nu-scatter - analog - - - 113 2 - total - flux - analog - - - 113 2 5 - H1 O16 B10 B11 - scatter-P3 - analog - - - 113 2 - total - flux - analog - - - 113 2 5 - H1 O16 B10 B11 - nu-scatter-P3 - analog - - - 113 2 5 - H1 O16 B10 B11 - nu-scatter - analog - - - 113 2 5 - H1 O16 B10 B11 - scatter - analog - - - 113 2 - total - flux - analog - - - 113 2 5 - H1 O16 B10 B11 - nu-fission - analog - - - 113 2 5 - H1 O16 B10 B11 - scatter - analog - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - scatter - tracklength - - - 113 2 5 - H1 O16 B10 B11 - scatter-P3 - analog - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - scatter - tracklength - - - 113 2 5 - H1 O16 B10 B11 - scatter-P3 - analog - - - 113 2 5 - H1 O16 B10 B11 - nu-scatter-0 - analog - - - 113 2 5 - H1 O16 B10 B11 - scatter-0 - analog - - - 113 46 - H1 O16 B10 B11 - nu-fission - analog - - - 113 5 - H1 O16 B10 B11 - nu-fission - analog - - - 113 46 - H1 O16 B10 B11 - prompt-nu-fission - analog - - - 113 5 - H1 O16 B10 B11 - prompt-nu-fission - analog - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - inverse-velocity - tracklength - - - 113 2 - total - flux - tracklength - - - 113 2 - H1 O16 B10 B11 - prompt-nu-fission - tracklength - - - 113 2 - total - flux - analog - - - 113 2 5 - H1 O16 B10 B11 - prompt-nu-fission - analog - + + 1 + + + 0.0 0.625 20000000.0 + + + 0.0 0.625 20000000.0 + + + 0.0 20000000.0 + + + 2 + + + 3 + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + total + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + U234 U235 U238 O16 + scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + total + tracklength + + + 1 2 + total + flux + analog + + + 1 5 + U234 U235 U238 O16 + nu-scatter-1 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + absorption + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + absorption + tracklength + + + 1 2 + U234 U235 U238 O16 + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + nu-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + kappa-fission + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + scatter + tracklength + + + 1 2 + total + flux + analog + + + 1 2 + U234 U235 U238 O16 + nu-scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter-P3 + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-scatter-P3 + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-scatter + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter + analog + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-fission + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + scatter + tracklength + + + 1 2 5 + U234 U235 U238 O16 + scatter-P3 + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + scatter + tracklength + + + 1 2 5 + U234 U235 U238 O16 + scatter-P3 + analog + + + 1 2 5 + U234 U235 U238 O16 + nu-scatter-0 + analog + + + 1 2 5 + U234 U235 U238 O16 + scatter-0 + analog + + + 1 46 + U234 U235 U238 O16 + nu-fission + analog + + + 1 5 + U234 U235 U238 O16 + nu-fission + analog + + + 1 46 + U234 U235 U238 O16 + prompt-nu-fission + analog + + + 1 5 + U234 U235 U238 O16 + prompt-nu-fission + analog + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + inverse-velocity + tracklength + + + 1 2 + total + flux + tracklength + + + 1 2 + U234 U235 U238 O16 + prompt-nu-fission + tracklength + + + 1 2 + total + flux + analog + + + 1 2 5 + U234 U235 U238 O16 + prompt-nu-fission + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + total + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + total + tracklength + + + 57 2 + total + flux + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-1 + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + total + tracklength + + + 57 2 + total + flux + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter-1 + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + absorption + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + absorption + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + kappa-fission + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + tracklength + + + 57 2 + total + flux + analog + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter + analog + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-P3 + analog + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter-P3 + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + analog + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + tracklength + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-P3 + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter + tracklength + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-P3 + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-scatter-0 + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + scatter-0 + analog + + + 57 46 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + nu-fission + analog + + + 57 46 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + analog + + + 57 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + analog + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + inverse-velocity + tracklength + + + 57 2 + total + flux + tracklength + + + 57 2 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + tracklength + + + 57 2 + total + flux + analog + + + 57 2 5 + Zr90 Zr91 Zr92 Zr94 Zr96 + prompt-nu-fission + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + total + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + total + tracklength + + + 113 2 + total + flux + analog + + + 113 5 + H1 O16 B10 B11 + scatter-1 + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + total + tracklength + + + 113 2 + total + flux + analog + + + 113 5 + H1 O16 B10 B11 + nu-scatter-1 + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + absorption + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + absorption + tracklength + + + 113 2 + H1 O16 B10 B11 + fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + nu-fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + kappa-fission + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + scatter + tracklength + + + 113 2 + total + flux + analog + + + 113 2 + H1 O16 B10 B11 + nu-scatter + analog + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter-P3 + analog + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-scatter-P3 + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-scatter + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter + analog + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-fission + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + scatter + tracklength + + + 113 2 5 + H1 O16 B10 B11 + scatter-P3 + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + scatter + tracklength + + + 113 2 5 + H1 O16 B10 B11 + scatter-P3 + analog + + + 113 2 5 + H1 O16 B10 B11 + nu-scatter-0 + analog + + + 113 2 5 + H1 O16 B10 B11 + scatter-0 + analog + + + 113 46 + H1 O16 B10 B11 + nu-fission + analog + + + 113 5 + H1 O16 B10 B11 + nu-fission + analog + + + 113 46 + H1 O16 B10 B11 + prompt-nu-fission + analog + + + 113 5 + H1 O16 B10 B11 + prompt-nu-fission + analog + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + inverse-velocity + tracklength + + + 113 2 + total + flux + tracklength + + + 113 2 + H1 O16 B10 B11 + prompt-nu-fission + tracklength + + + 113 2 + total + flux + analog + + + 113 2 5 + H1 O16 B10 B11 + prompt-nu-fission + analog + diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 0be2eb89c..0d1fe99bd 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1,55 +1,55 @@ - - - - - - 2.0 2.0 - 1 - 2 2 - -2.0 -2.0 - + + + + + + 2.0 2.0 + 1 + 2 2 + -2.0 -2.0 + 11 11 11 11 - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + - eigenvalue - 1000 - 5 - 0 - - - -1 -1 -1 1 1 1 - - - true - 1000 + eigenvalue + 1000 + 5 + 0 + + + -1 -1 -1 1 1 1 + + + true + 1000 - - U235 O16 total - total fission (n,gamma) elastic (n,p) - + + U235 O16 total + total fission (n,gamma) elastic (n,p) + diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 5f7da5c47..61958701b 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -1,37 +1,37 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - eigenvalue - 1000 - 4 - 0 - - - -5.0 -5.0 -5.0 5.0 5.0 5.0 - - + eigenvalue + 1000 + 4 + 0 + + + -5.0 -5.0 -5.0 5.0 5.0 5.0 + + diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index 63a7931a7..70fe165fd 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1,34 +1,34 @@ - - + + - - - - - - - + + + + + + + - eigenvalue - 1000 - 10 - 5 - - - -4 -4 -4 4 4 4 - - - - true - ares - 1.0 - 210.0 - U238 U235 Pu239 - + eigenvalue + 1000 + 10 + 5 + + + -4 -4 -4 4 4 4 + + + + true + ares + 1.0 + 210.0 + U238 U235 Pu239 + diff --git a/tests/test_source/inputs_true.dat b/tests/test_source/inputs_true.dat index bb80609af..da230e0e5 100644 --- a/tests/test_source/inputs_true.dat +++ b/tests/test_source/inputs_true.dat @@ -1,54 +1,54 @@ - - + + - - 294 - - - + + 294 + + + - eigenvalue - 1000 - 10 - 5 - - - - - -4.0 -1.0 3.0 0.2 0.3 0.5 - - - -2.0 0.0 2.0 0.2 0.3 0.2 - - - - - -1.0 0.0 1.0 0.5 0.25 0.25 - - - - - - - - -4.0 -4.0 -4.0 4.0 4.0 4.0 - - - - - - - 1.2 -2.3 0.781 - - - - 1.0 1.38949549437 1.93069772888 2.68269579528 3.72759372031 5.17947467923 7.19685673001 10.0 13.8949549437 19.3069772888 26.8269579528 37.2759372031 51.7947467923 71.9685673001 100.0 138.949549437 193.069772888 268.269579528 372.759372031 517.947467923 719.685673001 1000.0 1389.49549437 1930.69772888 2682.69579528 3727.59372031 5179.47467923 7196.85673001 10000.0 13894.9549437 19306.9772888 26826.9579528 37275.9372031 51794.7467923 71968.5673001 100000.0 138949.549437 193069.772888 268269.579528 372759.372031 517947.467923 719685.673001 1000000.0 1389495.49437 1930697.72888 2682695.79528 3727593.72031 5179474.67923 7196856.73001 10000000.0 0.0 2.90864392994e-08 5.80533561806e-08 8.67817193689e-08 1.15153477858e-07 1.43052046006e-07 1.70362782612e-07 1.96973462002e-07 2.22774735186e-07 2.47660579198e-07 2.71528732767e-07 2.9428111653e-07 3.15824236062e-07 3.36069566065e-07 3.54933914133e-07 3.72339762616e-07 3.88215587147e-07 4.02496150558e-07 4.15122770952e-07 4.26043562837e-07 4.35213650335e-07 4.42595351592e-07 4.48158333612e-07 4.5187973691e-07 4.53744269441e-07 4.53744269441e-07 4.5187973691e-07 4.48158333612e-07 4.42595351592e-07 4.35213650335e-07 4.26043562837e-07 4.15122770952e-07 4.02496150558e-07 3.88215587147e-07 3.72339762616e-07 3.54933914133e-07 3.36069566065e-07 3.15824236062e-07 2.9428111653e-07 2.71528732767e-07 2.47660579198e-07 2.22774735186e-07 1.96973462002e-07 1.70362782612e-07 1.43052046006e-07 1.15153477858e-07 8.67817193689e-08 5.80533561806e-08 2.90864392994e-08 5.55962111528e-23 - - + eigenvalue + 1000 + 10 + 5 + + + + + -4.0 -1.0 3.0 0.2 0.3 0.5 + + + -2.0 0.0 2.0 0.2 0.3 0.2 + + + + + -1.0 0.0 1.0 0.5 0.25 0.25 + + + + + + + + -4.0 -4.0 -4.0 4.0 4.0 4.0 + + + + + + + 1.2 -2.3 0.781 + + + + 1.0 1.38949549437 1.93069772888 2.68269579528 3.72759372031 5.17947467923 7.19685673001 10.0 13.8949549437 19.3069772888 26.8269579528 37.2759372031 51.7947467923 71.9685673001 100.0 138.949549437 193.069772888 268.269579528 372.759372031 517.947467923 719.685673001 1000.0 1389.49549437 1930.69772888 2682.69579528 3727.59372031 5179.47467923 7196.85673001 10000.0 13894.9549437 19306.9772888 26826.9579528 37275.9372031 51794.7467923 71968.5673001 100000.0 138949.549437 193069.772888 268269.579528 372759.372031 517947.467923 719685.673001 1000000.0 1389495.49437 1930697.72888 2682695.79528 3727593.72031 5179474.67923 7196856.73001 10000000.0 0.0 2.90864392994e-08 5.80533561806e-08 8.67817193689e-08 1.15153477858e-07 1.43052046006e-07 1.70362782612e-07 1.96973462002e-07 2.22774735186e-07 2.47660579198e-07 2.71528732767e-07 2.9428111653e-07 3.15824236062e-07 3.36069566065e-07 3.54933914133e-07 3.72339762616e-07 3.88215587147e-07 4.02496150558e-07 4.15122770952e-07 4.26043562837e-07 4.35213650335e-07 4.42595351592e-07 4.48158333612e-07 4.5187973691e-07 4.53744269441e-07 4.53744269441e-07 4.5187973691e-07 4.48158333612e-07 4.42595351592e-07 4.35213650335e-07 4.26043562837e-07 4.15122770952e-07 4.02496150558e-07 3.88215587147e-07 3.72339762616e-07 3.54933914133e-07 3.36069566065e-07 3.15824236062e-07 2.9428111653e-07 2.71528732767e-07 2.47660579198e-07 2.22774735186e-07 1.96973462002e-07 1.70362782612e-07 1.43052046006e-07 1.15153477858e-07 8.67817193689e-08 5.80533561806e-08 2.90864392994e-08 5.55962111528e-23 + + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index 9e452698b..a85491e94 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,381 +127,381 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 400 - 5 - 0 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 400 + 5 + 0 + + + -160 -160 -183 160 160 183 + + - - 2 2 - -182.07 -182.07 - 182.07 182.07 - - - -3.14159 -1.885 -0.6283 0.6283 1.885 3.14159 - - - 1 - - - 10 21 22 23 - - - 1 2 3 4 5 6 - - - 0.0 0.253 1000.0 1000000.0 20000000.0 - - - 0.0 0.253 1000.0 1000000.0 20000000.0 - - - 1 2 3 4 - - - -1.0 -0.5 0.0 0.5 1.0 - - - 0.0 0.6283 1.2566 1.885 2.5132 3.14159 - - - 1 2 3 4 6 8 - - - 10 21 22 23 60 - - - 21 22 23 27 28 29 60 - - - 1 - flux - tracklength - - - 1 - flux - analog - - - 1 2 - flux - tracklength - - - 3 - total - - - 4 - delayed-nu-fission - - - 5 - total - - - 6 - scatter - - - 5 6 - scatter nu-fission - - - 7 - total - - - 8 - scatter nu-scatter - - - 8 2 - scatter nu-scatter - - - 9 - flux - tracklength - - - 9 - flux - analog - - - 9 2 - flux - tracklength - - - 10 - total - - - 11 - absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable - tracklength - - - 11 - absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable - analog - - - 11 - absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable - collision - - - 12 - flux - - - 12 - flux-y5 - tracklength - - - 12 - flux-y5 - analog - - - 12 - flux-y5 - collision - - - 11 - scatter scatter-1 scatter-2 scatter-3 scatter-4 nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - - 11 - scatter-p4 scatter-y4 nu-scatter-p4 nu-scatter-y3 - - - 11 - total - - - 11 - U235 total - total-y4 - tracklength - - - 11 - U235 total - total-y4 - analog - - - 11 - U235 total - total-y4 - collision - - - 11 - all - total - tracklength - - - 11 - all - total - collision - - - 2 - all - total - tracklength - - - 2 - U235 - total - tracklength - + + 2 2 + -182.07 -182.07 + 182.07 182.07 + + + -3.14159 -1.885 -0.6283 0.6283 1.885 3.14159 + + + 1 + + + 10 21 22 23 + + + 1 2 3 4 5 6 + + + 0.0 0.253 1000.0 1000000.0 20000000.0 + + + 0.0 0.253 1000.0 1000000.0 20000000.0 + + + 1 2 3 4 + + + -1.0 -0.5 0.0 0.5 1.0 + + + 0.0 0.6283 1.2566 1.885 2.5132 3.14159 + + + 1 2 3 4 6 8 + + + 10 21 22 23 60 + + + 21 22 23 27 28 29 60 + + + 1 + flux + tracklength + + + 1 + flux + analog + + + 1 2 + flux + tracklength + + + 3 + total + + + 4 + delayed-nu-fission + + + 5 + total + + + 6 + scatter + + + 5 6 + scatter nu-fission + + + 7 + total + + + 8 + scatter nu-scatter + + + 8 2 + scatter nu-scatter + + + 9 + flux + tracklength + + + 9 + flux + analog + + + 9 2 + flux + tracklength + + + 10 + total + + + 11 + absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable + tracklength + + + 11 + absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable + analog + + + 11 + absorption delayed-nu-fission events fission inverse-velocity kappa-fission (n,2n) (n,n1) (n,gamma) nu-fission scatter elastic total prompt-nu-fission fission-q-prompt fission-q-recoverable + collision + + + 12 + flux + + + 12 + flux-y5 + tracklength + + + 12 + flux-y5 + analog + + + 12 + flux-y5 + collision + + + 11 + scatter scatter-1 scatter-2 scatter-3 scatter-4 nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 + + + 11 + scatter-p4 scatter-y4 nu-scatter-p4 nu-scatter-y3 + + + 11 + total + + + 11 + U235 total + total-y4 + tracklength + + + 11 + U235 total + total-y4 + analog + + + 11 + U235 total + total-y4 + collision + + + 11 + all + total + tracklength + + + 11 + all + total + collision + + + 2 + all + total + tracklength + + + 2 + U235 + total + tracklength + diff --git a/tests/test_tallies/results_true.dat b/tests/test_tallies/results_true.dat index a70e0c916..e9c0865fd 100644 --- a/tests/test_tallies/results_true.dat +++ b/tests/test_tallies/results_true.dat @@ -1 +1 @@ -709fa0289db8284c3a9e43bee6b1fff6df635778287819baf1841657bd68ee7fa8790d64e86c123bad96828c25ffbb30fc7261460baf53819bec090b4ae38bc1 \ No newline at end of file +13014f42dea87bf6c1fc0d41361cdba8a7e32a8f809d348567dfce638c849f58a0c0f17065c199946db81a264ef72db850aea93b0e11adf4f70ec969e30529cd \ No newline at end of file diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 05499cd14..7a8bf4613 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,197 +127,197 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 0.0 0.253 1000.0 1000000.0 20000000.0 - - - 60 - - - 1 2 - U234 U235 U238 - nu-fission total - + + 0.0 0.253 1000.0 1000000.0 20000000.0 + + + 60 + + + 1 2 + U234 U235 U238 + nu-fission total + diff --git a/tests/test_tally_aggregation/results_true.dat b/tests/test_tally_aggregation/results_true.dat index 31d2faa7f..ee763b3ba 100644 --- a/tests/test_tally_aggregation/results_true.dat +++ b/tests/test_tally_aggregation/results_true.dat @@ -1 +1 @@ -a5a6f035b6106bd6d0312f0f339193f8745f9e3260c704d60d230fc1675a8e779b58a73a2c1f84e8f312d8a0e335d2d84341fe7df25e24024cc09a31058ebfe7 \ No newline at end of file +eb2002dd2f3016154e7014501629227eb2e5b2a9655b5c0cb3b9d4d681f918fae4197bf4756fe9865c8d34f392b981b287a15e9b2fab5a46b2a5b8a33a8ae770 \ No newline at end of file diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index 1a8888cdf..743ca3c58 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,213 +127,213 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - 2 2 2 - -160.0 -160.0 -183.0 - 160.0 160.0 183.0 - - - 1 3 - - - 0.0 2.53e-07 0.001 1.0 20.0 - - - 60 - - - 1 - - - 2 1 3 - U234 U235 - nu-fission total - - - 1 4 - U238 U235 - total fission - + + 2 2 2 + -160.0 -160.0 -183.0 + 160.0 160.0 183.0 + + + 1 3 + + + 0.0 2.53e-07 0.001 1.0 20.0 + + + 60 + + + 1 + + + 2 1 3 + U234 U235 + nu-fission total + + + 1 4 + U238 U235 + total fission + diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index e2b76aed2..b1c089c96 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -1,38 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 @@ -50,12 +50,12 @@ 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 @@ -73,12 +73,12 @@ 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 @@ -100,12 +100,12 @@ 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 @@ -127,222 +127,222 @@ 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 10 - 5 - - - -160 -160 -183 160 160 183 - - + eigenvalue + 100 + 10 + 5 + + + -160 -160 -183 160 160 183 + + - - - 2 2 - -50.0 -50.0 - 50.0 50.0 - - - 21 27 - - - 0.0 0.625 20000000.0 - - - 21 - - - 1 - - - 16 8 - U235 U238 - fission nu-fission - tracklength - - - 6 8 - U235 U238 - fission nu-fission - tracklength - - - 7 8 - U235 U238 - fission nu-fission - tracklength - + + + 2 2 + -50.0 -50.0 + 50.0 50.0 + + + 21 27 + + + 0.0 0.625 20000000.0 + + + 21 + + + 1 + + + 16 8 + U235 U238 + fission nu-fission + tracklength + + + 6 8 + U235 U238 + fission nu-fission + tracklength + + + 7 8 + U235 U238 + fission nu-fission + tracklength + diff --git a/tests/test_tally_slice_merge/results_true.dat b/tests/test_tally_slice_merge/results_true.dat index 2bb1c2ad9..4f1d6c6e2 100644 --- a/tests/test_tally_slice_merge/results_true.dat +++ b/tests/test_tally_slice_merge/results_true.dat @@ -1,36 +1,36 @@ cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U235 fission 2.36e-01 2.26e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U235 nu-fission 5.74e-01 5.51e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U238 fission 3.19e-07 3.06e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U238 nu-fission 7.96e-07 7.63e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U235 fission 2.82e-02 1.82e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U235 nu-fission 6.92e-02 4.42e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U238 fission 1.98e-02 1.74e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 6.25e-01 2.00e+07 U238 nu-fission 5.54e-02 4.65e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U235 fission 1.11e-01 1.16e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U235 nu-fission 2.71e-01 2.83e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U238 fission 1.53e-07 1.67e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 0.00e+00 6.25e-01 U238 nu-fission 3.81e-07 4.15e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U235 fission 2.00e-02 2.72e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U235 nu-fission 4.89e-02 6.62e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U238 fission 1.06e-02 6.18e-04 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 27 6.25e-01 2.00e+07 U238 nu-fission 2.91e-02 1.85e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. -0 21 0.00e+00 6.25e-01 U235 fission 2.36e-01 2.26e-02 -1 21 0.00e+00 6.25e-01 U235 nu-fission 5.74e-01 5.51e-02 -2 21 0.00e+00 6.25e-01 U238 fission 3.19e-07 3.06e-08 -3 21 0.00e+00 6.25e-01 U238 nu-fission 7.96e-07 7.63e-08 -4 21 6.25e-01 2.00e+07 U235 fission 2.82e-02 1.82e-03 -5 21 6.25e-01 2.00e+07 U235 nu-fission 6.92e-02 4.42e-03 -6 21 6.25e-01 2.00e+07 U238 fission 1.98e-02 1.74e-03 -7 21 6.25e-01 2.00e+07 U238 nu-fission 5.54e-02 4.65e-03 -8 27 0.00e+00 6.25e-01 U235 fission 1.11e-01 1.16e-02 -9 27 0.00e+00 6.25e-01 U235 nu-fission 2.71e-01 2.83e-02 -10 27 0.00e+00 6.25e-01 U238 fission 1.53e-07 1.67e-08 -11 27 0.00e+00 6.25e-01 U238 nu-fission 3.81e-07 4.15e-08 -12 27 6.25e-01 2.00e+07 U235 fission 2.00e-02 2.72e-03 -13 27 6.25e-01 2.00e+07 U235 nu-fission 4.89e-02 6.62e-03 -14 27 6.25e-01 2.00e+07 U238 fission 1.06e-02 6.18e-04 -15 27 6.25e-01 2.00e+07 U238 nu-fission 2.91e-02 1.85e-03 +0 21 0.00e+00 6.25e-01 U235 fission 2.21e-01 9.47e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U235 nu-fission 5.38e-01 2.31e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U238 fission 3.05e-07 1.36e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U238 nu-fission 7.60e-07 3.39e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U235 fission 3.97e-02 4.54e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U235 nu-fission 9.72e-02 1.10e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U238 fission 1.89e-02 1.11e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 6.25e-01 2.00e+07 U238 nu-fission 5.31e-02 3.32e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U235 fission 6.24e-02 1.10e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U235 nu-fission 1.52e-01 2.67e-02 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U238 fission 8.80e-08 1.49e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 0.00e+00 6.25e-01 U238 nu-fission 2.19e-07 3.72e-08 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U235 fission 1.08e-02 1.46e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U235 nu-fission 2.65e-02 3.55e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U238 fission 5.88e-03 9.74e-04 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 27 6.25e-01 2.00e+07 U238 nu-fission 1.61e-02 2.59e-03 cell energy low [eV] energy high [eV] nuclide score mean std. dev. +0 21 0.00e+00 6.25e-01 U235 fission 2.21e-01 9.47e-03 +1 21 0.00e+00 6.25e-01 U235 nu-fission 5.38e-01 2.31e-02 +2 21 0.00e+00 6.25e-01 U238 fission 3.05e-07 1.36e-08 +3 21 0.00e+00 6.25e-01 U238 nu-fission 7.60e-07 3.39e-08 +4 21 6.25e-01 2.00e+07 U235 fission 3.97e-02 4.54e-03 +5 21 6.25e-01 2.00e+07 U235 nu-fission 9.72e-02 1.10e-02 +6 21 6.25e-01 2.00e+07 U238 fission 1.89e-02 1.11e-03 +7 21 6.25e-01 2.00e+07 U238 nu-fission 5.31e-02 3.32e-03 +8 27 0.00e+00 6.25e-01 U235 fission 6.24e-02 1.10e-02 +9 27 0.00e+00 6.25e-01 U235 nu-fission 1.52e-01 2.67e-02 +10 27 0.00e+00 6.25e-01 U238 fission 8.80e-08 1.49e-08 +11 27 0.00e+00 6.25e-01 U238 nu-fission 2.19e-07 3.72e-08 +12 27 6.25e-01 2.00e+07 U235 fission 1.08e-02 1.46e-03 +13 27 6.25e-01 2.00e+07 U235 nu-fission 2.65e-02 3.55e-03 +14 27 6.25e-01 2.00e+07 U238 fission 5.88e-03 9.74e-04 +15 27 6.25e-01 2.00e+07 U238 nu-fission 1.61e-02 2.59e-03 sum(distribcell) energy low [eV] energy high [eV] nuclide score mean std. dev. 0 (0, 100, 2000, 30000) 0.00e+00 6.25e-01 U235 fission 0.00e+00 0.00e+00 1 (0, 100, 2000, 30000) 0.00e+00 6.25e-01 U235 nu-fission 0.00e+00 0.00e+00 @@ -49,19 +49,19 @@ 14 (500, 5000, 50000) 6.25e-01 2.00e+07 U238 fission 0.00e+00 0.00e+00 15 (500, 5000, 50000) 6.25e-01 2.00e+07 U238 nu-fission 0.00e+00 0.00e+00 sum(mesh) energy low [eV] energy high [eV] nuclide score mean std. dev. -0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 fission 1.12e-02 2.45e-03 -1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 2.74e-02 5.96e-03 -2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 fission 1.56e-08 3.04e-09 -3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 3.89e-08 7.57e-09 -4 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 fission 1.15e-03 4.71e-04 -5 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 2.81e-03 1.15e-03 -6 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 fission 3.25e-04 9.99e-05 -7 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 8.81e-04 2.68e-04 -8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 fission 1.44e-02 5.57e-03 -9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 3.51e-02 1.36e-02 -10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 fission 1.95e-08 7.37e-09 -11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 4.86e-08 1.84e-08 -12 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 fission 2.55e-03 1.30e-03 -13 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 6.23e-03 3.16e-03 -14 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 fission 8.62e-04 4.53e-04 -15 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 2.30e-03 1.21e-03 +0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 fission 1.48e-02 3.65e-03 +1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 3.60e-02 8.90e-03 +2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 fission 2.06e-08 4.98e-09 +3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 5.14e-08 1.24e-08 +4 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 fission 2.23e-03 3.92e-04 +5 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 5.45e-03 9.56e-04 +6 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 fission 5.58e-04 2.08e-04 +7 ((1, 1, 1), (1, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 1.50e-03 5.43e-04 +8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 fission 2.56e-02 5.50e-03 +9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U235 nu-fission 6.24e-02 1.34e-02 +10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 fission 3.55e-08 7.70e-09 +11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-01 U238 nu-fission 8.85e-08 1.92e-08 +12 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 fission 5.01e-03 1.38e-03 +13 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U235 nu-fission 1.22e-02 3.37e-03 +14 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 fission 2.40e-03 2.69e-04 +15 ((2, 1, 1), (2, 2, 1)) 6.25e-01 2.00e+07 U238 nu-fission 6.60e-03 7.63e-04 diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index ffa9ffc5e..fdbc1cb5f 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1,209 +1,209 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.333333333333 0.333333333333 0.333333333333 - 38 - 3 3 3 - -0.5 -0.5 -0.5 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.333333333333 0.333333333333 0.333333333333 + 38 + 3 3 3 + -0.5 -0.5 -0.5 + 17 18 19 14 15 16 11 12 13 @@ -215,228 +215,228 @@ 35 36 37 32 33 34 29 30 31 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - eigenvalue - 100 - 5 - 0 - - - 0.0 0.0 0.0 - - + eigenvalue + 100 + 5 + 0 + + + 0.0 0.0 0.0 + + diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 627d30a40..28f1cbd9f 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -1,51 +1,51 @@ - - - - - - - - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - volume - - cell - 1 2 3 - 100000 - -1.0 -1.0 -6.0 - 1.0 1.0 6.0 - - - material - 1 2 - 100000 - -1.0 -1.0 -6.0 - 1.0 1.0 6.0 - - - universe - 0 - 100000 - -1.0 -1.0 -6.0 - 1.0 1.0 6.0 - + volume + + cell + 1 2 3 + 100000 + -1.0 -1.0 -6.0 + 1.0 1.0 6.0 + + + material + 1 2 + 100000 + -1.0 -1.0 -6.0 + 1.0 1.0 6.0 + + + universe + 0 + 100000 + -1.0 -1.0 -6.0 + 1.0 1.0 6.0 + From c3c9df6a85c0a27438e507ecdbf751b374fcf26c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Jun 2017 21:58:05 -0400 Subject: [PATCH 020/123] Make Intersection and Union obey the mutable sequence protocol --- openmc/cell.py | 4 +- openmc/model/triso.py | 2 +- openmc/openmoc_compatible.py | 8 +- openmc/region.py | 172 +++++++++++++++++++---------------- openmc/surface.py | 8 +- openmc/universe.py | 2 +- openmc/volume.py | 2 +- 7 files changed, 107 insertions(+), 91 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 5f8baa589..d962c2725 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -357,7 +357,7 @@ class Cell(IDManagerMixin): self.region = region else: if isinstance(self.region, Intersection): - self.region.nodes.append(region) + self.region &= region else: self.region = Intersection(self.region, region) @@ -579,7 +579,7 @@ class Cell(IDManagerMixin): elif isinstance(node, Complement): create_surface_elements(node.node, element) else: - for subnode in node.nodes: + for subnode in node: create_surface_elements(subnode, element) # Call the recursive function from the top node diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 2090dc977..67bf3bc44 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -513,7 +513,7 @@ def create_triso_lattice(trisos, lower_left, pitch, shape, background): universes = np.empty(shape[::-1], dtype=openmc.Universe) for idx, triso_list in sorted(triso_locations.items()): if len(triso_list) > 0: - outside_trisos = openmc.Intersection(*[~t.region for t in triso_list]) + outside_trisos = openmc.Intersection(~t.region for t in triso_list) background_cell = openmc.Cell(fill=background, region=outside_trisos) else: background_cell = openmc.Cell(fill=background) diff --git a/openmc/openmoc_compatible.py b/openmc/openmoc_compatible.py index 21dc4b6a6..d18070740c 100644 --- a/openmc/openmoc_compatible.py +++ b/openmc/openmoc_compatible.py @@ -371,11 +371,11 @@ def get_openmoc_region(openmc_region): openmoc.Halfspace(halfspace, get_openmoc_surface(surface)) elif isinstance(openmc_region, openmc.Intersection): openmoc_region = openmoc.Intersection() - for openmc_node in openmc_region.nodes: + for openmc_node in openmc_region: openmoc_region.addNode(get_openmoc_region(openmc_node)) elif isinstance(openmc_region, openmc.Union): openmoc_region = openmoc.Union() - for openmc_node in openmc_region.nodes: + for openmc_node in openmc_region: openmoc_region.addNode(get_openmoc_region(openmc_node)) elif isinstance(openmc_region, openmc.Complement): openmoc_region = openmoc.Complement() @@ -411,12 +411,12 @@ def get_openmc_region(openmoc_region): openmc_region = openmc.Intersection() for openmoc_node in openmoc_region.getNodes(): openmc_node = get_openmc_region(openmoc_node) - openmc_region.nodes.append(openmc_node) + openmc_region.append(openmc_node) elif openmoc_region.getRegionType() == openmoc.UNION: openmc_region = openmc.Union() for openmoc_node in openmoc_region.getNodes(): openmc_node = get_openmc_region(openmoc_node) - openmc_region.nodes.append(openmc_node) + openmc_region.append(openmc_node) elif openmoc_region.getRegionType() == openmoc.COMPLEMENT: openmoc_nodes = openmoc_region.getNodes() openmc_node = get_openmc_region(openmoc_nodes[0]) diff --git a/openmc/region.py b/openmc/region.py index 854852ba4..eeafd2832 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from collections import Iterable, OrderedDict +from collections import Iterable, OrderedDict, MutableSequence from copy import deepcopy from six import add_metaclass @@ -20,21 +20,21 @@ class Region(object): """ def __and__(self, other): - return Intersection(self, other) + return Intersection((self, other)) def __or__(self, other): - return Union(self, other) + return Union((self, other)) def __invert__(self): return Complement(self) @abstractmethod def __contains__(self, point): - return False + pass @abstractmethod def __str__(self): - return '' + pass def __eq__(self, other): if not isinstance(other, type(self)): @@ -55,7 +55,7 @@ class Region(object): ---------- surfaces: collections.OrderedDict, optional Dictionary mapping surface IDs to :class:`openmc.Surface` instances - + Returns ------- surfaces: collections.OrderedDict @@ -150,32 +150,26 @@ class Region(object): r2 = output.pop() if operator == ' ': r1 = output.pop() - if isinstance(r1, Intersection) and can_be_combined(r2): - r1.nodes.append(r2) + if isinstance(r1, Intersection): + r1 &= r2 output.append(r1) elif isinstance(r2, Intersection) and can_be_combined(r1): - r2.nodes.insert(0, r1) + r2.insert(0, r1) output.append(r2) - elif isinstance(r1, Intersection) and isinstance(r2, Intersection): - r1.nodes += r2.nodes - output.append(r1) else: - output.append(Intersection(r1, r2)) + output.append(r1 & r2) elif operator == '|': r1 = output.pop() - if isinstance(r1, Union) and can_be_combined(r2): - r1.nodes.append(r2) + if isinstance(r1, Union): + r1 |= r2 output.append(r1) elif isinstance(r2, Union) and can_be_combined(r1): - r2.nodes.insert(0, r1) + r2.insert(0, r1) output.append(r2) - elif isinstance(r1, Union) and isinstance(r2, Union): - r1.nodes += r2.nodes - output.append(r1) else: - output.append(Union(r1, r2)) + output.append(r1 | r2) elif operator == '~': - output.append(Complement(r2)) + output.append(~r2) # The following is an implementation of the shunting yard algorithm to # generate an abstract syntax tree for the region expression. @@ -248,12 +242,12 @@ class Region(object): 'the abstract region class.') -class Intersection(Region): +class Intersection(Region, MutableSequence): r"""Intersection of two or more regions. - Instances of Intersection are generally created via the __and__ operator - applied to two instances of :class:`openmc.Region`. This is illustrated in - the following example: + Instances of Intersection are generally created via the & operator applied + to two instances of :class:`openmc.Region`. This is illustrated in the + following example: >>> equator = openmc.ZPlane(z0=0.0) >>> earth = openmc.Sphere(R=637.1e6) @@ -262,31 +256,51 @@ class Intersection(Region): >>> type(northern_hemisphere) + Instances of this class behave like a mutable sequence, e.g., they can be + indexed and have an append() method. + Parameters ---------- - \*nodes + nodes : iterable of openmc.Region Regions to take the intersection of Attributes ---------- - nodes : list of openmc.Region - Regions to take the intersection of bounding_box : tuple of numpy.array Lower-left and upper-right coordinates of an axis-aligned bounding box """ - def __init__(self, *nodes): - self.nodes = list(nodes) + def __init__(self, nodes): + self._nodes = list(nodes) def __and__(self, other): - new = Intersection(*self.nodes) - new.nodes.append(other) + new = Intersection(self) + new &= other return new - def __iter__(self): - for n in self.nodes: - yield n + def __iand__(self, other): + if isinstance(other, Intersection): + self.extend(other) + else: + self.append(other) + return self + + # Implement mutable sequence protocol by delegating to list + def __getitem__(self, key): + return self._nodes[key] + + def __setitem__(self, key, value): + self._nodes[key] = value + + def __delitem__(self, key): + del self._nodes[key] + + def __len__(self): + return len(self._nodes) + + def insert(self, index, value): + self._nodes.insert(index, value) def __contains__(self, point): """Check whether a point is contained in the region. @@ -302,30 +316,21 @@ class Intersection(Region): Whether the point is in the region """ - return all(point in n for n in self.nodes) + return all(point in n for n in self) def __str__(self): - return '(' + ' '.join(map(str, self.nodes)) + ')' - - @property - def nodes(self): - return self._nodes + return '(' + ' '.join(map(str, self)) + ')' @property def bounding_box(self): lower_left = np.array([-np.inf, -np.inf, -np.inf]) upper_right = np.array([np.inf, np.inf, np.inf]) - for n in self.nodes: + for n in self: lower_left_n, upper_right_n = n.bounding_box lower_left[:] = np.maximum(lower_left, lower_left_n) upper_right[:] = np.minimum(upper_right, upper_right_n) return lower_left, upper_right - @nodes.setter - def nodes(self, nodes): - check_type('nodes', nodes, Iterable, Region) - self._nodes = nodes - def clone(self, memo=None): """Create a copy of this region - each of the surfaces in the intersection's nodes will be cloned and will have new unique IDs. @@ -347,47 +352,67 @@ class Intersection(Region): memo = {} clone = deepcopy(self) - clone.nodes = [n.clone(memo) for n in self.nodes] + clone[:] = [n.clone(memo) for n in self] return clone -class Union(Region): +class Union(Region, MutableSequence): r"""Union of two or more regions. - Instances of Union are generally created via the __or__ operator applied to - two instances of :class:`openmc.Region`. This is illustrated in the - following example: + Instances of Union are generally created via the | operator applied to two + instances of :class:`openmc.Region`. This is illustrated in the following + example: >>> s1 = openmc.ZPlane(z0=0.0) >>> s2 = openmc.Sphere(R=637.1e6) >>> type(-s2 | +s1) + Instances of this class behave like a mutable sequence, e.g., they can be + indexed and have an append() method. + Parameters ---------- - \*nodes + nodes : iterable of openmc.Region Regions to take the union of Attributes ---------- - nodes : tuple of openmc.Region - Regions to take the union of bounding_box : 2-tuple of numpy.array Lower-left and upper-right coordinates of an axis-aligned bounding box """ - def __init__(self, *nodes): - self.nodes = list(nodes) + def __init__(self, nodes): + self._nodes = list(nodes) def __or__(self, other): - new = Union(*self.nodes) - new.nodes.append(other) + new = Union(self) + new |= other return new - def __iter__(self): - for n in self.nodes: - yield n + def __ior__(self, other): + if isinstance(other, Union): + self.extend(other) + else: + self.append(other) + return self + + # Implement mutable sequence protocol by delegating to list + def __getitem__(self, key): + return self._nodes[key] + + def __setitem__(self, key, value): + self._nodes[key] = value + + def __delitem__(self, key): + del self._nodes[key] + + def __len__(self): + return len(self._nodes) + + def insert(self, index, value): + self._nodes.insert(index, value) def __contains__(self, point): """Check whether a point is contained in the region. @@ -403,30 +428,21 @@ class Union(Region): Whether the point is in the region """ - return any(point in n for n in self.nodes) + return any(point in n for n in self) def __str__(self): - return '(' + ' | '.join(map(str, self.nodes)) + ')' - - @property - def nodes(self): - return self._nodes + return '(' + ' | '.join(map(str, self)) + ')' @property def bounding_box(self): lower_left = np.array([np.inf, np.inf, np.inf]) upper_right = np.array([-np.inf, -np.inf, -np.inf]) - for n in self.nodes: + for n in self: lower_left_n, upper_right_n = n.bounding_box lower_left[:] = np.minimum(lower_left, lower_left_n) upper_right[:] = np.maximum(upper_right, upper_right_n) return lower_left, upper_right - @nodes.setter - def nodes(self, nodes): - check_type('nodes', nodes, Iterable, Region) - self._nodes = nodes - def clone(self, memo=None): """Create a copy of this region - each of the surfaces in the union's nodes will be cloned and will have new unique IDs. @@ -448,7 +464,7 @@ class Union(Region): memo = {} clone = copy.deepcopy(self) - clone.nodes = [n.clone(memo) for n in self.nodes] + clone[:] = [n.clone(memo) for n in self] return clone @@ -456,7 +472,7 @@ class Complement(Region): """Complement of a region. The Complement of an existing :class:`openmc.Region` can be created by using - the __invert__ operator as the following example demonstrates: + the ~ operator as the following example demonstrates: >>> xl = openmc.XPlane(x0=-10.0) >>> xr = openmc.XPlane(x0=10.0) @@ -518,9 +534,9 @@ class Complement(Region): # only applies to surface half-spaces, thus allowing us to calculate the # bounding box in the usual recursive manner. if isinstance(self.node, Union): - temp_region = Intersection(*[~n for n in self.node.nodes]) + temp_region = Intersection(~n for n in self.node) elif isinstance(self.node, Intersection): - temp_region = Union(*[~n for n in self.node.nodes]) + temp_region = Union(~n for n in self.node) elif isinstance(self.node, Complement): temp_region = self.node.node else: diff --git a/openmc/surface.py b/openmc/surface.py index dca9a76bd..b415ecb93 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -1843,15 +1843,15 @@ class Halfspace(Region): def __and__(self, other): if isinstance(other, Intersection): - return Intersection(self, *other.nodes) + return Intersection([self] + other[:]) else: - return Intersection(self, other) + return Intersection((self, other)) def __or__(self, other): if isinstance(other, Union): - return Union(self, *other.nodes) + return Union([self] + other[:]) else: - return Union(self, other) + return Union((self, other)) def __invert__(self): return -self.surface if self.side == '+' else +self.surface diff --git a/openmc/universe.py b/openmc/universe.py index 95a1341fd..26977ac0a 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -106,7 +106,7 @@ class Universe(IDManagerMixin): regions = [c.region for c in self.cells.values() if c.region is not None] if regions: - return openmc.Union(*regions).bounding_box + return openmc.Union(regions).bounding_box else: # Infinite bounding box return openmc.Intersection().bounding_box diff --git a/openmc/volume.py b/openmc/volume.py index b81004ba1..721dcf248 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -94,7 +94,7 @@ class VolumeCalculation(object): self.upper_right = upper_right else: if self.domain_type == 'cell': - ll, ur = openmc.Union(*[c.region for c in domains]).bounding_box + ll, ur = openmc.Union(c.region for c in domains).bounding_box if np.any(np.isinf(ll)) or np.any(np.isinf(ur)): raise ValueError('Could not automatically determine bounding ' 'box for stochastic volume calculation.') From 3aa456fd4b2fdf734b03e05232deb63568e61641 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Jun 2017 20:48:36 -0500 Subject: [PATCH 021/123] Move reset_auto_ids to mixin module and add set_auto_id and reserve_ids functions --- openmc/geometry.py | 8 -------- openmc/mixin.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/openmc/geometry.py b/openmc/geometry.py index 6b1e6cb72..0b02210b7 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -7,14 +7,6 @@ from six import string_types import openmc from openmc.clean_xml import sort_xml_elements, clean_xml_indentation from openmc.checkvalue import check_type -from openmc.mixin import IDManagerMixin - - -def reset_auto_ids(): - """Reset counters for all auto-generated IDs""" - for cls in IDManagerMixin.__subclasses__(): - cls.used_ids.clear() - cls.next_id = 1 class Geometry(object): diff --git a/openmc/mixin.py b/openmc/mixin.py index 0b0c5f519..555c3b158 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -57,3 +57,39 @@ class IDManagerMixin(object): else: cls.used_ids.add(uid) self._id = uid + + +def reset_auto_ids(): + """Reset counters for all auto-generated IDs""" + for cls in IDManagerMixin.__subclasses__(): + cls.used_ids.clear() + cls.next_id = 1 + + +def reserve_ids(ids, cls=None): + """Reserve a set of IDs that won't be used for auto-generated IDs. + + Parameters + ---------- + ids : iterable of int + IDs to reserve + + """ + if cls is None: + for cls in IDManagerMixin.__subclasses__(): + cls.used_ids |= set(ids) + else: + cls.used_ids |= set(ids) + + +def set_auto_id(next_id): + """Set the next ID for auto-generated IDs. + + Parameters + ---------- + next_id : int + The next ID to assign to objects with auto-generated IDs. + + """ + for cls in IDManagerMixin.__subclasses__(): + cls.next_id = next_id From 3a8205c6d9962e9244e1bb6fc0d009f4f8799ec9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 8 Jun 2017 19:44:31 -0500 Subject: [PATCH 022/123] Fix docstring for openmc.reserve_ids --- openmc/mixin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openmc/mixin.py b/openmc/mixin.py index 555c3b158..89b8df273 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -73,6 +73,9 @@ def reserve_ids(ids, cls=None): ---------- ids : iterable of int IDs to reserve + cls : type or None + Class for which IDs should be reserved. If None, all classes that have + auto-generated IDs will be used. """ if cls is None: From 002c7651c2cf0049c9b6f185535b29f122b62f7d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 15 Jun 2017 14:38:25 -0500 Subject: [PATCH 023/123] Address comments by @smharper on #892. --- openmc/mixin.py | 13 +++++++++---- openmc/statepoint.py | 2 +- openmc/summary.py | 2 +- openmc/volume.py | 2 +- src/physics.F90 | 1 - 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/openmc/mixin.py b/openmc/mixin.py index 89b8df273..d724fc32a 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -25,6 +25,10 @@ class EqualityMixin(object): return not self.__eq__(other) +class IDWarning(UserWarning): + pass + + class IDManagerMixin(object): """A Class which automatically manages unique IDs. @@ -52,8 +56,9 @@ class IDManagerMixin(object): cv.check_type('{} ID'.format(name), uid, Integral) cv.check_greater_than('{} ID'.format(name), uid, 0, equality=True) if uid in cls.used_ids: - warn('Another {} instance already exists with id={}.'.format( - name, uid)) + msg = 'Another {} instance already exists with id={}.'.format( + name, uid) + warn(msg, IDWarning) else: cls.used_ids.add(uid) self._id = uid @@ -74,8 +79,8 @@ def reserve_ids(ids, cls=None): ids : iterable of int IDs to reserve cls : type or None - Class for which IDs should be reserved. If None, all classes that have - auto-generated IDs will be used. + Class for which IDs should be reserved (e.g., :class:`openmc.Cell`). If + None, all classes that have auto-generated IDs will be used. """ if cls is None: diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 7255a7ba4..474b03033 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -358,7 +358,7 @@ class StatePoint(object): # Ignore warnings about duplicate IDs with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) + warnings.simplefilter('ignore', openmc.IDWarning) # Iterate over all tallies for tally_id in tally_ids: diff --git a/openmc/summary.py b/openmc/summary.py index 30ba77f98..34743757b 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -52,7 +52,7 @@ class Summary(object): self._read_nuclides() with warnings.catch_warnings(): - warnings.simplefilter("ignore", UserWarning) + warnings.simplefilter("ignore", openmc.IDWarning) self._read_geometry() @property diff --git a/openmc/volume.py b/openmc/volume.py index 721dcf248..cccb3c6a2 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -223,7 +223,7 @@ class VolumeCalculation(object): # Instantiate some throw-away domains that are used by the constructor # to assign IDs with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) + warnings.simplefilter('ignore', openmc.IDWarning) if domain_type == 'cell': domains = [openmc.Cell(uid) for uid in ids] elif domain_type == 'material': diff --git a/src/physics.F90 b/src/physics.F90 index 920835d8e..9482772ef 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -818,7 +818,6 @@ contains real(8) :: xs_low ! 0K xs at lowest practical relative energy real(8) :: xs_up ! 0K xs at highest practical relative energy real(8) :: m ! slope for interpolation - real(8) :: xi ! pseudorandom number on [0,1) real(8) :: R ! rejection criterion for DBRC / target speed real(8) :: cdf_low ! xs cdf at lowest practical relative energy real(8) :: cdf_up ! xs cdf at highest practical relative energy From e75e91dcb5bc5db1564d0148a076996a8ebb69f1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 8 Jun 2017 20:17:07 -0500 Subject: [PATCH 024/123] Make several subroutines callable in shared library --- CMakeLists.txt | 6 ++++-- src/finalize.F90 | 4 +++- src/initialize.F90 | 18 +++++++++++++----- src/main.F90 | 16 ++++++++++------ src/plot.F90 | 12 +++++++----- src/simulation.F90 | 11 ++++++----- src/volume_calc.F90 | 10 ++++++---- 7 files changed, 49 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 19d2d3886..4e444dc0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,6 +98,8 @@ endif() # endif() #endif() +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) # Make sure version is sufficient execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -dumpversion @@ -107,7 +109,7 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) endif() # GCC compiler options - list(APPEND f90flags -cpp -std=f2008 -fbacktrace -O2) + list(APPEND f90flags -cpp -std=f2008ts -fbacktrace -O2) list(APPEND cflags -cpp -std=c99 -O2) if(debug) list(REMOVE_ITEM f90flags -O2) @@ -344,7 +346,7 @@ set(LIBOPENMC_FORTRAN_SRC src/volume_calc.F90 src/volume_header.F90 src/xml_interface.F90) -add_library(libopenmc STATIC ${LIBOPENMC_FORTRAN_SRC}) +add_library(libopenmc SHARED ${LIBOPENMC_FORTRAN_SRC}) set_target_properties(libopenmc PROPERTIES OUTPUT_NAME openmc) add_executable(${program} src/main.F90) set_property(TARGET ${program} libopenmc pugixml_fortran diff --git a/src/finalize.F90 b/src/finalize.F90 index 0f1af2356..69a2d0466 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -1,5 +1,7 @@ module finalize + use, intrinsic :: ISO_C_BINDING + use hdf5, only: h5tclose_f, h5close_f use global @@ -15,7 +17,7 @@ contains ! statistics and writing out tallies !=============================================================================== - subroutine openmc_finalize() + subroutine openmc_finalize() bind(C) integer :: hdf5_err diff --git a/src/initialize.F90 b/src/initialize.F90 index e9718fee1..329455e81 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -46,11 +46,19 @@ contains ! setting up timers, etc. !=============================================================================== - subroutine openmc_init(intracomm) -#ifdef MPIF08 - type(MPI_Comm), intent(in) :: intracomm ! MPI intracommunicator -#else + subroutine openmc_init(intracomm) bind(C) integer, intent(in), optional :: intracomm ! MPI intracommunicator + + ! Copy the communicator to a new variable. This is done to avoid changing + ! the signature of this subroutine. +#ifdef MPI +#ifdef MPIF08 + type(MPI_Comm), intent(in) :: comm ! MPI intracommunicator + comm % MPI_VAL = intracomm +#else + integer :: comm + comm = intracomm +#endif #endif ! Start total and initialization timer @@ -59,7 +67,7 @@ contains #ifdef MPI ! Setup MPI - call initialize_mpi(intracomm) + call initialize_mpi(comm) #endif ! Initialize HDF5 interface diff --git a/src/main.F90 b/src/main.F90 index 1cd3a9e54..70a2898e2 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -6,15 +6,19 @@ program main use initialize, only: openmc_init use message_passing use particle_restart, only: run_particle_restart - use plot, only: run_plot - use simulation, only: run_simulation - use volume_calc, only: run_volume_calculations + use plot, only: openmc_plot_geometry + use simulation, only: openmc_run + use volume_calc, only: openmc_calculate_volumes implicit none ! Initialize run -- when run with MPI, pass communicator #ifdef MPI +#ifdef MPIF08 + call openmc_init(MPI_COMM_WORLD % MPI_VAL) +#else call openmc_init(MPI_COMM_WORLD) +#endif #else call openmc_init() #endif @@ -22,13 +26,13 @@ program main ! start problem based on mode select case (run_mode) case (MODE_FIXEDSOURCE, MODE_EIGENVALUE) - call run_simulation() + call openmc_run() case (MODE_PLOTTING) - call run_plot() + call openmc_plot_geometry() case (MODE_PARTICLE) if (master) call run_particle_restart() case (MODE_VOLUME) - call run_volume_calculations() + call openmc_calculate_volumes() end select ! finalize run diff --git a/src/plot.F90 b/src/plot.F90 index 6a3a19170..067d0c56f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -1,5 +1,9 @@ module plot + use, intrinsic :: ISO_C_BINDING + + use hdf5 + use constants use error, only: fatal_error use geometry, only: find_cell, check_cell_overlap @@ -14,12 +18,10 @@ module plot use progress_header, only: ProgressBar use string, only: to_str - use hdf5 - implicit none private - public :: run_plot + public :: openmc_plot_geometry integer, parameter :: RED = 1 integer, parameter :: GREEN = 2 @@ -31,7 +33,7 @@ contains ! RUN_PLOT controls the logic for making one or many plots !=============================================================================== - subroutine run_plot() + subroutine openmc_plot_geometry() bind(C) integer :: i ! loop index for plots @@ -51,7 +53,7 @@ contains end associate end do - end subroutine run_plot + end subroutine openmc_plot_geometry !=============================================================================== ! POSITION_RGB computes the red/green/blue values for a given plot with the diff --git a/src/simulation.F90 b/src/simulation.F90 index 0cdb4c66d..b8aebccc2 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -1,5 +1,7 @@ module simulation + use, intrinsic :: ISO_C_BINDING + use cmfd_execute, only: cmfd_init_batch, execute_cmfd use constants, only: ZERO use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & @@ -22,21 +24,20 @@ module simulation tally_statistics use trigger, only: check_triggers use tracking, only: transport - use volume_calc, only: run_volume_calculations implicit none private - public :: run_simulation + public :: openmc_run contains !=============================================================================== -! RUN_SIMULATION encompasses all the main logic where iterations are performed +! OPENMC_RUN encompasses all the main logic where iterations are performed ! over the batches, generations, and histories in a fixed source or k-eigenvalue ! calculation. !=============================================================================== - subroutine run_simulation() + subroutine openmc_run() bind(C) type(Particle) :: p integer(8) :: i_work @@ -115,7 +116,7 @@ contains ! Clear particle call p % clear() - end subroutine run_simulation + end subroutine openmc_run !=============================================================================== ! INITIALIZE_HISTORY diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index d63955017..3659293b3 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -1,5 +1,7 @@ module volume_calc + use, intrinsic :: ISO_C_BINDING + use hdf5, only: HID_T #ifdef _OPENMP use omp_lib @@ -21,16 +23,16 @@ module volume_calc implicit none private - public :: run_volume_calculations + public :: openmc_calculate_volumes contains !=============================================================================== -! RUN_VOLUME_CALCULATIONS runs each of the stochastic volume calculations that +! OPENMC_CALCULATE_VOLUMES runs each of the stochastic volume calculations that ! the user has specified and writes results to HDF5 files !=============================================================================== - subroutine run_volume_calculations() + subroutine openmc_calculate_volumes() bind(C) integer :: i, j integer :: n real(8), allocatable :: volume(:,:) ! volume mean/stdev in each domain @@ -93,7 +95,7 @@ contains call write_message("Elapsed time: " // trim(to_str(time_volume % & get_value())) // " s", 6) end if - end subroutine run_volume_calculations + end subroutine openmc_calculate_volumes !=============================================================================== ! GET_VOLUME stochastically determines the volume of a set of domains along with From cd9a17e64f5fb91a9c738944f9b9a6406736982b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Jun 2017 11:58:14 -0500 Subject: [PATCH 025/123] Add openmc.lib object which can directly call the OpenMC library --- CMakeLists.txt | 10 ++++++ openmc/__init__.py | 1 + openmc/libopenmc.py | 80 +++++++++++++++++++++++++++++++++++++++++++++ setup.py | 17 +++++++--- 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 openmc/libopenmc.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e444dc0e..e3d27b3db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -385,6 +385,16 @@ endforeach() target_link_libraries(libopenmc ${ldflags} ${HDF5_LIBRARIES} pugixml_fortran faddeeva) target_link_libraries(${program} ${ldflags} libopenmc) +#=============================================================================== +# Python package +#=============================================================================== + +add_custom_command(TARGET libopenmc POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + $ + ${CMAKE_CURRENT_SOURCE_DIR}/openmc/_$ + COMMENT "Copying libopenmc to Python module directory") + #=============================================================================== # Install executable, scripts, manpage, license #=============================================================================== diff --git a/openmc/__init__.py b/openmc/__init__.py index d692ebbae..2c4829409 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -27,5 +27,6 @@ from openmc.particle_restart import * from openmc.mixin import * from openmc.plotter import * from openmc.search import * +from openmc.libopenmc import lib __version__ = '0.9.0' diff --git a/openmc/libopenmc.py b/openmc/libopenmc.py new file mode 100644 index 000000000..77841848f --- /dev/null +++ b/openmc/libopenmc.py @@ -0,0 +1,80 @@ +from ctypes import CDLL, c_int, POINTER, byref +import sys +from warnings import warn + +import pkg_resources + + +class _OpenMCLibrary(object): + def __init__(self, filename): + self._dll = CDLL(filename) + + # Set argument/return types + self._dll.openmc_init.argtypes = [POINTER(c_int)] + self._dll.openmc_init.restype = None + self._dll.openmc_run.restype = None + self._dll.openmc_plot_geometry.restype = None + self._dll.openmc_calculate_volumes.restype = None + self._dll.openmc_finalize.restype = None + + def init(self, intracomm=None): + """Initialize OpenMC + + Parameters + ---------- + intracomm : int or None + MPI intracommunicator + + """ + if intracomm is not None: + # If an mpi4py communicator was passed, convert it to an integer to + # be passed to openmc_init + try: + intracomm = intracomm.py2f() + except AttributeError: + pass + return self._dll.openmc_init(byref(c_int(intracomm))) + else: + return self._dll.openmc_init(None) + + def run(self): + """Run simulation""" + return self._dll.openmc_run() + + def plot_geometry(self): + """Plot geometry""" + return self._dll.openmc_plot_geometry() + + def calculate_volumes(self): + """Run stochastic volume calculation""" + return self._dll.openmc_calculate_volumes() + + def finalize(self): + """Finalize simulation and free memory""" + return self._dll.openmc_finalize() + + def __getattr__(self, key): + # Fall-back for other functions that may be available from library + try: + return getattr(self._dll, 'openmc_{}'.format(key)) + except AttributeError: + raise AttributeError("OpenMC library doesn't have a '{}' function" + .format(key)) + + +# Determine shared-library suffix +if sys.platform == 'darwin': + suffix = 'dylib' +else: + suffix = 'so' + +# Open shared library +filename = pkg_resources.resource_filename( + __name__, '_libopenmc.{}'.format(suffix)) +try: + lib = _OpenMCLibrary(filename) +except OSError: + warn("OpenMC shared library is not available from the Python API. This " + "means you will not be able to use openmc.lib to make in-memory " + "calls to OpenMC.") + lib = None diff --git a/setup.py b/setup.py index e7eb9281c..67bc73403 100755 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import glob +import sys import numpy as np try: from setuptools import setup @@ -16,6 +17,12 @@ except ImportError: have_cython = False +# Determine shared library suffix +if sys.platform == 'darwin': + suffix = 'dylib' +else: + suffix = 'so' + # Get version information from __init__.py. This is ugly, but more reliable than # using an import. with open('openmc/__init__.py', 'r') as f: @@ -27,6 +34,12 @@ kwargs = {'name': 'openmc', 'openmc.stats'], 'scripts': glob.glob('scripts/openmc-*'), + # Data files and librarries + 'package_data': { + 'openmc': ['_libopenmc.{}'.format(suffix)], + 'openmc.data': ['mass.mas12', 'fission_Q_data_endfb71.h5'] + }, + # Metadata 'author': 'Will Boyd', 'author_email': 'wbinventor@gmail.com', @@ -55,10 +68,6 @@ if have_setuptools: 'validate': ['lxml'] }, - # Data files - 'package_data': { - 'openmc.data': ['mass.mas12', 'fission_Q_data_endfb71.h5'] - }, }) # If Cython is present, add resonance reconstruction capability From 8af7c78b670e18a028c5bf861175a394533a8228 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Jun 2017 14:22:39 -0500 Subject: [PATCH 026/123] Finalize MPI communicator from main() --- src/finalize.F90 | 3 --- src/main.F90 | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/finalize.F90 b/src/finalize.F90 index 69a2d0466..6164371a0 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -33,9 +33,6 @@ contains #ifdef MPI ! Free all MPI types call MPI_TYPE_FREE(MPI_BANK, mpi_err) - - ! If MPI is in use and enabled, terminate it - call MPI_FINALIZE(mpi_err) #endif end subroutine openmc_finalize diff --git a/src/main.F90 b/src/main.F90 index 70a2898e2..723c87df9 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -38,4 +38,10 @@ program main ! finalize run call openmc_finalize() +#ifdef MPI + ! If MPI is in use and enabled, terminate it + call MPI_FINALIZE(mpi_err) +#endif + + end program main From 996375608b12c3e0f15b9aaeb318b3400f647d92 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 10 Jun 2017 15:37:31 -0500 Subject: [PATCH 027/123] Don't modify tally results in place when writing tallies.out --- src/output.F90 | 221 +++++++++++++++++++++++---------------------- src/simulation.F90 | 14 +-- src/tally.F90 | 39 -------- 3 files changed, 119 insertions(+), 155 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index 10d4f0511..93245f132 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -590,50 +590,53 @@ contains subroutine print_results() + integer :: n ! number of realizations real(8) :: alpha ! significance level for CI - real(8) :: t_value ! t-value for confidence intervals + real(8) :: t_n1 ! t-value with N-1 degrees of freedom + real(8) :: t_n3 ! t-value with N-3 degrees of freedom + real(8) :: x(2) ! mean and standard deviation ! display header block for results call header("Results", 4) + n = n_realizations + if (confidence_intervals) then ! Calculate t-value for confidence intervals alpha = ONE - CONFIDENCE_LEVEL - t_value = t_percentile(ONE - alpha/TWO, n_realizations - 1) - - ! Adjust sum_sq - global_tallies(RESULT_SUM_SQ,:) = t_value * global_tallies(RESULT_SUM_SQ,:) - - ! Adjust combined estimator - if (n_realizations > 3) then - t_value = t_percentile(ONE - alpha/TWO, n_realizations - 3) - k_combined(2) = t_value * k_combined(2) - end if + t_n1 = t_percentile(ONE - alpha/TWO, n - 1) + t_n3 = t_percentile(ONE - alpha/TWO, n - 3) + else + t_n1 = ONE + t_n3 = ONE end if ! write global tallies - if (n_realizations > 1) then - if (run_mode == MODE_EIGENVALUE) then - write(ou,102) "k-effective (Collision)", global_tallies(RESULT_SUM, & - K_COLLISION), global_tallies(RESULT_SUM_SQ, K_COLLISION) - write(ou,102) "k-effective (Track-length)", global_tallies(RESULT_SUM, & - K_TRACKLENGTH), global_tallies(RESULT_SUM_SQ, K_TRACKLENGTH) - write(ou,102) "k-effective (Absorption)", global_tallies(RESULT_SUM, & - K_ABSORPTION), global_tallies(RESULT_SUM_SQ, K_ABSORPTION) - if (n_realizations > 3) write(ou,102) "Combined k-effective", k_combined - end if - write(ou,102) "Leakage Fraction", global_tallies(RESULT_SUM, LEAKAGE), & - global_tallies(RESULT_SUM_SQ, LEAKAGE) + if (n > 1) then + associate (r => global_tallies(RESULT_SUM:RESULT_SUM_SQ, :)) + if (run_mode == MODE_EIGENVALUE) then + x(:) = mean_stdev(r(:, K_COLLISION), n) + write(ou,102) "k-effective (Collision)", x(1), t_n1 * x(2) + x(:) = mean_stdev(r(:, K_TRACKLENGTH), n) + write(ou,102) "k-effective (Track-length)", x(1), t_n1 * x(2) + x(:) = mean_stdev(r(:, K_ABSORPTION), n) + write(ou,102) "k-effective (Absorption)", x(1), t_n1 * x(2) + if (n > 3) write(ou,102) "Combined k-effective", k_combined(1), & + t_n3 * k_combined(2) + end if + x(:) = mean_stdev(global_tallies(:, LEAKAGE), n) + write(ou,102) "Leakage Fraction", x(1), t_n1 * x(2) + end associate else if (master) call warning("Could not compute uncertainties -- only one & &active batch simulated!") if (run_mode == MODE_EIGENVALUE) then - write(ou,103) "k-effective (Collision)", global_tallies(RESULT_SUM, K_COLLISION) - write(ou,103) "k-effective (Track-length)", global_tallies(RESULT_SUM, K_TRACKLENGTH) - write(ou,103) "k-effective (Absorption)", global_tallies(RESULT_SUM, K_ABSORPTION) + write(ou,103) "k-effective (Collision)", global_tallies(RESULT_SUM, K_COLLISION) / n + write(ou,103) "k-effective (Track-length)", global_tallies(RESULT_SUM, K_TRACKLENGTH) / n + write(ou,103) "k-effective (Absorption)", global_tallies(RESULT_SUM, K_ABSORPTION) / n end if - write(ou,103) "Leakage Fraction", global_tallies(RESULT_SUM, LEAKAGE) + write(ou,103) "Leakage Fraction", global_tallies(RESULT_SUM, LEAKAGE) / n end if write(ou,*) @@ -698,8 +701,10 @@ contains integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer :: unit_tally ! tallies.out file unit + integer :: nr ! number of realizations real(8) :: t_value ! t-values for confidence intervals real(8) :: alpha ! significance level for CI + real(8) :: x(2) ! mean and standard deviation character(MAX_FILE_LEN) :: filename ! name of output file character(36) :: score_names(N_SCORE_TYPES) ! names of scoring function character(36) :: score_name ! names of scoring function @@ -744,20 +749,20 @@ contains if (confidence_intervals) then alpha = ONE - CONFIDENCE_LEVEL t_value = t_percentile(ONE - alpha/TWO, n_realizations - 1) + else + t_value = ONE end if TALLY_LOOP: do i = 1, n_tallies t => tallies(i) + nr = t % n_realizations if (confidence_intervals) then ! Calculate t-value for confidence intervals - if (confidence_intervals) then - alpha = ONE - CONFIDENCE_LEVEL - t_value = t_percentile(ONE - alpha/TWO, t % n_realizations - 1) - end if - - ! Multiply uncertainty by t-value - t % results(RESULT_SUM_SQ,:,:) = t_value * t % results(RESULT_SUM_SQ,:,:) + alpha = ONE - CONFIDENCE_LEVEL + t_value = t_percentile(ONE - alpha/TWO, nr - 1) + else + t_value = ONE end if ! Write header block @@ -889,24 +894,27 @@ contains do l = 1, t % n_user_score_bins k = k + 1 score_index = score_index + 1 + + associate(r => t % results(RESULT_SUM:RESULT_SUM_SQ, :, :)) + select case(t % score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) score_name = 'P' // trim(to_str(t % moment_order(k))) // " " // & score_names(abs(t % score_bins(k))) + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & - repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,filter_index))) + repeat(" ", indent), score_name, to_str(x(1)), & + trim(to_str(t_value * x(2))) case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) score_index = score_index - 1 do n_order = 0, t % moment_order(k) score_index = score_index + 1 score_name = 'P' // trim(to_str(n_order)) // " " //& score_names(abs(t % score_bins(k))) + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,filter_index))) + to_str(x(1)), trim(to_str(t_value * x(2))) end do k = k + t % moment_order(k) case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & @@ -918,11 +926,10 @@ contains score_name = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) // " " & // score_names(abs(t % score_bins(k))) + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,& - filter_index))) + to_str(x(1)), trim(to_str(t_value * x(2))) end do end do k = k + (t % moment_order(k) + 1)**2 - 1 @@ -932,11 +939,12 @@ contains else score_name = score_names(abs(t % score_bins(k))) end if + x(:) = mean_stdev(r(:, score_index, filter_index), nr) write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & - to_str(t % results(RESULT_SUM,score_index,filter_index)), & - trim(to_str(t % results(RESULT_SUM_SQ,score_index,filter_index))) + to_str(x(1)), trim(to_str(t_value * x(2))) end select + end associate end do indent = indent - 2 @@ -974,11 +982,15 @@ contains integer :: stride_surf ! stride for surface filter integer :: n ! number of incoming energy bins integer :: filter_index ! index in results array for filters + integer :: nr ! number of realizations + real(8) :: x(2) ! mean and standard deviation logical :: print_ebin ! should incoming energy bin be displayed? logical :: energy_filters ! energy filters present character(MAX_LINE_LEN) :: string type(RegularMesh), pointer :: m + nr = t % n_realizations + ! Get pointer to mesh i_filter_mesh = t % filter(t % find_filter(FILTER_MESH)) select type(filt => filters(i_filter_mesh) % obj) @@ -1049,104 +1061,101 @@ contains % bins % data(1) - 1) * t % stride(j) end do - ! Left Surface - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Left", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_LEFT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_LEFT - 1) * stride_surf))) + associate(r => t % results(RESULT_SUM:RESULT_SUM_SQ, :, :)) + ! Left Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_LEFT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Left", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_LEFT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_LEFT - 1) * stride_surf))) + "Outgoing Current on Left", to_str(x(1)), trim(to_str(x(2))) + + x(:) = mean_stdev(r(:, 1, filter_index + (IN_LEFT - 1) * & + stride_surf), nr) + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Left", to_str(x(1)), trim(to_str(x(2))) ! Right Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_RIGHT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Right", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_RIGHT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_RIGHT - 1) * stride_surf))) + "Outgoing Current on Right", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_RIGHT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Right", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_RIGHT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_RIGHT - 1) * stride_surf))) + "Incoming Current on Right", to_str(x(1)), trim(to_str(x(2))) if (n_dim >= 2) then ! Back Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_BACK - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Back", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_BACK - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_BACK - 1) * stride_surf))) + "Outgoing Current on Back", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_BACK - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Back", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_BACK - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_BACK - 1) * stride_surf))) + "Incoming Current on Back", to_str(x(1)), trim(to_str(x(2))) ! Front Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_FRONT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Front", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_FRONT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_FRONT - 1) * stride_surf))) + "Outgoing Current on Front", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_FRONT - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Front", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_FRONT - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_FRONT - 1) * stride_surf))) + "Incoming Current on Front", to_str(x(1)), trim(to_str(x(2))) end if if (n_dim == 3) then ! Bottom Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_BOTTOM - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Bottom", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_BOTTOM - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_BOTTOM - 1) * stride_surf))) + "Outgoing Current on Bottom", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_BOTTOM - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Bottom", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_BOTTOM - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_BOTTOM - 1) * stride_surf))) + "Incoming Current on Bottom", to_str(x(1)), trim(to_str(x(2))) ! Top Surface + x(:) = mean_stdev(r(:, 1, filter_index + (OUT_TOP - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current on Top", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (OUT_TOP - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (OUT_TOP - 1) * stride_surf))) + "Outgoing Current on Top", to_str(x(1)), trim(to_str(x(2))) + x(:) = mean_stdev(r(:, 1, filter_index + (IN_TOP - 1) * & + stride_surf), nr) write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current on Top", & - to_str(t % results(RESULT_SUM,1,filter_index + & - (IN_TOP - 1) * stride_surf)), & - trim(to_str(t % results(RESULT_SUM_SQ,1,filter_index + & - (IN_TOP - 1) * stride_surf))) + "Incoming Current on Top", to_str(x(1)), trim(to_str(x(2))) end if + end associate end do end do end subroutine write_surface_current +!=============================================================================== +! MEAN_STDEV computes the sample mean and standard deviation of the mean of a +! single tally score +!=============================================================================== + + pure function mean_stdev(result_, n) result(x) + real(8), intent(in) :: result_(2) ! sum and sum-of-squares + integer, intent(in) :: n ! number of realizations + real(8) :: x(2) ! mean and standard deviation + + x(1) = result_(1) / n + if (n > 1) then + x(2) = sqrt((result_(2) / n - x(1)*x(1))/(n - 1)) + else + x(2) = ZERO + end if + end function mean_stdev + end module output diff --git a/src/simulation.F90 b/src/simulation.F90 index b8aebccc2..cb19f918f 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -20,8 +20,7 @@ module simulation use source, only: initialize_source, sample_external_source use state_point, only: write_state_point, write_source_point use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies, & - tally_statistics + use tally, only: synchronize_tallies, setup_active_usertallies use trigger, only: check_triggers use tracking, only: transport @@ -388,15 +387,10 @@ contains subroutine finalize_simulation ! Start finalization timer - call time_finalize%start() + call time_finalize % start() - ! Calculate statistics for tallies and write to tallies.out - if (master) then - if (n_realizations > 1) call tally_statistics() - end if - if (output_tallies) then - if (master) call write_tallies() - end if + ! Write tally results to tallies.out + if (output_tallies .and. master) call write_tallies() if (check_overlaps) call reduce_overlap_count() ! Stop timers and show timing statistics diff --git a/src/tally.F90 b/src/tally.F90 index 0ee041cbe..007b65d31 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4366,45 +4366,6 @@ contains end subroutine accumulate_tally -!=============================================================================== -! TALLY_STATISTICS computes the mean and standard deviation of the mean of each -! tally and stores them in the RESULT_SUM and RESULT_SUM_SQ positions -!=============================================================================== - - subroutine tally_statistics() - integer :: i ! index in tallies array - integer :: j, k ! score/filter indices - integer :: n ! number of realizations - - ! Calculate sample mean and standard deviation of the mean -- note that we - ! have used Bessel's correction so that the estimator of the variance of the - ! sample mean is unbiased. - - do i = 1, n_tallies - n = tallies(i) % n_realizations - - associate (r => tallies(i) % results) - do k = 1, size(r, 3) - do j = 1, size(r, 2) - r(RESULT_SUM, j, k) = r(RESULT_SUM, j, k) / n - r(RESULT_SUM_SQ, j, k) = sqrt((r(RESULT_SUM_SQ, j, k)/n - & - r(RESULT_SUM, j, k) * r(RESULT_SUM, j, k))/(n - 1)) - end do - end do - end associate - end do - - ! Calculate statistics for global tallies - n = n_realizations - associate (r => global_tallies) - do j = 1, size(r, 2) - r(RESULT_SUM, j) = r(RESULT_SUM, j) / n - r(RESULT_SUM_SQ, j) = sqrt((r(RESULT_SUM_SQ, j)/n - & - r(RESULT_SUM, j) * r(RESULT_SUM, j))/(n - 1)) - end do - end associate - end subroutine tally_statistics - !=============================================================================== ! SETUP_ACTIVE_USERTALLIES !=============================================================================== From 5cd9bc6065f228330e8f973a971fbd3a11ee1c4d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 10 Jun 2017 16:41:57 -0500 Subject: [PATCH 028/123] Add openmc_reset subroutine --- openmc/libopenmc.py | 5 +++++ src/simulation.F90 | 30 ++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/openmc/libopenmc.py b/openmc/libopenmc.py index 77841848f..c5dfc1f2f 100644 --- a/openmc/libopenmc.py +++ b/openmc/libopenmc.py @@ -16,6 +16,7 @@ class _OpenMCLibrary(object): self._dll.openmc_plot_geometry.restype = None self._dll.openmc_calculate_volumes.restype = None self._dll.openmc_finalize.restype = None + self._dll.openmc_reset.restype = None def init(self, intracomm=None): """Initialize OpenMC @@ -53,6 +54,10 @@ class _OpenMCLibrary(object): """Finalize simulation and free memory""" return self._dll.openmc_finalize() + def reset(self): + """Reset tallies""" + return self._dll.openmc_reset() + def __getattr__(self, key): # Fall-back for other functions that may be available from library try: diff --git a/src/simulation.F90 b/src/simulation.F90 index cb19f918f..542303750 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -6,7 +6,8 @@ module simulation use constants, only: ZERO use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & calculate_combined_keff, calculate_generation_keff, & - shannon_entropy, synchronize_bank, keff_generation + shannon_entropy, synchronize_bank, keff_generation, & + k_sum #ifdef _OPENMP use eigenvalue, only: join_bank_from_threads #endif @@ -26,7 +27,7 @@ module simulation implicit none private - public :: openmc_run + public :: openmc_run, openmc_reset contains @@ -422,4 +423,29 @@ contains end subroutine reduce_overlap_count +!=============================================================================== +! OPENMC_RESET resets all tallies +!=============================================================================== + + subroutine openmc_reset() bind(C) + integer :: i + + do i = 1, size(tallies) + tallies(i) % n_realizations = 0 + if (allocated(tallies(i) % results)) then + tallies(i) % results(:, :, :) = ZERO + end if + end do + + n_realizations = 0 + if (allocated(global_tallies)) then + global_tallies(:, :) = ZERO + end if + k_col_abs = ZERO + k_col_tra = ZERO + k_abs_tra = ZERO + k_sum(:) = ZERO + + end subroutine openmc_reset + end module simulation From 71b1c88f5934305be9875ac8474888de36cc1fa8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 10 Jun 2017 16:43:33 -0500 Subject: [PATCH 029/123] Get rid of position variable in tally module --- src/tally.F90 | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 007b65d31..14940551b 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -22,10 +22,6 @@ module tally implicit none - integer :: position(N_FILTER_TYPES - 3) = 0 ! Tally map positioning array - -!$omp threadprivate(position) - procedure(score_general_), pointer :: score_general => null() procedure(score_analog_tally_), pointer :: score_analog_tally => null() @@ -2410,9 +2406,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_analog_tally_ce subroutine score_analog_tally_mg(p) @@ -2558,9 +2551,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_analog_tally_mg !=============================================================================== @@ -2956,9 +2946,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_tracklength_tally !=============================================================================== @@ -3132,9 +3119,6 @@ contains ! Reset filter matches flag filter_matches(:) % bins_present = .false. - ! Reset tally map positioning - position = 0 - end subroutine score_collision_tally !=============================================================================== From 491309177a950e035fa9fd38187876b1ab01831b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 12 Jun 2017 15:44:06 -0500 Subject: [PATCH 030/123] Expose tally results array via numpy array --- openmc/libopenmc.py | 31 ++++++++++++++++++++++++++++++- src/tally.F90 | 16 ++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/openmc/libopenmc.py b/openmc/libopenmc.py index c5dfc1f2f..f95f72aac 100644 --- a/openmc/libopenmc.py +++ b/openmc/libopenmc.py @@ -1,7 +1,10 @@ -from ctypes import CDLL, c_int, POINTER, byref +from ctypes import CDLL, c_int, POINTER, byref, c_double import sys from warnings import warn +import numpy as np +from numpy.ctypeslib import ndpointer, as_array + import pkg_resources @@ -17,6 +20,10 @@ class _OpenMCLibrary(object): self._dll.openmc_calculate_volumes.restype = None self._dll.openmc_finalize.restype = None self._dll.openmc_reset.restype = None + self._dll.openmc_tally_results.argtypes = [ + c_int, POINTER(POINTER(c_double)), ndpointer( + np.intc, shape=(3,))] + self._dll.openmc_tally_results.restype = None def init(self, intracomm=None): """Initialize OpenMC @@ -58,6 +65,28 @@ class _OpenMCLibrary(object): """Reset tallies""" return self._dll.openmc_reset() + def tally_results(self, tally_id): + """Get tally results array + + Parameters + ---------- + tally_id : int + ID of tally + + Returns + ------- + numpy.ndarray + Array that exposes the internal tally results array + + """ + r_p = POINTER(c_double)() + r_shape = np.zeros(3, np.intc) + self._dll.openmc_tally_results(tally_id, byref(r_p), r_shape) + if r_p: + return as_array(r_p, tuple(r_shape[::-1])) + else: + return None + def __getattr__(self, key): # Fall-back for other functions that may be available from library try: diff --git a/src/tally.F90 b/src/tally.F90 index 14940551b..f2dd3b107 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4430,4 +4430,20 @@ contains end subroutine setup_active_cmfdtallies + subroutine openmc_tally_results(i, ptr, shape_) bind(C) + integer(C_INT), intent(in), value :: i + type(C_PTR), intent(out) :: ptr + integer(C_INT), intent(out) :: shape_(3) + + ptr = C_NULL_PTR + if (allocated(tallies)) then + if (i >= 1 .and. i <= size(tallies)) then + if (allocated(tallies(i) % results)) then + ptr = C_LOC(tallies(i) % results(1,1,1)) + shape_(:) = shape(tallies(i) % results) + end if + end if + end if + end subroutine openmc_tally_results + end module tally From 8ee65e2aac8728c6dcd4b3800e3736dc543bb172 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 13 Jun 2017 07:31:21 -0500 Subject: [PATCH 031/123] Separate out compile flags for C and check for Clang --- CMakeLists.txt | 56 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e3d27b3db..b7cc1dde3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,59 +110,46 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) # GCC compiler options list(APPEND f90flags -cpp -std=f2008ts -fbacktrace -O2) - list(APPEND cflags -cpp -std=c99 -O2) if(debug) list(REMOVE_ITEM f90flags -O2) - list(REMOVE_ITEM cflags -O2) list(APPEND f90flags -g -Wall -pedantic -fbounds-check -ffpe-trap=invalid,overflow,underflow) - list(APPEND cflags -g -Wall -pedantic -fbounds-check) list(APPEND ldflags -g) endif() if(profile) list(APPEND f90flags -pg) - list(APPEND cflags -pg) list(APPEND ldflags -pg) endif() if(optimize) list(REMOVE_ITEM f90flags -O2) - list(REMOVE_ITEM cflags -O2) list(APPEND f90flags -O3) - list(APPEND cflags -O3) endif() if(openmp) list(APPEND f90flags -fopenmp) - list(APPEND cflags -fopenmp) list(APPEND ldflags -fopenmp) endif() if(coverage) list(APPEND f90flags -coverage) - list(APPEND cflags -coverage) list(APPEND ldflags -coverage) endif() elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) # Intel compiler options list(APPEND f90flags -fpp -std08 -assume byterecl -traceback) - list(APPEND cflags -std=c99) if(debug) list(APPEND f90flags -g -warn -ftrapuv -fp-stack-check "-check all" -fpe0 -O0) - list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check -O0) list(APPEND ldflags -g) endif() if(profile) list(APPEND f90flags -pg) - list(APPEND cflags -pg) list(APPEND ldflags -pg) endif() if(optimize) list(APPEND f90flags -O3) - list(APPEND cflags -O3) endif() if(openmp) list(APPEND f90flags -qopenmp) - list(APPEND cflags -qopenmp) list(APPEND ldflags -qopenmp) endif() @@ -214,6 +201,49 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Cray) endif() +if(CMAKE_C_COMPILER_ID STREQUAL GNU) + # GCC compiler options + list(APPEND cflags -std=c99 -O2) + if(debug) + list(REMOVE_ITEM cflags -O2) + list(APPEND cflags -g -Wall -pedantic -fbounds-check) + endif() + if(profile) + list(APPEND cflags -pg) + endif() + if(optimize) + list(REMOVE_ITEM cflags -O2) + list(APPEND cflags -O3) + endif() + if(coverage) + list(APPEND cflags -coverage) + endif() + +elseif(CMAKE_C_COMPILER_ID STREQUAL Intel) + # Intel compiler options + list(APPEND cflags -std=c99) + if(debug) + list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check -O0) + endif() + if(profile) + list(APPEND cflags -pg) + endif() + if(optimize) + list(APPEND cflags -O3) + endif() + +elseif(CMAKE_C_COMPILER_ID MATCHES Clang) + # Clang options + list(APPEND cflags -std=c99) + if(debug) + list(APPEND cflags -g -O0 -ftrapv) + endif() + if(optimize) + list(APPEND cflags -O3) + endif() + +endif() + # Show flags being used message(STATUS "Fortran flags: ${f90flags}") message(STATUS "C flags: ${cflags}") From bb6adfca2ada46d820f31674c6372df9a5247ec0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 13 Jun 2017 07:36:29 -0500 Subject: [PATCH 032/123] Update required cmake to 2.8.12. Set MACOSX_RPATH. --- CMakeLists.txt | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7cc1dde3..b0743bdf1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) project(openmc Fortran C CXX) # Setup output directories @@ -21,6 +21,11 @@ if (${UNIX}) add_definitions(-DUNIX) endif() +# Set MACOSX_RPATH +if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) +endif() + #=============================================================================== # Command line options #=============================================================================== @@ -382,28 +387,12 @@ add_executable(${program} src/main.F90) set_property(TARGET ${program} libopenmc pugixml_fortran PROPERTY LINKER_LANGUAGE Fortran) -# target_include_directories was added in CMake 2.8.11 and is the recommended -# way to set include directories. For lesser versions, we revert to set_property -if(CMAKE_VERSION VERSION_LESS 2.8.11) - include_directories(${HDF5_INCLUDE_DIRS}) -else() - target_include_directories(libopenmc PUBLIC ${HDF5_INCLUDE_DIRS}) -endif() +target_include_directories(libopenmc PUBLIC ${HDF5_INCLUDE_DIRS}) -# target_compile_options was added in CMake 2.8.12 and is the recommended way to -# set compile flags. Note that this sets the COMPILE_OPTIONS property (also -# available only in 2.8.12+) rather than the COMPILE_FLAGS property, which is -# deprecated. The former can handle lists whereas the latter cannot. -if (CMAKE_VERSION VERSION_LESS 2.8.12) - string(REPLACE ";" " " f90flags "${f90flags}") - string(REPLACE ";" " " cflags "${cflags}") - set_property(TARGET ${program} PROPERTY COMPILE_FLAGS "${f90flags}") - set_property(TARGET faddeeva PROPERTY COMPILE_FLAGS "${cflags}") -else() - target_compile_options(${program} PUBLIC ${f90flags}) - target_compile_options(libopenmc PUBLIC ${f90flags}) - target_compile_options(faddeeva PRIVATE ${cflags}) -endif() +# set compile flags via target_compile_options +target_compile_options(${program} PUBLIC ${f90flags}) +target_compile_options(libopenmc PUBLIC ${f90flags}) +target_compile_options(faddeeva PRIVATE ${cflags}) # Add HDF5 library directories to link line with -L foreach(LIBDIR ${HDF5_LIBRARY_DIRS}) From 157a45bf5a5877fe1bbcc2ef3f88c4370ac158c5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 12:21:00 -0500 Subject: [PATCH 033/123] Add openmc_cell_set_temperature --- CMakeLists.txt | 1 + openmc/libopenmc.py | 7 +++++ src/capi.F90 | 65 +++++++++++++++++++++++++++++++++++++++++++++ src/simulation.F90 | 27 +------------------ 4 files changed, 74 insertions(+), 26 deletions(-) create mode 100644 src/capi.F90 diff --git a/CMakeLists.txt b/CMakeLists.txt index b0743bdf1..614d4524a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,6 +299,7 @@ set(LIBOPENMC_FORTRAN_SRC src/angle_distribution.F90 src/angleenergy_header.F90 src/bank_header.F90 + src/capi.F90 src/cmfd_data.F90 src/cmfd_execute.F90 src/cmfd_header.F90 diff --git a/openmc/libopenmc.py b/openmc/libopenmc.py index f95f72aac..031c54564 100644 --- a/openmc/libopenmc.py +++ b/openmc/libopenmc.py @@ -24,6 +24,9 @@ class _OpenMCLibrary(object): c_int, POINTER(POINTER(c_double)), ndpointer( np.intc, shape=(3,))] self._dll.openmc_tally_results.restype = None + self._dll.openmc_cell_set_temperature.argtypes = [ + c_int, c_double] + self._dll.openmc_cell_set_temperature.restype = c_int def init(self, intracomm=None): """Initialize OpenMC @@ -87,6 +90,10 @@ class _OpenMCLibrary(object): else: return None + def cell_set_temperature(self, cell_id, temperature): + """Set the temperature of a cell""" + return self._dll.openmc_cell_set_temperature(cell_id, temperature) + def __getattr__(self, key): # Fall-back for other functions that may be available from library try: diff --git a/src/capi.F90 b/src/capi.F90 new file mode 100644 index 000000000..0c7a54c5b --- /dev/null +++ b/src/capi.F90 @@ -0,0 +1,65 @@ +module openmc_capi + + use, intrinsic :: ISO_C_BINDING + + use constants, only: K_BOLTZMANN + use eigenvalue, only: k_sum + use global + + private + public :: openmc_cell_set_temperature + public :: openmc_reset + +contains + +!=============================================================================== +! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell +!=============================================================================== + + function openmc_cell_set_temperature(id, T) result(err) bind(C) + integer(C_INT), value, intent(in) :: id ! id of cell + real(C_DOUBLE), value, intent(in) :: T + integer(C_INT) :: err + + integer :: i + + err = -1 + if (allocated(cells)) then + if (cell_dict % has_key(id)) then + i = cell_dict % get_key(id) + associate (c => cells(i)) + if (allocated(c % sqrtkT)) then + c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) + err = 0 + end if + end associate + end if + end if + end function openmc_cell_set_temperature + +!=============================================================================== +! OPENMC_RESET resets all tallies +!=============================================================================== + + subroutine openmc_reset() bind(C) + integer :: i + + do i = 1, size(tallies) + tallies(i) % n_realizations = 0 + if (allocated(tallies(i) % results)) then + tallies(i) % results(:, :, :) = ZERO + end if + end do + + n_realizations = 0 + if (allocated(global_tallies)) then + global_tallies(:, :) = ZERO + end if + k_col_abs = ZERO + k_col_tra = ZERO + k_abs_tra = ZERO + k_sum(:) = ZERO + + end subroutine openmc_reset + +end module openmc_capi diff --git a/src/simulation.F90 b/src/simulation.F90 index 542303750..8c4016f96 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -27,7 +27,7 @@ module simulation implicit none private - public :: openmc_run, openmc_reset + public :: openmc_run contains @@ -423,29 +423,4 @@ contains end subroutine reduce_overlap_count -!=============================================================================== -! OPENMC_RESET resets all tallies -!=============================================================================== - - subroutine openmc_reset() bind(C) - integer :: i - - do i = 1, size(tallies) - tallies(i) % n_realizations = 0 - if (allocated(tallies(i) % results)) then - tallies(i) % results(:, :, :) = ZERO - end if - end do - - n_realizations = 0 - if (allocated(global_tallies)) then - global_tallies(:, :) = ZERO - end if - k_col_abs = ZERO - k_col_tra = ZERO - k_abs_tra = ZERO - k_sum(:) = ZERO - - end subroutine openmc_reset - end module simulation From 93af8871d5df716877f3bf22641485bc61239749 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 15:25:56 -0500 Subject: [PATCH 034/123] Add openmc_find function, move openmc_tally_results --- openmc/libopenmc.py | 41 ++++++++++++++++++++++---- src/capi.F90 | 71 +++++++++++++++++++++++++++++++++++++++++++-- src/tally.F90 | 16 ---------- 3 files changed, 104 insertions(+), 24 deletions(-) diff --git a/openmc/libopenmc.py b/openmc/libopenmc.py index 031c54564..c20f015aa 100644 --- a/openmc/libopenmc.py +++ b/openmc/libopenmc.py @@ -7,26 +7,30 @@ from numpy.ctypeslib import ndpointer, as_array import pkg_resources +_double3 = c_double*3 + class _OpenMCLibrary(object): def __init__(self, filename): self._dll = CDLL(filename) # Set argument/return types + self._dll.openmc_calculate_volumes.restype = None + self._dll.openmc_cell_set_temperature.argtypes = [ + c_int, c_double] + self._dll.openmc_cell_set_temperature.restype = c_int + self._dll.openmc_finalize.restype = None + self._dll.openmc_find.argtypes = [POINTER(_double3), c_int] + self._dll.openmc_find.restype = c_int self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None - self._dll.openmc_run.restype = None self._dll.openmc_plot_geometry.restype = None - self._dll.openmc_calculate_volumes.restype = None - self._dll.openmc_finalize.restype = None + self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None self._dll.openmc_tally_results.argtypes = [ c_int, POINTER(POINTER(c_double)), ndpointer( np.intc, shape=(3,))] self._dll.openmc_tally_results.restype = None - self._dll.openmc_cell_set_temperature.argtypes = [ - c_int, c_double] - self._dll.openmc_cell_set_temperature.restype = c_int def init(self, intracomm=None): """Initialize OpenMC @@ -94,6 +98,31 @@ class _OpenMCLibrary(object): """Set the temperature of a cell""" return self._dll.openmc_cell_set_temperature(cell_id, temperature) + def find(self, xyz, rtype='cell'): + """Find the cell or material at a given point + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates of position + rtype : {'cell', 'material'} + Whether to return the cell or material ID + + Returns + ------- + int or None + ID of the cell or material. If 'material' is requested and no + material exists at the given coordinate, None is returned. + + """ + if rtype == 'cell': + return self._dll.openmc_find(_double3(*xyz), 1) + elif rtype == 'material': + uid = self._dll.openmc_find(_double3(*xyz), 2) + return uid if uid != 0 else None + else: + raise ValueError('Unknown return type: {}'.format(rtype)) + def __getattr__(self, key): # Fall-back for other functions that may be available from library try: diff --git a/src/capi.F90 b/src/capi.F90 index 0c7a54c5b..66fbd97bc 100644 --- a/src/capi.F90 +++ b/src/capi.F90 @@ -2,13 +2,27 @@ module openmc_capi use, intrinsic :: ISO_C_BINDING - use constants, only: K_BOLTZMANN - use eigenvalue, only: k_sum + use constants, only: K_BOLTZMANN + use eigenvalue, only: k_sum + use finalize, only: openmc_finalize + use geometry, only: find_cell use global + use initialize, only: openmc_init + use particle_header, only: Particle + use plot, only: openmc_plot_geometry + use simulation, only: openmc_run + use volume_calc, only: openmc_calculate_volumes private + public :: openmc_calculate_volumes public :: openmc_cell_set_temperature + public :: openmc_finalize + public :: openmc_find + public :: openmc_init + public :: openmc_plot_geometry public :: openmc_reset + public :: openmc_run + public :: openmc_tally_results contains @@ -37,6 +51,37 @@ contains end if end function openmc_cell_set_temperature +!=============================================================================== +! OPENMC_FIND determines the ID or a cell or material at a given point in space +!=============================================================================== + + function openmc_find(xyz, rtype) result(id) bind(C) + real(C_DOUBLE), intent(in) :: xyz(3) ! Cartesian point + integer(C_INT), intent(in), value :: rtype ! 1 for cell, 2 for material + integer(C_INT) :: id + + logical :: found + type(Particle) :: p + + call p % initialize() + p % coord(1) % xyz(:) = xyz + p % coord(1) % uvw(:) = [ZERO, ZERO, ONE] + call find_cell(p, found) + + id = -1 + if (found) then + if (rtype == 1) then + id = cells(p % coord(p % n_coord) % cell) % id + elseif (rtype == 2) then + if (p % material == MATERIAL_VOID) then + id = 0 + else + id = materials(p % material) % id + end if + end if + end if + end function openmc_find + !=============================================================================== ! OPENMC_RESET resets all tallies !=============================================================================== @@ -62,4 +107,26 @@ contains end subroutine openmc_reset +!=============================================================================== +! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its +! shape. This allows a user to obtain in-memory tally results from Python +! directly. +!=============================================================================== + + subroutine openmc_tally_results(i, ptr, shape_) bind(C) + integer(C_INT), intent(in), value :: i + type(C_PTR), intent(out) :: ptr + integer(C_INT), intent(out) :: shape_(3) + + ptr = C_NULL_PTR + if (allocated(tallies)) then + if (i >= 1 .and. i <= size(tallies)) then + if (allocated(tallies(i) % results)) then + ptr = C_LOC(tallies(i) % results(1,1,1)) + shape_(:) = shape(tallies(i) % results) + end if + end if + end if + end subroutine openmc_tally_results + end module openmc_capi diff --git a/src/tally.F90 b/src/tally.F90 index f2dd3b107..14940551b 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4430,20 +4430,4 @@ contains end subroutine setup_active_cmfdtallies - subroutine openmc_tally_results(i, ptr, shape_) bind(C) - integer(C_INT), intent(in), value :: i - type(C_PTR), intent(out) :: ptr - integer(C_INT), intent(out) :: shape_(3) - - ptr = C_NULL_PTR - if (allocated(tallies)) then - if (i >= 1 .and. i <= size(tallies)) then - if (allocated(tallies(i) % results)) then - ptr = C_LOC(tallies(i) % results(1,1,1)) - shape_(:) = shape(tallies(i) % results) - end if - end if - end if - end subroutine openmc_tally_results - end module tally From 7d9c6215b4420e640789d8f5bbb76c84904aaf11 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 15:28:07 -0500 Subject: [PATCH 035/123] Move capi.F90 to api.F90 --- CMakeLists.txt | 2 +- src/{capi.F90 => api.F90} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{capi.F90 => api.F90} (98%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 614d4524a..3f8ce98e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,7 +299,7 @@ set(LIBOPENMC_FORTRAN_SRC src/angle_distribution.F90 src/angleenergy_header.F90 src/bank_header.F90 - src/capi.F90 + src/api.F90 src/cmfd_data.F90 src/cmfd_execute.F90 src/cmfd_header.F90 diff --git a/src/capi.F90 b/src/api.F90 similarity index 98% rename from src/capi.F90 rename to src/api.F90 index 66fbd97bc..926ba7734 100644 --- a/src/capi.F90 +++ b/src/api.F90 @@ -1,4 +1,4 @@ -module openmc_capi +module openmc_api use, intrinsic :: ISO_C_BINDING @@ -129,4 +129,4 @@ contains end if end subroutine openmc_tally_results -end module openmc_capi +end module openmc_api From fdd9dadf2a9331c39231dad23bfdc256696d4ec4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 15:31:43 -0500 Subject: [PATCH 036/123] Use c_int directly for tally_results shape --- openmc/libopenmc.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openmc/libopenmc.py b/openmc/libopenmc.py index c20f015aa..d7705b627 100644 --- a/openmc/libopenmc.py +++ b/openmc/libopenmc.py @@ -3,10 +3,11 @@ import sys from warnings import warn import numpy as np -from numpy.ctypeslib import ndpointer, as_array +from numpy.ctypeslib import as_array import pkg_resources +_int3 = c_int*3 _double3 = c_double*3 @@ -28,8 +29,7 @@ class _OpenMCLibrary(object): self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None self._dll.openmc_tally_results.argtypes = [ - c_int, POINTER(POINTER(c_double)), ndpointer( - np.intc, shape=(3,))] + c_int, POINTER(POINTER(c_double)), POINTER(_int3)] self._dll.openmc_tally_results.restype = None def init(self, intracomm=None): @@ -86,11 +86,11 @@ class _OpenMCLibrary(object): Array that exposes the internal tally results array """ - r_p = POINTER(c_double)() - r_shape = np.zeros(3, np.intc) - self._dll.openmc_tally_results(tally_id, byref(r_p), r_shape) - if r_p: - return as_array(r_p, tuple(r_shape[::-1])) + data = POINTER(c_double)() + shape = _int3() + self._dll.openmc_tally_results(tally_id, byref(data), byref(shape)) + if data: + return as_array(data, tuple(shape[::-1])) else: return None From 000de9ff89287ec637b468a3806feb7b4d6d54e8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 15:32:27 -0500 Subject: [PATCH 037/123] Rename libopenmc.py capi.py --- openmc/__init__.py | 2 +- openmc/{libopenmc.py => capi.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename openmc/{libopenmc.py => capi.py} (100%) diff --git a/openmc/__init__.py b/openmc/__init__.py index 2c4829409..96bcaf6d2 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -27,6 +27,6 @@ from openmc.particle_restart import * from openmc.mixin import * from openmc.plotter import * from openmc.search import * -from openmc.libopenmc import lib +from openmc.capi import lib __version__ = '0.9.0' diff --git a/openmc/libopenmc.py b/openmc/capi.py similarity index 100% rename from openmc/libopenmc.py rename to openmc/capi.py From b9b2c3653f4da9c44e3251f17618619a709ebeb4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 20:46:48 -0500 Subject: [PATCH 038/123] Continue adding C API functions --- openmc/capi.py | 54 ++++++++++++++++++++++++++++++++++- src/api.F90 | 62 +++++++++++++++++++++++++++++++++++++++++ src/material_header.F90 | 40 ++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) diff --git a/openmc/capi.py b/openmc/capi.py index d7705b627..526ac3ae2 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -9,6 +9,7 @@ import pkg_resources _int3 = c_int*3 _double3 = c_double*3 +_double_array = POINTER(POINTER(c_double)) class _OpenMCLibrary(object): @@ -25,11 +26,19 @@ class _OpenMCLibrary(object): self._dll.openmc_find.restype = c_int self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None + self._dll.openmc_material_get_densities.argtypes = [ + c_int, _double_array] + self._dll.openmc_material_get_densities.restype = c_int + self._dll.openmc_material_set_density.argtypes = [c_int, c_double] + self._dll.openmc_material_set_density.restype = c_int self._dll.openmc_plot_geometry.restype = None self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None + self._dll.openmc_set_temperature.argtypes = [ + POINTER(_double3), c_double] + self._dll.openmc_set_temperature.restype = c_int self._dll.openmc_tally_results.argtypes = [ - c_int, POINTER(POINTER(c_double)), POINTER(_int3)] + c_int, _double_array, POINTER(_int3)] self._dll.openmc_tally_results.restype = None def init(self, intracomm=None): @@ -123,6 +132,49 @@ class _OpenMCLibrary(object): else: raise ValueError('Unknown return type: {}'.format(rtype)) + def material_get_densities(self, mat_id): + """Get atom densities in a material. + + Parameters + ---------- + mat_id : int + ID of the material + + Returns + ------- + numpy.ndarray + Array of densities in atom/b-cm + + """ + data = POINTER(c_double)() + n = self._dll.openmc_material_get_densities(mat_id, byref(data)) + if data: + return as_array(data, (n,)) + else: + return None + + def material_set_density(self, mat_id, density): + """Set density of a material. + + Parameters + ---------- + mat_id : int + ID of the material + density : float + Density in atom/b-cm + + Returns + ------- + int + Return status (negative if an error occurs). + + """ + return self._dll.openmc_material_set_density(mat_id, density) + + def set_temperature(self, xyz, T): + """Set temperature.""" + return self._dll.openmc_set_temperature(_double3(*xyz), T) + def __getattr__(self, key): # Fall-back for other functions that may be available from library try: diff --git a/src/api.F90 b/src/api.F90 index 926ba7734..ce733e518 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -19,6 +19,8 @@ module openmc_api public :: openmc_finalize public :: openmc_find public :: openmc_init + public :: openmc_material_get_densities + public :: openmc_material_set_density public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run @@ -26,6 +28,44 @@ module openmc_api contains + function openmc_material_set_density(id, density) result(err) bind(C) + integer(C_INT), value, intent(in) :: id + real(C_DOUBLE), value, intent(in) :: density + integer(C_INT) :: err + + integer :: i + + err = -1 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + err = m % set_density(density, nuclides) + end associate + end if + end if + end function openmc_material_set_density + + function openmc_material_get_densities(id, ptr) result(n) bind(C) + integer(C_INT), intent(in), value :: id + type(C_PTR), intent(out) :: ptr + integer(C_INT) :: n + + ptr = C_NULL_PTR + n = 0 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + if (allocated(m % atom_density)) then + ptr = C_LOC(m % atom_density(1)) + n = size(m % atom_density) + end if + end associate + end if + end if + end function openmc_material_get_densities + !=============================================================================== ! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell !=============================================================================== @@ -107,6 +147,28 @@ contains end subroutine openmc_reset + function openmc_set_temperature(xyz, T) result(err) bind(C) + real(C_DOUBLE), intent(in) :: xyz(3) + real(C_DOUBLE), intent(in), value :: T + integer(C_INT) :: err + + logical :: found + type(Particle) :: p + + call p % initialize() + p % coord(1) % xyz(:) = xyz + p % coord(1) % uvw(:) = [ZERO, ZERO, ONE] + call find_cell(p, found) + + err = -1 + if (found) then + associate (c => cells(p % coord(p % n_coord) % cell)) + c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) + err = 0 + end associate + end if + end function openmc_set_temperature + !=============================================================================== ! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its ! shape. This allows a user to obtain in-memory tally results from Python diff --git a/src/material_header.F90 b/src/material_header.F90 index fdc36548f..dc0373484 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -1,5 +1,8 @@ module material_header + use constants + use nuclide_header, only: Nuclide + implicit none !=============================================================================== @@ -38,6 +41,43 @@ module material_header ! enforce isotropic scattering in lab logical, allocatable :: p0(:) + contains + procedure :: set_density => material_set_density end type Material +contains + + function material_set_density(m, density, nuclides) result(err) + class(Material), intent(inout) :: m + real(8), intent(in) :: density + type(Nuclide), intent(in) :: nuclides(:) + integer :: err + + integer :: i + real(8) :: sum_percent + real(8) :: awr + + err = -1 + if (allocated(m % atom_density)) then + ! Set total density based on value provided + m % density = density + + ! Determine normalized atom percents + sum_percent = sum(m % atom_density) + m % atom_density(:) = m % atom_density / sum_percent + + ! Recalculate nuclide atom densities based on given density + m % atom_density(:) = density * m % atom_density + + ! Calculate density in g/cm^3. + m % density_gpcc = ZERO + do i = 1, m % n_nuclides + awr = nuclides(m % nuclide(i)) % awr + m % density_gpcc = m % density_gpcc & + + m % atom_density(i) * awr * MASS_NEUTRON / N_AVOGADRO + end do + err = 0 + end if + end function material_set_density + end module material_header From cb6b5bea4a7c342bd1edbc3ecdf7dbf31fd4a4ed Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 20:49:24 -0500 Subject: [PATCH 039/123] Reorder methods in _OpenMCLibrary --- openmc/capi.py | 116 ++++++++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index 526ac3ae2..5209cca68 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -41,72 +41,18 @@ class _OpenMCLibrary(object): c_int, _double_array, POINTER(_int3)] self._dll.openmc_tally_results.restype = None - def init(self, intracomm=None): - """Initialize OpenMC - - Parameters - ---------- - intracomm : int or None - MPI intracommunicator - - """ - if intracomm is not None: - # If an mpi4py communicator was passed, convert it to an integer to - # be passed to openmc_init - try: - intracomm = intracomm.py2f() - except AttributeError: - pass - return self._dll.openmc_init(byref(c_int(intracomm))) - else: - return self._dll.openmc_init(None) - - def run(self): - """Run simulation""" - return self._dll.openmc_run() - - def plot_geometry(self): - """Plot geometry""" - return self._dll.openmc_plot_geometry() - def calculate_volumes(self): """Run stochastic volume calculation""" return self._dll.openmc_calculate_volumes() - def finalize(self): - """Finalize simulation and free memory""" - return self._dll.openmc_finalize() - - def reset(self): - """Reset tallies""" - return self._dll.openmc_reset() - - def tally_results(self, tally_id): - """Get tally results array - - Parameters - ---------- - tally_id : int - ID of tally - - Returns - ------- - numpy.ndarray - Array that exposes the internal tally results array - - """ - data = POINTER(c_double)() - shape = _int3() - self._dll.openmc_tally_results(tally_id, byref(data), byref(shape)) - if data: - return as_array(data, tuple(shape[::-1])) - else: - return None - def cell_set_temperature(self, cell_id, temperature): """Set the temperature of a cell""" return self._dll.openmc_cell_set_temperature(cell_id, temperature) + def finalize(self): + """Finalize simulation and free memory""" + return self._dll.openmc_finalize() + def find(self, xyz, rtype='cell'): """Find the cell or material at a given point @@ -132,6 +78,26 @@ class _OpenMCLibrary(object): else: raise ValueError('Unknown return type: {}'.format(rtype)) + def init(self, intracomm=None): + """Initialize OpenMC + + Parameters + ---------- + intracomm : int or None + MPI intracommunicator + + """ + if intracomm is not None: + # If an mpi4py communicator was passed, convert it to an integer to + # be passed to openmc_init + try: + intracomm = intracomm.py2f() + except AttributeError: + pass + return self._dll.openmc_init(byref(c_int(intracomm))) + else: + return self._dll.openmc_init(None) + def material_get_densities(self, mat_id): """Get atom densities in a material. @@ -171,10 +137,44 @@ class _OpenMCLibrary(object): """ return self._dll.openmc_material_set_density(mat_id, density) + def plot_geometry(self): + """Plot geometry""" + return self._dll.openmc_plot_geometry() + + def reset(self): + """Reset tallies""" + return self._dll.openmc_reset() + + def run(self): + """Run simulation""" + return self._dll.openmc_run() + def set_temperature(self, xyz, T): """Set temperature.""" return self._dll.openmc_set_temperature(_double3(*xyz), T) + def tally_results(self, tally_id): + """Get tally results array + + Parameters + ---------- + tally_id : int + ID of tally + + Returns + ------- + numpy.ndarray + Array that exposes the internal tally results array + + """ + data = POINTER(c_double)() + shape = _int3() + self._dll.openmc_tally_results(tally_id, byref(data), byref(shape)) + if data: + return as_array(data, tuple(shape[::-1])) + else: + return None + def __getattr__(self, key): # Fall-back for other functions that may be available from library try: From e2b8a6c2641fe9126924dff6d449ccb9c8cc28db Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 14 Jun 2017 20:58:04 -0500 Subject: [PATCH 040/123] Start adding C API documentation --- docs/source/capi/index.rst | 34 ++++++++++++++++++++++++++++++++++ docs/source/conf.py | 5 +++-- docs/source/index.rst | 1 + 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 docs/source/capi/index.rst diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst new file mode 100644 index 000000000..f3cdbb840 --- /dev/null +++ b/docs/source/capi/index.rst @@ -0,0 +1,34 @@ +.. _capi: + +===== +C API +===== + +.. c:function:: int openmc_find(double* xyz, int rtype) + + Return the ID of the cell/material containing a given point + + :param xyz: Cartesian coordinates + :type xyz: double[3] + :param rtype: Which ID to return (1=cell, 2=material) + :type rtype: int + :rtype: int + +.. c:function:: void openmc_init(int intracomm) + + Initialize OpenMC + + :param intracomm: MPI intracommunicator + :type intracomm: int + +.. c:function:: void openmc_finalize() + + Finalize a simulation + +.. c:function:: void openmc_reset() + + Resets all tally scores + +.. c:function:: void openmc_run() + + Run a simulation diff --git a/docs/source/conf.py b/docs/source/conf.py index c3434914b..95930fedb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -25,8 +25,9 @@ except ImportError: MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial', - 'h5py', 'pandas', 'uncertainties', 'openmoc', - 'openmc.data.reconstruct'] + 'numpy.ctypeslib', 'scipy', 'scipy.sparse', 'scipy.interpolate', + 'scipy.integrate', 'scipy.optimize', 'scipy.special', 'h5py', + 'pandas', 'uncertainties', 'openmoc', 'openmc.data.reconstruct'] sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES) import numpy as np diff --git a/docs/source/index.rst b/docs/source/index.rst index ce4a5f6f8..00b09db9e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -36,6 +36,7 @@ free to send a message to the User's Group `mailing list`_. usersguide/index devguide/index pythonapi/index + capi/index io_formats/index publications license From 5e88119325a05c5800a9c4c39d0884532ab8711a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 15 Jun 2017 07:02:06 -0500 Subject: [PATCH 041/123] Add set_density function --- openmc/capi.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- src/api.F90 | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 4 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index 5209cca68..92df0c7ae 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -34,6 +34,8 @@ class _OpenMCLibrary(object): self._dll.openmc_plot_geometry.restype = None self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None + self._dll.openmc_set_density.argtypes = [POINTER(_double3), c_double] + self._dll.openmc_set_density.restype = c_int self._dll.openmc_set_temperature.argtypes = [ POINTER(_double3), c_double] self._dll.openmc_set_temperature.restype = c_int @@ -45,9 +47,17 @@ class _OpenMCLibrary(object): """Run stochastic volume calculation""" return self._dll.openmc_calculate_volumes() - def cell_set_temperature(self, cell_id, temperature): - """Set the temperature of a cell""" - return self._dll.openmc_cell_set_temperature(cell_id, temperature) + def cell_set_temperature(self, cell_id, T): + """Set the temperature of a cell + + Parameters + ---------- + cell_id : int + ID of the cell + T : float + Temperature in K + """ + return self._dll.openmc_cell_set_temperature(cell_id, T) def finalize(self): """Finalize simulation and free memory""" @@ -149,8 +159,40 @@ class _OpenMCLibrary(object): """Run simulation""" return self._dll.openmc_run() + def set_density(self, xyz, density): + """Set density at a given point. + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates at position + density : float + Density in atom/b-cm + + Returns + ------- + int + Return status (negative if an error occurs) + + """ + return self._dll.openmc_set_density(_double3(*xyz), density) + def set_temperature(self, xyz, T): - """Set temperature.""" + """Set temperature at a given point. + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates at position + T : float + Temperature in K + + Returns + ------- + int + Return status (negative if an error occurs) + + """ return self._dll.openmc_set_temperature(_double3(*xyz), T) def tally_results(self, tally_id): diff --git a/src/api.F90 b/src/api.F90 index ce733e518..901763500 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -24,6 +24,8 @@ module openmc_api public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run + public :: openmc_set_density + public :: openmc_set_temperature public :: openmc_tally_results contains @@ -147,6 +149,37 @@ contains end subroutine openmc_reset +!=============================================================================== +! OPENMC_SET_DENSITY sets the density of a material at a given point +!=============================================================================== + + function openmc_set_density(xyz, density) result(err) bind(C) + real(C_DOUBLE), intent(in) :: xyz(3) + real(C_DOUBLE), intent(in), value :: density + integer(C_INT) :: err + + logical :: found + type(Particle) :: p + + call p % initialize() + p % coord(1) % xyz(:) = xyz + p % coord(1) % uvw(:) = [ZERO, ZERO, ONE] + call find_cell(p, found) + + err = -1 + if (found) then + if (p % material /= MATERIAL_VOID) then + associate (m => materials(p % material)) + err = m % set_density(density, nuclides) + end associate + end if + end if + end function openmc_set_density + +!=============================================================================== +! OPENMC_SET_TEMPERATURE sets the temperature of a cell at a given point +!=============================================================================== + function openmc_set_temperature(xyz, T) result(err) bind(C) real(C_DOUBLE), intent(in) :: xyz(3) real(C_DOUBLE), intent(in), value :: T From c7e4733d290d80d5d7d4e81aebc2b2681b709ee0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 15 Jun 2017 17:38:42 -0500 Subject: [PATCH 042/123] Get rid of overall_gen global variable --- src/eigenvalue.F90 | 25 ++++++++++++++++--------- src/global.F90 | 10 +++++++++- src/output.F90 | 27 ++++++++++++++++++++------- src/simulation.F90 | 36 ++++++++++++++++++------------------ 4 files changed, 63 insertions(+), 35 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 86169d98d..7d9671e94 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -371,20 +371,25 @@ contains subroutine calculate_generation_keff() + integer :: i ! overall generation + ! Get keff for this generation by subtracting off the starting value keff_generation = global_tallies(RESULT_VALUE, K_TRACKLENGTH) - keff_generation + ! Determine overall generation + i = overall_generation() + #ifdef MPI ! Combine values across all processors - call MPI_ALLREDUCE(keff_generation, k_generation(overall_gen), 1, & - MPI_REAL8, MPI_SUM, mpi_intracomm, mpi_err) + call MPI_ALLREDUCE(keff_generation, k_generation(i), 1, MPI_REAL8, & + MPI_SUM, mpi_intracomm, mpi_err) #else - k_generation(overall_gen) = keff_generation + k_generation(i) = keff_generation #endif ! Normalize single batch estimate of k ! TODO: This should be normalized by total_weight, not by n_particles - k_generation(overall_gen) = k_generation(overall_gen) / n_particles + k_generation(i) = k_generation(i) / n_particles end subroutine calculate_generation_keff @@ -396,22 +401,24 @@ contains subroutine calculate_average_keff() + integer :: i ! overall generation within simulation integer :: n ! number of active generations real(8) :: alpha ! significance level for CI real(8) :: t_value ! t-value for confidence intervals - ! Determine number of active generations - n = overall_gen - n_inactive*gen_per_batch + ! Determine overall generation and number of active generations + i = overall_generation() + n = i - n_inactive*gen_per_batch if (n <= 0) then ! For inactive generations, use current generation k as estimate for next ! generation - keff = k_generation(overall_gen) + keff = k_generation(i) else ! Sample mean of keff - k_sum(1) = k_sum(1) + k_generation(overall_gen) - k_sum(2) = k_sum(2) + k_generation(overall_gen)**2 + k_sum(1) = k_sum(1) + k_generation(i) + k_sum(2) = k_sum(2) + k_generation(i)**2 ! Determine mean keff = k_sum(1) / n diff --git a/src/global.F90 b/src/global.F90 index 1d45bcbe8..b33ca2957 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -215,7 +215,6 @@ module global integer :: gen_per_batch = 1 ! # of generations per batch integer :: current_batch = 0 ! current batch integer :: current_gen = 0 ! current generation within a batch - integer :: overall_gen = 0 ! overall generation in the run ! ============================================================================ ! TALLY PRECISION TRIGGER VARIABLES @@ -561,4 +560,13 @@ contains end subroutine free_memory +!=============================================================================== +! OVERALL_GENERATION determines the overall generation number +!=============================================================================== + + pure function overall_generation() result(gen) + integer :: gen + gen = gen_per_batch*(current_batch - 1) + current_gen + end function overall_generation + end module global diff --git a/src/output.F90 b/src/output.F90 index 93245f132..828af717d 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -366,17 +366,23 @@ contains subroutine print_generation() + integer :: i ! overall generation + integer :: n ! number of active generations + + ! Determine overall generation and number of active generations + i = overall_generation() + n = i - n_inactive*gen_per_batch + ! write out information about batch and generation write(UNIT=OUTPUT_UNIT, FMT='(2X,A9)', ADVANCE='NO') & trim(to_str(current_batch)) // "/" // trim(to_str(current_gen)) - write(UNIT=OUTPUT_UNIT, FMT='(3X,F8.5)', ADVANCE='NO') & - k_generation(overall_gen) + write(UNIT=OUTPUT_UNIT, FMT='(3X,F8.5)', ADVANCE='NO') k_generation(i) ! write out entropy info if (entropy_on) write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - entropy(overall_gen) + entropy(i) - if (overall_gen - n_inactive*gen_per_batch > 1) then + if (n > 1) then write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5," +/-",F8.5)', ADVANCE='NO') & keff, keff_std end if @@ -393,18 +399,25 @@ contains subroutine print_batch_keff() + integer :: i ! overall generation + integer :: n ! number of active generations + + ! Determine overall generation and number of active generations + i = overall_generation() + n = i - n_inactive*gen_per_batch + ! write out information batch and option independent output write(UNIT=OUTPUT_UNIT, FMT='(2X,A9)', ADVANCE='NO') & trim(to_str(current_batch)) // "/" // trim(to_str(gen_per_batch)) write(UNIT=OUTPUT_UNIT, FMT='(3X,F8.5)', ADVANCE='NO') & - k_generation(overall_gen) + k_generation(i) ! write out entropy info if (entropy_on) write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5)', ADVANCE='NO') & - entropy(current_batch*gen_per_batch) + entropy(i) ! write out accumulated k-effective if after first active batch - if (overall_gen - n_inactive*gen_per_batch > 1) then + if (n > 1) then write(UNIT=OUTPUT_UNIT, FMT='(3X, F8.5," +/-",F8.5)', ADVANCE='NO') & keff, keff_std else diff --git a/src/simulation.F90 b/src/simulation.F90 index 8c4016f96..34efaca1e 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -138,7 +138,7 @@ contains p % id = work_index(rank) + index_source ! set random number seed - particle_seed = (overall_gen - 1)*n_particles + p % id + particle_seed = (overall_generation() - 1)*n_particles + p % id call set_particle_seed(particle_seed) ! set particle trace @@ -203,9 +203,6 @@ contains subroutine initialize_generation() - ! set overall generation number - overall_gen = gen_per_batch*(current_batch - 1) + current_gen - if (run_mode == MODE_EIGENVALUE) then ! Reset number of fission bank sites n_bank = 0 @@ -270,13 +267,20 @@ contains call calculate_average_keff() ! Write generation output - if (master .and. current_gen /= gen_per_batch .and. verbosity >= 7) & - call print_generation() + if (master .and. verbosity >= 7) then + if (current_gen /= gen_per_batch) then + call print_generation() + else + call print_batch_keff() + end if + end if + elseif (run_mode == MODE_FIXEDSOURCE) then ! For fixed-source mode, we need to sample the external source if (path_source == '') then do i = 1, work - call set_particle_seed(overall_gen*n_particles + work_index(rank) + i) + call set_particle_seed(overall_generation()*n_particles + & + work_index(rank) + i) call sample_external_source(source_bank(i)) end do end if @@ -307,9 +311,6 @@ contains ! Perform CMFD calculation if on if (cmfd_on) call execute_cmfd() - ! Display output - if (master .and. verbosity >= 7) call print_batch_keff() - ! Calculate combined estimate of k-effective if (master) call calculate_combined_keff() end if @@ -359,7 +360,6 @@ contains if (run_mode == MODE_EIGENVALUE) then do current_gen = 1, gen_per_batch - overall_gen = overall_gen + 1 call calculate_average_keff() ! print out batch keff @@ -412,13 +412,13 @@ contains subroutine reduce_overlap_count() #ifdef MPI - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - else - call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - end if + if (master) then + call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & + MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) + else + call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & + MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) + end if #endif end subroutine reduce_overlap_count From 69263f130ff0c1bf48325a411449327d9d93cf7f Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 15 Jun 2017 17:56:32 -0500 Subject: [PATCH 043/123] Introduce total_gen global variable to keep track of total number of generations --- src/eigenvalue.F90 | 3 +-- src/global.F90 | 1 + src/particle_restart.F90 | 3 +-- src/simulation.F90 | 9 ++++++--- src/source.F90 | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 7d9671e94..f370ab38e 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -95,8 +95,7 @@ contains ! skip ahead in the sequence using the starting index in the 'global' ! fission bank for each processor. - call set_particle_seed(int((current_batch - 1)*gen_per_batch + & - current_gen,8)) + call set_particle_seed(int(total_gen + overall_generation(), 8)) call advance_prn_seed(start) ! Determine how many fission sites we need to sample from the source bank diff --git a/src/global.F90 b/src/global.F90 index b33ca2957..96df26cf6 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -215,6 +215,7 @@ module global integer :: gen_per_batch = 1 ! # of generations per batch integer :: current_batch = 0 ! current batch integer :: current_gen = 0 ! current generation within a batch + integer :: total_gen = 0 ! total number of generations simulated ! ============================================================================ ! TALLY PRECISION TRIGGER VARIABLES diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index 262cef802..ccf546dd9 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -44,8 +44,7 @@ contains ! Compute random number seed select case (previous_run_mode) case (MODE_EIGENVALUE) - particle_seed = ((current_batch - 1)*gen_per_batch + & - current_gen - 1)*n_particles + p % id + particle_seed = (total_gen + overall_generation() - 1)*n_particles + p % id case (MODE_FIXEDSOURCE) particle_seed = p % id end select diff --git a/src/simulation.F90 b/src/simulation.F90 index 34efaca1e..1283752f6 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -138,7 +138,7 @@ contains p % id = work_index(rank) + index_source ! set random number seed - particle_seed = (overall_generation() - 1)*n_particles + p % id + particle_seed = (total_gen + overall_generation() - 1)*n_particles + p % id call set_particle_seed(particle_seed) ! set particle trace @@ -279,8 +279,8 @@ contains ! For fixed-source mode, we need to sample the external source if (path_source == '') then do i = 1, work - call set_particle_seed(overall_generation()*n_particles + & - work_index(rank) + i) + call set_particle_seed((total_gen + overall_generation()) * & + n_particles + work_index(rank) + i) call sample_external_source(source_bank(i)) end do end if @@ -387,6 +387,9 @@ contains subroutine finalize_simulation + ! Increment total number of generations + total_gen = total_gen + n_batches*gen_per_batch + ! Start finalization timer call time_finalize % start() diff --git a/src/source.F90 b/src/source.F90 index 81931245a..517715b56 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -73,7 +73,7 @@ contains src => source_bank(i) ! initialize random number seed - id = work_index(rank) + i + id = total_gen*n_particles + work_index(rank) + i call set_particle_seed(id) ! sample external source distribution From 2084be5b3822c768b560c184771f79e9c22f9902 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 15 Jun 2017 22:11:05 -0500 Subject: [PATCH 044/123] Save distributed cell instance in find_cell --- src/api.F90 | 6 +++++- src/geometry.F90 | 3 +++ src/particle_header.F90 | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/api.F90 b/src/api.F90 index 901763500..287aa63c2 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -196,7 +196,11 @@ contains err = -1 if (found) then associate (c => cells(p % coord(p % n_coord) % cell)) - c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) + if (size(c % sqrtkT) > 1) then + c % sqrtkT(p % cell_instance) = sqrt(K_BOLTZMANN * T) + else + c % sqrtkT(1) = sqrt(K_BOLTZMANN * T) + end if err = 0 end associate end if diff --git a/src/geometry.F90 b/src/geometry.F90 index f80bd7eb7..0074a053c 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -277,6 +277,9 @@ contains end if end if end do + + ! Keep track of which instance of the cell the particle is in + p % cell_instance = offset + 1 end if ! Save the material diff --git a/src/particle_header.F90 b/src/particle_header.F90 index a7309393b..f28e54976 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -45,6 +45,7 @@ module particle_header ! Particle coordinates integer :: n_coord ! number of current coordinates + integer :: cell_instance ! offset for distributed properties type(LocalCoord) :: coord(MAX_COORD) ! coordinates for all levels ! Energy Data From ebd25603bde7fd1f7aa84708ef24b5253327e665 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 16 Jun 2017 17:23:01 -0500 Subject: [PATCH 045/123] Simplify find_cell logic --- src/geometry.F90 | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 0074a053c..d46f7ba20 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -219,6 +219,7 @@ contains n = size(univ % cells) end if + found = .false. CELL_LOOP: do i = 1, n ! select cells based on whether we are searching a universe or a provided ! list of cells (this would be for lists of neighbor cells) @@ -234,16 +235,21 @@ contains c => cells(index_cell) ! Move on to the next cell if the particle is not inside this cell - if (.not. cell_contains(c, p)) cycle + if (cell_contains(c, p)) then + ! Set cell on this level + p % coord(j) % cell = index_cell - ! Set cell on this level - p % coord(j) % cell = index_cell + ! Show cell information on trace + if (verbosity >= 10 .or. trace) then + call write_message(" Entering cell " // trim(to_str(c % id))) + end if - ! Show cell information on trace - if (verbosity >= 10 .or. trace) then - call write_message(" Entering cell " // trim(to_str(c % id))) + found = .true. + exit end if + end do CELL_LOOP + if (found) then CELL_TYPE: if (c % type == FILL_MATERIAL) then ! ====================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH @@ -323,7 +329,6 @@ contains call find_cell(p, found) j = p % n_coord - if (.not. found) exit elseif (c % type == FILL_LATTICE) then CELL_TYPE ! ====================================================================== @@ -369,16 +374,9 @@ contains call find_cell(p, found) j = p % n_coord - if (.not. found) exit end if CELL_TYPE - - ! Found cell so we can return - found = .true. - return - end do CELL_LOOP - - found = .false. + end if end subroutine find_cell From 48b255b559513eb513dce9194c3974c9a9e52027 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 19 Jun 2017 06:54:49 -0500 Subject: [PATCH 046/123] Get rid of pointers in find_cell --- src/geometry.F90 | 261 +++++++++++++++++++++++------------------------ 1 file changed, 129 insertions(+), 132 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index d46f7ba20..fbbe75a18 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -198,11 +198,9 @@ contains integer :: distribcell_index integer :: i_xyz(3) ! indices in lattice integer :: n ! number of cells to search - integer :: index_cell ! index in cells array + integer :: i_cell ! index in cells array + integer :: i_universe ! index in universes array logical :: use_search_cells ! use cells provided as argument - type(Cell), pointer :: c ! pointer to cell - class(Lattice), pointer :: lat ! pointer to lattice - type(Universe), pointer :: univ ! universe to search in do j = p % n_coord + 1, MAX_COORD call p % coord(j) % reset() @@ -210,13 +208,13 @@ contains j = p % n_coord ! set size of list to search + i_universe = p % coord(j) % universe if (present(search_cells)) then use_search_cells = .true. n = size(search_cells) else use_search_cells = .false. - univ => universes(p % coord(j) % universe) - n = size(univ % cells) + n = size(universes(i_universe) % cells) end if found = .false. @@ -224,24 +222,22 @@ contains ! select cells based on whether we are searching a universe or a provided ! list of cells (this would be for lists of neighbor cells) if (use_search_cells) then - index_cell = search_cells(i) + i_cell = search_cells(i) ! check to make sure search cell is in same universe - if (cells(index_cell) % universe /= p % coord(j) % universe) cycle + if (cells(i_cell) % universe /= i_universe) cycle else - index_cell = univ % cells(i) + i_cell = universes(i_universe) % cells(i) end if - ! get pointer to cell - c => cells(index_cell) - ! Move on to the next cell if the particle is not inside this cell - if (cell_contains(c, p)) then + if (cell_contains(cells(i_cell), p)) then ! Set cell on this level - p % coord(j) % cell = index_cell + p % coord(j) % cell = i_cell ! Show cell information on trace if (verbosity >= 10 .or. trace) then - call write_message(" Entering cell " // trim(to_str(c % id))) + call write_message(" Entering cell " // trim(to_str(& + cells(i_cell) % id))) end if found = .true. @@ -250,132 +246,133 @@ contains end do CELL_LOOP if (found) then - CELL_TYPE: if (c % type == FILL_MATERIAL) then - ! ====================================================================== - ! AT LOWEST UNIVERSE, TERMINATE SEARCH + associate(c => cells(i_cell)) + CELL_TYPE: if (c % type == FILL_MATERIAL) then + ! ====================================================================== + ! AT LOWEST UNIVERSE, TERMINATE SEARCH - ! Save previous material and temperature - p % last_material = p % material - p % last_sqrtkT = p % sqrtkT + ! Save previous material and temperature + p % last_material = p % material + p % last_sqrtkT = p % sqrtkT - ! Get distributed offset - if (size(c % material) > 1 .or. size(c % sqrtkT) > 1) then - ! Distributed instances of this cell have different - ! materials/temperatures. Determine which instance this is for - ! assigning the matching material/temperature. - distribcell_index = c % distribcell_index - offset = 0 - do k = 1, p % n_coord - if (cells(p % coord(k) % cell) % type == FILL_UNIVERSE) then - offset = offset + cells(p % coord(k) % cell) % & - offset(distribcell_index) - elseif (cells(p % coord(k) % cell) % type == FILL_LATTICE) then - if (lattices(p % coord(k + 1) % lattice) % obj & - % are_valid_indices([& - p % coord(k + 1) % lattice_x, & - p % coord(k + 1) % lattice_y, & - p % coord(k + 1) % lattice_z])) then - offset = offset + lattices(p % coord(k + 1) % lattice) % obj % & - offset(distribcell_index, & + ! Get distributed offset + if (size(c % material) > 1 .or. size(c % sqrtkT) > 1) then + ! Distributed instances of this cell have different + ! materials/temperatures. Determine which instance this is for + ! assigning the matching material/temperature. + distribcell_index = c % distribcell_index + offset = 0 + do k = 1, p % n_coord + if (cells(p % coord(k) % cell) % type == FILL_UNIVERSE) then + offset = offset + cells(p % coord(k) % cell) % & + offset(distribcell_index) + elseif (cells(p % coord(k) % cell) % type == FILL_LATTICE) then + if (lattices(p % coord(k + 1) % lattice) % obj & + % are_valid_indices([& p % coord(k + 1) % lattice_x, & p % coord(k + 1) % lattice_y, & - p % coord(k + 1) % lattice_z) + p % coord(k + 1) % lattice_z])) then + offset = offset + lattices(p % coord(k + 1) % lattice) % obj % & + offset(distribcell_index, & + p % coord(k + 1) % lattice_x, & + p % coord(k + 1) % lattice_y, & + p % coord(k + 1) % lattice_z) + end if + end if + end do + + ! Keep track of which instance of the cell the particle is in + p % cell_instance = offset + 1 + end if + + ! Save the material + if (size(c % material) > 1) then + p % material = c % material(offset + 1) + else + p % material = c % material(1) + end if + + ! Save the temperature + if (size(c % sqrtkT) > 1) then + p % sqrtkT = c % sqrtkT(offset + 1) + else + p % sqrtkT = c % sqrtkT(1) + end if + + elseif (c % type == FILL_UNIVERSE) then CELL_TYPE + ! ====================================================================== + ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL + + ! Store lower level coordinates + p % coord(j + 1) % xyz = p % coord(j) % xyz + p % coord(j + 1) % uvw = p % coord(j) % uvw + + ! Move particle to next level and set universe + j = j + 1 + p % n_coord = j + p % coord(j) % universe = c % fill + + ! Apply translation + if (allocated(c % translation)) then + p % coord(j) % xyz = p % coord(j) % xyz - c % translation + end if + + ! Apply rotation + if (allocated(c % rotation_matrix)) then + p % coord(j) % xyz = matmul(c % rotation_matrix, p % coord(j) % xyz) + p % coord(j) % uvw = matmul(c % rotation_matrix, p % coord(j) % uvw) + p % coord(j) % rotated = .true. + end if + + call find_cell(p, found) + j = p % n_coord + + elseif (c % type == FILL_LATTICE) then CELL_TYPE + ! ====================================================================== + ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL + + associate (lat => lattices(c % fill) % obj) + ! Determine lattice indices + i_xyz = lat % get_indices(p % coord(j) % xyz + TINY_BIT * p % coord(j) % uvw) + + ! Store lower level coordinates + p % coord(j + 1) % xyz = lat % get_local_xyz(p % coord(j) % xyz, i_xyz) + p % coord(j + 1) % uvw = p % coord(j) % uvw + + ! set particle lattice indices + p % coord(j + 1) % lattice = c % fill + p % coord(j + 1) % lattice_x = i_xyz(1) + p % coord(j + 1) % lattice_y = i_xyz(2) + p % coord(j + 1) % lattice_z = i_xyz(3) + + ! Set the next lowest coordinate level. + if (lat % are_valid_indices(i_xyz)) then + ! Particle is inside the lattice. + p % coord(j + 1) % universe = & + lat % universes(i_xyz(1), i_xyz(2), i_xyz(3)) + + else + ! Particle is outside the lattice. + if (lat % outer == NO_OUTER_UNIVERSE) then + call handle_lost_particle(p, "Particle " // trim(to_str(p %id)) & + // " is outside lattice " // trim(to_str(lat % id)) & + // " but the lattice has no defined outer universe.") + return + else + p % coord(j + 1) % universe = lat % outer end if end if - end do + end associate - ! Keep track of which instance of the cell the particle is in - p % cell_instance = offset + 1 - end if + ! Move particle to next level and search for the lower cells. + j = j + 1 + p % n_coord = j - ! Save the material - if (size(c % material) > 1) then - p % material = c % material(offset + 1) - else - p % material = c % material(1) - end if + call find_cell(p, found) + j = p % n_coord - ! Save the temperature - if (size(c % sqrtkT) > 1) then - p % sqrtkT = c % sqrtkT(offset + 1) - else - p % sqrtkT = c % sqrtkT(1) - end if - - elseif (c % type == FILL_UNIVERSE) then CELL_TYPE - ! ====================================================================== - ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - - ! Store lower level coordinates - p % coord(j + 1) % xyz = p % coord(j) % xyz - p % coord(j + 1) % uvw = p % coord(j) % uvw - - ! Move particle to next level and set universe - j = j + 1 - p % n_coord = j - p % coord(j) % universe = c % fill - - ! Apply translation - if (allocated(c % translation)) then - p % coord(j) % xyz = p % coord(j) % xyz - c % translation - end if - - ! Apply rotation - if (allocated(c % rotation_matrix)) then - p % coord(j) % xyz = matmul(c % rotation_matrix, p % coord(j) % xyz) - p % coord(j) % uvw = matmul(c % rotation_matrix, p % coord(j) % uvw) - p % coord(j) % rotated = .true. - end if - - call find_cell(p, found) - j = p % n_coord - - elseif (c % type == FILL_LATTICE) then CELL_TYPE - ! ====================================================================== - ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - - ! Set current lattice - lat => lattices(c % fill) % obj - - ! Determine lattice indices - i_xyz = lat % get_indices(p % coord(j) % xyz + TINY_BIT * p % coord(j) % uvw) - - ! Store lower level coordinates - p % coord(j + 1) % xyz = lat % get_local_xyz(p % coord(j) % xyz, i_xyz) - p % coord(j + 1) % uvw = p % coord(j) % uvw - - ! set particle lattice indices - p % coord(j + 1) % lattice = c % fill - p % coord(j + 1) % lattice_x = i_xyz(1) - p % coord(j + 1) % lattice_y = i_xyz(2) - p % coord(j + 1) % lattice_z = i_xyz(3) - - ! Set the next lowest coordinate level. - if (lat % are_valid_indices(i_xyz)) then - ! Particle is inside the lattice. - p % coord(j + 1) % universe = & - lat % universes(i_xyz(1), i_xyz(2), i_xyz(3)) - - else - ! Particle is outside the lattice. - if (lat % outer == NO_OUTER_UNIVERSE) then - call handle_lost_particle(p, "Particle " // trim(to_str(p %id)) & - // " is outside lattice " // trim(to_str(lat % id)) & - // " but the lattice has no defined outer universe.") - return - else - p % coord(j + 1) % universe = lat % outer - end if - end if - - ! Move particle to next level and search for the lower cells. - j = j + 1 - p % n_coord = j - - call find_cell(p, found) - j = p % n_coord - - end if CELL_TYPE + end if CELL_TYPE + end associate end if end subroutine find_cell From b2213ff343b0e63ef6b7be5e35888512ec1f7ced Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 19 Jun 2017 11:12:08 -0500 Subject: [PATCH 047/123] Set elastic type in ACER card 9 correctly --- openmc/data/njoy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index 80817bf71..b6fce5e3e 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -358,7 +358,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, # Determine whether elastic is incoherent (0) or coherent (1) file_obj = StringIO(ev_thermal.section[7, 2]) - elastic_type = endf.get_head_record(file_obj)[2] + elastic_type = endf.get_head_record(file_obj)[2] - 1 else: elastic = 0 mt_elastic = 0 From 1c5016167a5712b8dc3c6b0acf246839e12ef116 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 21 Jun 2017 11:24:37 -0400 Subject: [PATCH 048/123] Allow partly S(a,b), partly amorphus scattering --- openmc/material.py | 16 ++++++++-- src/cross_section.F90 | 71 ++++++++++++++++++++++++----------------- src/input_xml.F90 | 18 +++++++++-- src/material_header.F90 | 3 +- src/nuclide_header.F90 | 3 +- src/physics.F90 | 60 +++++++++++++++++++--------------- src/tally.F90 | 3 +- 7 files changed, 111 insertions(+), 63 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 762332584..2c633a5ac 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -618,13 +618,18 @@ class Material(IDManagerMixin): if element == elm[0]: self._elements.remove(elm) - def add_s_alpha_beta(self, name): + def add_s_alpha_beta(self, name, fraction=1.0): r"""Add an :math:`S(\alpha,\beta)` table to the material Parameters ---------- name : str Name of the :math:`S(\alpha,\beta)` table + fraction : float + The fraction of relevant nuclei that are affected by the + :math:`S(\alpha,\beta)` table. For example, if the material is a + block of carbon that is 60% graphite and 40% amorphus then add a + graphite :math:`S(\alpha,\beta)` table with fraction=0.6. """ @@ -638,13 +643,17 @@ class Material(IDManagerMixin): 'non-string table name "{}"'.format(self._id, name) raise ValueError(msg) + cv.check_type('S(a,b) fraction', fraction, Real) + cv.check_greater_than('S(a,b) fraction', fraction, 0.0, True) + cv.check_less_than('S(a,b) fraction', fraction, 1.0, True) + new_name = openmc.data.get_thermal_name(name) if new_name != name: msg = 'OpenMC S(a,b) tables follow the GND naming convention. ' \ 'Table "{}" is being renamed as "{}".'.format(name, new_name) warnings.warn(msg) - self._sab.append(new_name) + self._sab.append((new_name, fraction)) def make_isotropic_in_lab(self): for nuclide, percent, percent_type in self._nuclides: @@ -972,7 +981,8 @@ class Material(IDManagerMixin): if len(self._sab) > 0: for sab in self._sab: subelement = ET.SubElement(element, "sab") - subelement.set("name", sab) + subelement.set("name", sab[0]) + subelement.set("fraction", sab[1]) return element diff --git a/src/cross_section.F90 b/src/cross_section.F90 index ce7d97133..1306fb669 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -36,6 +36,7 @@ contains integer :: i_grid ! index into logarithmic mapping array or material ! union grid real(8) :: atom_density ! atom density of a nuclide + real(8) :: sab_frac ! fraction of atoms affected by S(a,b) logical :: check_sab ! should we check for S(a,b) table? ! Set all material macroscopic cross sections to zero @@ -71,6 +72,7 @@ contains if (i == mat % i_sab_nuclides(j)) then ! Get index in sab_tables i_sab = mat % i_sab_tables(j) + sab_frac = mat % sab_fracs(j) ! If particle energy is greater than the highest energy for the S(a,b) ! table, don't use the S(a,b) table @@ -84,7 +86,7 @@ contains end if end if - ! ======================================================================== + ! ====================================================================== ! CALCULATE MICROSCOPIC CROSS SECTION ! Determine microscopic cross sections for this nuclide @@ -93,12 +95,14 @@ contains ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E & .or. p % sqrtkT /= micro_xs(i_nuclide) % last_sqrtkT) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, p % sqrtkT) + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, & + p % sqrtkT, sab_frac) else if (i_sab /= micro_xs(i_nuclide) % last_index_sab) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, p % sqrtkT) + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, & + p % sqrtkT, sab_frac) end if - ! ======================================================================== + ! ====================================================================== ! ADD TO MACROSCOPIC CROSS SECTION ! Copy atom density of nuclide in material @@ -110,7 +114,8 @@ contains ! Add contributions to material macroscopic scattering cross section material_xs % elastic = material_xs % elastic + & - atom_density * micro_xs(i_nuclide) % elastic + atom_density * (micro_xs(i_nuclide) % elastic & + + micro_xs(i_nuclide) % scatter_sab) ! Add contributions to material macroscopic absorption cross section material_xs % absorption = material_xs % absorption + & @@ -133,13 +138,15 @@ contains ! given index in the nuclides array at the energy of the given particle !=============================================================================== - subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_log_union, sqrtkT) - integer, intent(in) :: i_nuclide ! index into nuclides array - integer, intent(in) :: i_sab ! index into sab_tables array - real(8), intent(in) :: E ! energy + subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_log_union, sqrtkT, & + sab_frac) + integer, intent(in) :: i_nuclide ! index into nuclides array + integer, intent(in) :: i_sab ! index into sab_tables array + real(8), intent(in) :: E ! energy integer, intent(in) :: i_log_union ! index into logarithmic mapping array or ! material union energy grid - real(8), intent(in) :: sqrtkT ! Square root of kT, material dependent + real(8), intent(in) :: sqrtkT ! square root of kT, material dependent + real(8), intent(in) :: sab_frac ! fraction of atoms affected by S(a,b) logical :: use_mp ! true if XS can be calculated with windowed multipole integer :: i_temp ! index for temperature @@ -243,8 +250,10 @@ contains micro_xs(i_nuclide) % interp_factor = f ! Initialize nuclide cross-sections to zero - micro_xs(i_nuclide) % fission = ZERO - micro_xs(i_nuclide) % nu_fission = ZERO + micro_xs(i_nuclide) % fission = ZERO + micro_xs(i_nuclide) % nu_fission = ZERO + micro_xs(i_nuclide) % scatter_sab = ZERO + micro_xs(i_nuclide) % elastic_sab = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * xs % total(i_grid) & @@ -277,14 +286,15 @@ contains ! Initialize URR probability table treatment to false micro_xs(i_nuclide) % use_ptable = .false. - ! If there is S(a,b) data for this nuclide, we need to do a few - ! things. Since the total cross section was based on non-S(a,b) data, we - ! need to correct it by subtracting the non-S(a,b) elastic cross section and - ! then add back in the calculated S(a,b) elastic+inelastic cross section. + ! If there is S(a,b) data for this nuclide, we need to set the sab_scatter + ! and sab_elastic cross sections and correct the total and elastic cross + ! sections. - if (i_sab > 0) call calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT) + if (i_sab > 0) then + call calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT, sab_frac) + end if - ! if the particle is in the unresolved resonance range and there are + ! If the particle is in the unresolved resonance range and there are ! probability tables, we need to determine cross sections from the table if (urr_ptables_on .and. nuc % urr_present .and. .not. use_mp) then @@ -303,16 +313,16 @@ contains !=============================================================================== ! CALCULATE_SAB_XS determines the elastic and inelastic scattering -! cross-sections in the thermal energy range. These cross sections replace -! whatever data were taken from the normal Nuclide table. +! cross-sections in the thermal energy range. These cross sections replace a +! fraction of whatever data were taken from the normal Nuclide table. !=============================================================================== - subroutine calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT) - + subroutine calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT, sab_frac) integer, intent(in) :: i_nuclide ! index into nuclides array integer, intent(in) :: i_sab ! index into sab_tables array real(8), intent(in) :: E ! energy real(8), intent(in) :: sqrtkT ! temperature + real(8), intent(in) :: sab_frac ! fraction of atoms affected by S(a,b) integer :: i_grid ! index on S(a,b) energy grid integer :: i_temp ! temperature index @@ -341,7 +351,8 @@ contains ! Randomly sample between temperature i and i+1 f = (kT - sab_tables(i_sab) % kTs(i_temp)) / & - (sab_tables(i_sab) % kTs(i_temp + 1) - sab_tables(i_sab) % kTs(i_temp)) + (sab_tables(i_sab) % kTs(i_temp + 1) & + - sab_tables(i_sab) % kTs(i_temp)) if (f > prn()) i_temp = i_temp + 1 end if @@ -402,13 +413,15 @@ contains end if end associate - ! Correct total and elastic cross sections - micro_xs(i_nuclide) % total = micro_xs(i_nuclide) % total - & - micro_xs(i_nuclide) % elastic + inelastic + elastic - micro_xs(i_nuclide) % elastic = inelastic + elastic + ! Store the S(a,b) cross sections. + micro_xs(i_nuclide) % scatter_sab = sab_frac * (elastic + inelastic) + micro_xs(i_nuclide) % elastic_sab = sab_frac * elastic - ! Store S(a,b) elastic cross section for sampling later - micro_xs(i_nuclide) % elastic_sab = elastic + ! Correct total and elastic cross sections + micro_xs(i_nuclide) % total = micro_xs(i_nuclide) % total & + + sab_frac * (elastic + inelastic - micro_xs(i_nuclide) % elastic) + micro_xs(i_nuclide) % elastic = & + (ONE - sab_frac) * micro_xs(i_nuclide) % elastic ! Save temperature index micro_xs(i_nuclide) % index_temp_sab = i_temp diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5ff4d119e..2e7219a31 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2565,6 +2565,7 @@ contains ! table is indeed applied to multiple nuclides. allocate(mat % sab_names(n_sab)) allocate(mat % i_sab_tables(n_sab)) + allocate(mat % sab_fracs(n_sab)) do j = 1, n_sab ! Get pointer to S(a,b) table @@ -2578,6 +2579,13 @@ contains name = trim(name) mat % sab_names(j) = name + ! Read the fraction of nuclei affected by this S(a,b) table + if (check_for_node(node_sab, "fraction")) then + call get_node_value(node_sab, "fraction", mat % sab_fracs(j)) + else + mat % sab_fracs(j) = ONE + end if + ! Check that this nuclide is listed in the cross_sections.xml file if (.not. library_dict % has_key(to_lower(name))) then call fatal_error("Could not find S(a,b) table " // trim(name) & @@ -5151,8 +5159,9 @@ contains integer :: temp_nuclide ! temporary value for sorting integer :: temp_table ! temporary value for sorting logical :: found - type(VectorInt) :: i_sab_tables - type(VectorInt) :: i_sab_nuclides + type(VectorInt) :: i_sab_tables + type(VectorInt) :: i_sab_nuclides + type(VectorReal) :: sab_fracs do i = 1, size(materials) ! Skip materials with no S(a,b) tables @@ -5170,6 +5179,7 @@ contains if (any(sab % nuclides == nuclides(mat % nuclide(j)) % name)) then call i_sab_tables % push_back(mat % i_sab_tables(k)) call i_sab_nuclides % push_back(j) + call sab_fracs % push_back(mat % sab_fracs(k)) found = .true. end if end do FIND_NUCLIDE @@ -5185,15 +5195,19 @@ contains ! Update i_sab_tables and i_sab_nuclides deallocate(mat % i_sab_tables) + deallocate(mat % sab_fracs) m = i_sab_tables % size() allocate(mat % i_sab_tables(m)) allocate(mat % i_sab_nuclides(m)) + allocate(mat % sab_fracs(m)) mat % i_sab_tables(:) = i_sab_tables % data(1:m) mat % i_sab_nuclides(:) = i_sab_nuclides % data(1:m) + mat % sab_fracs = sab_fracs % data(1:m) ! Clear entries in vectors for next material call i_sab_tables % clear() call i_sab_nuclides % clear() + call sab_fracs % clear() ! If there are multiple S(a,b) tables, we need to make sure that the ! entries in i_sab_nuclides are sorted or else they won't be applied diff --git a/src/material_header.F90 b/src/material_header.F90 index fdc36548f..17fe8d248 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -22,10 +22,11 @@ module material_header ! Unionized energy grid information integer, allocatable :: nuclide_grid_index(:,:) ! nuclide e_grid pointers - ! S(a,b) data references + ! S(a,b) data integer :: n_sab = 0 ! number of S(a,b) tables integer, allocatable :: i_sab_nuclides(:) ! index of corresponding nuclide integer, allocatable :: i_sab_tables(:) ! index in sab_tables + real(8), allocatable :: sab_fracs(:) ! how often to use S(a,b) ! Temporary names read during initialization character(20), allocatable :: names(:) ! isotope names diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index ea6eab328..41b1008a8 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -112,10 +112,11 @@ module nuclide_header real(8) :: last_E = ZERO ! last evaluated energy real(8) :: interp_factor ! interpolation factor on nuc. energy grid real(8) :: total ! microscropic total xs - real(8) :: elastic ! microscopic elastic scattering xs + real(8) :: elastic ! microscopic elastic scattering xs (non S(a,b)) real(8) :: absorption ! microscopic absorption xs real(8) :: fission ! microscopic fission xs real(8) :: nu_fission ! microscopic production xs + real(8) :: scatter_sab ! microscopic scattering xs due to S(a,b) ! Information for S(a,b) use integer :: index_sab ! index in sab_tables (zero means no table) diff --git a/src/physics.F90 b/src/physics.F90 index 9482772ef..15b53fd7f 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -324,6 +324,7 @@ contains real(8) :: uvw_old(3) ! incoming uvw for iso-in-lab scattering real(8) :: phi ! azimuthal angle for iso-in-lab scattering real(8) :: kT ! temperature in eV + logical :: sampled ! whether or not a reaction type has been sampled type(Nuclide), pointer :: nuc ! copy incoming direction @@ -337,36 +338,43 @@ contains ! For tallying purposes, this routine might be called directly. In that ! case, we need to sample a reaction via the cutoff variable - prob = ZERO cutoff = prn() * (micro_xs(i_nuclide) % total - & micro_xs(i_nuclide) % absorption) + sampled = .false. - prob = prob + micro_xs(i_nuclide) % elastic + prob = micro_xs(i_nuclide) % elastic if (prob > cutoff) then ! ======================================================================= - ! ELASTIC SCATTERING - - if (micro_xs(i_nuclide) % index_sab /= NONE) then - ! S(a,b) scattering - call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, & - p % E, p % coord(1) % uvw, p % mu) + ! NON-S(A,B) ELASTIC SCATTERING + ! Determine temperature + if (nuc % mp_present) then + kT = p % sqrtkT**2 else - ! Determine temperature - if (nuc % mp_present) then - kT = p % sqrtkT**2 - else - kT = nuc % kTs(micro_xs(i_nuclide) % index_temp) - end if - - ! Perform collision physics for elastic scattering - call elastic_scatter(i_nuclide, nuc % reactions(1), kT, & - p % E, p % coord(1) % uvw, p % mu, p % wgt) + kT = nuc % kTs(micro_xs(i_nuclide) % index_temp) end if - p % event_MT = ELASTIC + ! Perform collision physics for elastic scattering + call elastic_scatter(i_nuclide, nuc % reactions(1), kT, p % E, & + p % coord(1) % uvw, p % mu, p % wgt) - else + p % event_MT = ELASTIC + sampled = .true. + end if + + prob = prob + micro_xs(i_nuclide) % scatter_sab + if (prob > cutoff .and. .not. sampled) then + ! ======================================================================= + ! S(A,B) SCATTERING + + call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, p % E, & + p % coord(1) % uvw, p % mu) + + p % event_MT = ELASTIC + sampled = .true. + end if + + if (.not. sampled) then ! ======================================================================= ! INELASTIC SCATTERING @@ -388,7 +396,7 @@ contains if (rx % MT == N_FISSION .or. rx % MT == N_F .or. rx % MT == N_NF & .or. rx % MT == N_2NF .or. rx % MT == N_3NF) cycle - ! some materials have gas production cross sections with MT > 200 that + ! Some materials have gas production cross sections with MT > 200 that ! are duplicates. Also MT=4 is total level inelastic scattering which ! should be skipped if (rx % MT >= 200 .or. rx % MT == N_LEVEL) cycle @@ -406,24 +414,24 @@ contains ! Perform collision physics for inelastic scattering call inelastic_scatter(nuc, nuc%reactions(i), p) - p % event_MT = nuc%reactions(i)%MT + p % event_MT = nuc % reactions(i) % MT end if ! Set event component p % event = EVENT_SCATTER - ! sample new outgoing angle for isotropic in lab scattering + ! Sample new outgoing angle for isotropic in lab scattering if (materials(p % material) % p0(i_nuc_mat)) then - ! sample isotropic-in-lab outgoing direction + ! Sample isotropic-in-lab outgoing direction uvw_new(1) = TWO * prn() - ONE phi = TWO * PI * prn() uvw_new(2) = cos(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) uvw_new(3) = sin(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) p % mu = dot_product(uvw_old, uvw_new) - ! change direction of particle + ! Change direction of particle p % coord(1) % uvw = uvw_new end if @@ -560,7 +568,7 @@ contains ! Determine whether inelastic or elastic scattering will occur if (prn() < micro_xs(i_nuclide) % elastic_sab / & - micro_xs(i_nuclide) % elastic) then + micro_xs(i_nuclide) % scatter_sab) then ! elastic scattering ! Get index and interpolation factor for elastic grid diff --git a/src/tally.F90 b/src/tally.F90 index 0ee041cbe..d827d9bac 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1051,7 +1051,8 @@ contains else if (i_nuclide > 0) then - score = micro_xs(i_nuclide) % elastic * atom_density * flux + score = (micro_xs(i_nuclide) % elastic & + + micro_xs(i_nuclide) % scatter_sab) * atom_density * flux else score = material_xs % elastic * flux end if From efe1457589218a4ec97bb1943e66470d7d0e2133 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 22 Jun 2017 10:49:59 -0500 Subject: [PATCH 049/123] Clear active tally lists --- src/api.F90 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/api.F90 b/src/api.F90 index 287aa63c2..33bb5230d 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -138,6 +138,7 @@ contains end if end do + ! Reset global tallies n_realizations = 0 if (allocated(global_tallies)) then global_tallies(:, :) = ZERO @@ -147,6 +148,17 @@ contains k_abs_tra = ZERO k_sum(:) = ZERO + ! Turn off tally flags + tallies_on = .false. + active_batches = .false. + + ! Clear active tally lists + call active_analog_tallies % clear() + call active_tracklength_tallies % clear() + call active_current_tallies % clear() + call active_collision_tallies % clear() + call active_tallies % clear() + end subroutine openmc_reset !=============================================================================== From 6fec79d9c2a4b166aa9c5099a630a0d2c4cf4a50 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 22 Jun 2017 14:11:33 -0500 Subject: [PATCH 050/123] Add temperature range user option to load cross sections within a range of temperatures. --- docs/source/io_formats/settings.rst | 11 +++++++++++ openmc/settings.py | 23 +++++++++++++++++------ src/global.F90 | 1 + src/input_xml.F90 | 8 ++++++-- src/nuclide_header.F90 | 18 +++++++++++++++--- src/relaxng/settings.rnc | 2 ++ src/relaxng/settings.rng | 8 ++++++++ src/sab_header.F90 | 16 +++++++++++++++- 8 files changed, 75 insertions(+), 12 deletions(-) diff --git a/docs/source/io_formats/settings.rst b/docs/source/io_formats/settings.rst index e9bb5ef53..0aa058cdb 100644 --- a/docs/source/io_formats/settings.rst +++ b/docs/source/io_formats/settings.rst @@ -661,6 +661,17 @@ methods like "nearest" and "interpolation" in the resolved resonance range. *Default*: False +------------------------------- +```` Element +------------------------------- + +The ```` element specifies a minimum and maximum temperature +in Kelvin above and below which cross sections should be loaded for all nuclides +and thermal scattering tables. This can be used for multi-physics simulations +where the temperatures might change from one iteration to the next. + + *Default*: None + .. _temperature_tolerance: ----------------------------------- diff --git a/openmc/settings.py b/openmc/settings.py index b1ff4c0c6..3efdf1ab7 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -125,13 +125,16 @@ class Settings(object): temperature : dict Defines a default temperature and method for treating intermediate temperatures at which nuclear data doesn't exist. Accepted keys are - 'default', 'method', 'tolerance', and 'multipole'. The value for - 'default' should be a float representing the default temperature in + 'default', 'method', 'range', 'tolerance', and 'multipole'. The value + for 'default' should be a float representing the default temperature in Kelvin. The value for 'method' should be 'nearest' or 'interpolation'. If the method is 'nearest', 'tolerance' indicates a range of temperature - within which cross sections may be used. 'multipole' is a boolean - indicating whether or not the windowed multipole method should be used - to evaluate resolved resonance cross sections. + within which cross sections may be used. The value for 'range' should be + a pair a minimum and maximum temperatures which are used to indicate + that cross sections be loaded at all temperatures within the + range. 'multipole' is a boolean indicating whether or not the windowed + multipole method should be used to evaluate resolved resonance cross + sections. threads : int Number of OpenMP threads trace : tuple or list @@ -639,7 +642,8 @@ class Settings(object): cv.check_type('temperature settings', temperature, Mapping) for key, value in temperature.items(): cv.check_value('temperature key', key, - ['default', 'method', 'tolerance', 'multipole']) + ['default', 'method', 'tolerance', 'multipole', + 'range']) if key == 'default': cv.check_type('default temperature', value, Real) elif key == 'method': @@ -649,6 +653,11 @@ class Settings(object): cv.check_type('temperature tolerance', value, Real) elif key == 'multipole': cv.check_type('temperature multipole', value, bool) + elif key == 'range': + cv.check_length('temperature range', value, 2) + for T in value: + cv.check_type('temperature', T, Real) + self._temperature = temperature @threads.setter @@ -999,6 +1008,8 @@ class Settings(object): "temperature_{}".format(key)) if isinstance(value, bool): element.text = str(value).lower() + elif key == 'range': + element.text = ' '.join(str(T) for T in value) else: element.text = str(value) diff --git a/src/global.F90 b/src/global.F90 index 96df26cf6..1574f1f43 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -106,6 +106,7 @@ module global logical :: temperature_multipole = .false. real(8) :: temperature_tolerance = 10.0_8 real(8) :: temperature_default = 293.6_8 + real(8) :: temperature_range(2) = [ZERO, ZERO] ! ============================================================================ ! MULTI-GROUP CROSS SECTION RELATED VARIABLES diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5ff4d119e..cc06e3f81 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -951,6 +951,9 @@ contains if (check_for_node(root, "temperature_multipole")) then call get_node_value(root, "temperature_multipole", temperature_multipole) end if + if (check_for_node(root, "temperature_range")) then + call get_node_array(root, "temperature_range", temperature_range) + end if ! Check for tabular_legendre options if (check_for_node(root, "tabular_legendre")) then @@ -5273,7 +5276,8 @@ contains ! Read nuclide data from HDF5 group_id = open_group(file_id, name) call nuclides(i_nuclide) % from_hdf5(group_id, nuc_temps(i_nuclide), & - temperature_method, temperature_tolerance, master) + temperature_method, temperature_tolerance, temperature_range, & + master) call close_group(group_id) call file_close(file_id) @@ -5325,7 +5329,7 @@ contains ! Read S(a,b) data from HDF5 group_id = open_group(file_id, name) call sab_tables(i_sab) % from_hdf5(group_id, sab_temps(i_sab), & - temperature_method, temperature_tolerance) + temperature_method, temperature_tolerance, temperature_range) call close_group(group_id) call file_close(file_id) diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index ea6eab328..a55e9c841 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -168,12 +168,13 @@ module nuclide_header end subroutine nuclide_clear subroutine nuclide_from_hdf5(this, group_id, temperature, method, tolerance, & - master) + minmax, master) class(Nuclide), intent(inout) :: this integer(HID_T), intent(in) :: group_id - type(VectorReal), intent(in) :: temperature ! list of desired temperatures + type(VectorReal), intent(in) :: temperature ! list of desired temperatures integer, intent(inout) :: method real(8), intent(in) :: tolerance + real(8), intent(in) :: minmax(2) ! range of temperatures logical, intent(in) :: master ! if this is the master proc integer :: i @@ -233,7 +234,18 @@ module nuclide_header method = TEMPERATURE_NEAREST end if - ! Determine actual temperatures to read + ! Determine actual temperatures to read -- start by checking whether a + ! temperature range was given, in which case all temperatures in the range + ! are loaded irrespective of what temperatures actually appear in the model + if (minmax(2) > ZERO) then + do i = 1, size(temps_available) + temp_actual = temps_available(i) + if (minmax(1) <= temp_actual .and. temp_actual <= minmax(2)) then + call temps_to_read % push_back(nint(temp_actual)) + end if + end do + end if + select case (method) case (TEMPERATURE_NEAREST) ! Find nearest temperatures diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index a0f100cd8..23a0cfd4b 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -116,6 +116,8 @@ element settings { element temperature_multipole { xsd:boolean }? & + element temperature_range { list { xsd:double, xsd:double } }? & + element temperature_tolerance { xsd:double }? & element threads { xsd:positiveInteger }? & diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 2a9a170f9..e75dc7c15 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -517,6 +517,14 @@ + + + + + + + + diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 1d64711b8..e0b79f248 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -80,12 +80,14 @@ module sab_header contains - subroutine salphabeta_from_hdf5(this, group_id, temperature, method, tolerance) + subroutine salphabeta_from_hdf5(this, group_id, temperature, method, & + tolerance, minmax) class(SAlphaBeta), intent(inout) :: this integer(HID_T), intent(in) :: group_id type(VectorReal), intent(in) :: temperature ! list of temperatures integer, intent(in) :: method real(8), intent(in) :: tolerance + real(8), intent(in) :: minmax(2) integer :: i, j integer :: t @@ -143,6 +145,18 @@ contains end do call sort(temps_available) + ! Determine actual temperatures to read -- start by checking whether a + ! temperature range was given, in which case all temperatures in the range + ! are loaded irrespective of what temperatures actually appear in the model + if (minmax(2) > ZERO) then + do i = 1, size(temps_available) + temp_actual = temps_available(i) + if (minmax(1) <= temp_actual .and. temp_actual <= minmax(2)) then + call temps_to_read % push_back(nint(temp_actual)) + end if + end do + end if + select case (method) case (TEMPERATURE_NEAREST) ! Determine actual temperatures to read From 182e8107d32fb5f044b00ba279db025bad7a8e1c Mon Sep 17 00:00:00 2001 From: tjlaboss Date: Tue, 27 Jun 2017 08:54:43 -0600 Subject: [PATCH 051/123] Float -> string for ElementTree --- openmc/material.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/material.py b/openmc/material.py index 2c633a5ac..6ac153c86 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -982,7 +982,7 @@ class Material(IDManagerMixin): for sab in self._sab: subelement = ET.SubElement(element, "sab") subelement.set("name", sab[0]) - subelement.set("fraction", sab[1]) + subelement.set("fraction", str(sab[1])) return element From 75af32e01997ed39393b7e9111e06721bd37965b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 28 Jun 2017 22:55:55 -0500 Subject: [PATCH 052/123] Add function to load nuclide cross section at arbitrary point. --- openmc/capi.py | 20 +++++++++++++- src/api.F90 | 66 +++++++++++++++++++++++++++++++++++++++++++++++ src/global.F90 | 4 +++ src/input_xml.F90 | 29 ++++++--------------- 4 files changed, 97 insertions(+), 22 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index 92df0c7ae..790fa1e20 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -1,4 +1,4 @@ -from ctypes import CDLL, c_int, POINTER, byref, c_double +from ctypes import CDLL, c_int, POINTER, byref, c_double, c_char_p import sys from warnings import warn @@ -26,6 +26,8 @@ class _OpenMCLibrary(object): self._dll.openmc_find.restype = c_int self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None + self._dll.openmc_load_nuclide.argtypes = [c_char_p] + self._dll.openmc_load_nuclide.restype = c_int self._dll.openmc_material_get_densities.argtypes = [ c_int, _double_array] self._dll.openmc_material_get_densities.restype = c_int @@ -108,6 +110,22 @@ class _OpenMCLibrary(object): else: return self._dll.openmc_init(None) + def load_nuclide(self, name): + """Load cross section data for a nuclide. + + Parameters + ---------- + name : str + Name of nuclide, e.g. 'U235' + + Returns + ------- + int + Return status (negative if an error occurs). + + """ + return self._dll.openmc_load_nuclide(name.encode()) + def material_get_densities(self, mat_id): """Get atom densities in a material. diff --git a/src/api.F90 b/src/api.F90 index 33bb5230d..cba92da82 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -2,12 +2,17 @@ module openmc_api use, intrinsic :: ISO_C_BINDING + use hdf5, only: HID_T + use constants, only: K_BOLTZMANN use eigenvalue, only: k_sum use finalize, only: openmc_finalize use geometry, only: find_cell use global + use hdf5_interface + use message_passing, only: master use initialize, only: openmc_init + use input_xml, only: assign_0K_elastic_scattering, check_data_version use particle_header, only: Particle use plot, only: openmc_plot_geometry use simulation, only: openmc_run @@ -21,6 +26,7 @@ module openmc_api public :: openmc_init public :: openmc_material_get_densities public :: openmc_material_set_density + public :: openmc_load_nuclide public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run @@ -124,6 +130,66 @@ contains end if end function openmc_find +!=============================================================================== +! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library +!=============================================================================== + + function openmc_load_nuclide(name) result(err) bind(C) + character(kind=C_CHAR) :: name(*) + integer(C_INT) :: err + + integer :: i, n + integer(HID_T) :: file_id, group_id + character(10) :: name_ + real(8) :: minmax(2) = [ZERO, INFINITY] + type(VectorReal) :: temperature + type(Nuclide), allocatable :: new_nuclides(:) + + ! Copy array of C_CHARs to normal Fortran string + name_ = '' + i = 1 + do while (name(i) /= C_NULL_CHAR) + name_(i:i) = name(i) + i = i + 1 + end do + + err = -1 + if (.not. nuclide_dict % has_key(to_lower(name_))) then + if (library_dict % has_key(to_lower(name_))) then + ! allocate extra space in nuclides array + n = n_nuclides_total + allocate(new_nuclides(n + 1)) + new_nuclides(1:n) = nuclides(:) + call move_alloc(FROM=new_nuclides, TO=nuclides) + n = n + 1 + + i_library = library_dict % get_key(to_lower(name_)) + + ! Open file and make sure version is sufficient + file_id = file_open(libraries(i_library) % path, 'r') + call check_data_version(file_id) + + ! Read nuclide data from HDF5 + group_id = open_group(file_id, name_) + call nuclides(n) % from_hdf5(group_id, temperature, & + temperature_method, temperature_tolerance, minmax, & + master) + call close_group(group_id) + call file_close(file_id) + + ! Add entry to nuclide dictionary + call nuclide_dict % add_key(to_lower(name_), n) + n_nuclides_total = n + + ! Assign resonant scattering data + if (res_scat_on) call assign_0K_elastic_scattering(nuclides(n)) + + err = 0 + end if + end if + + end function openmc_load_nuclide + !=============================================================================== ! OPENMC_RESET resets all tallies !=============================================================================== diff --git a/src/global.F90 b/src/global.F90 index 1574f1f43..72628f6d0 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -81,6 +81,10 @@ module global ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict + type(DictCharInt) :: library_dict + + ! Cross section libraries + type(Library), allocatable :: libraries(:) ! ============================================================================ ! CONTINUOUS-ENERGY CROSS SECTION RELATED VARIABLES diff --git a/src/input_xml.F90 b/src/input_xml.F90 index cc06e3f81..09a93d118 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2071,8 +2071,6 @@ contains subroutine read_materials() integer :: i, j - type(DictCharInt) :: library_dict - type(Library), allocatable :: libraries(:) type(VectorReal), allocatable :: nuc_temps(:) ! List of T to read for each nuclide type(VectorReal), allocatable :: sab_temps(:) ! List of T to read for each S(a,b) real(8), allocatable :: material_temps(:) @@ -2161,9 +2159,9 @@ contains ! Now that the cross_sections.xml or mgxs.h5 has been located, read it in if (run_CE) then - call read_ce_cross_sections_xml(libraries) + call read_ce_cross_sections_xml() else - call read_mg_cross_sections_header(libraries) + call read_mg_cross_sections_header() end if ! Creating dictionary that maps the name of the material to the entry @@ -2184,7 +2182,7 @@ contains end if ! Parse data from materials.xml - call read_materials_xml(libraries, library_dict, material_temps) + call read_materials_xml(material_temps) ! Assign temperatures to cells that don't have temperatures already assigned call assign_temperatures(material_temps) @@ -2197,17 +2195,12 @@ contains ! Read continuous-energy cross sections if (run_CE .and. run_mode /= MODE_PLOTTING) then call time_read_xs % start() - call read_ce_cross_sections(libraries, library_dict, nuc_temps, sab_temps) + call read_ce_cross_sections(nuc_temps, sab_temps) call time_read_xs % stop() end if - - ! Clear dictionary - call library_dict % clear() end subroutine read_materials - subroutine read_materials_xml(libraries, library_dict, material_temps) - type(Library), intent(in) :: libraries(:) - type(DictCharInt), intent(inout) :: library_dict + subroutine read_materials_xml(material_temps) real(8), allocatable, intent(out) :: material_temps(:) integer :: i ! loop index for materials @@ -4793,9 +4786,7 @@ contains ! file contains a listing of the CE and MG cross sections that may be used. !=============================================================================== - subroutine read_ce_cross_sections_xml(libraries) - type(Library), allocatable, intent(out) :: libraries(:) - + subroutine read_ce_cross_sections_xml() integer :: i ! loop index integer :: n integer :: n_libraries @@ -4898,9 +4889,7 @@ contains end subroutine read_ce_cross_sections_xml - subroutine read_mg_cross_sections_header(libraries) - type(Library), allocatable, intent(out) :: libraries(:) - + subroutine read_mg_cross_sections_header() integer :: i ! loop index integer :: n_libraries logical :: file_exists ! does mgxs.h5 exist? @@ -5235,9 +5224,7 @@ contains end do end subroutine assign_sab_tables - subroutine read_ce_cross_sections(libraries, library_dict, nuc_temps, sab_temps) - type(Library), intent(in) :: libraries(:) - type(DictCharInt), intent(inout) :: library_dict + subroutine read_ce_cross_sections(nuc_temps, sab_temps) type(VectorReal), intent(in) :: nuc_temps(:) type(VectorReal), intent(in) :: sab_temps(:) From 76f99c2a006fc8f7a674875ed69097c041610929 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 29 Jun 2017 09:58:15 -0500 Subject: [PATCH 053/123] Add material_add_nuclide function to C API (required a little restructuring) --- CMakeLists.txt | 1 - openmc/capi.py | 24 +++++ src/api.F90 | 196 +++++++++++++++++++++++++++++++---------- src/cross_section.F90 | 1 - src/energy_grid.F90 | 67 -------------- src/global.F90 | 3 + src/initialize.F90 | 7 -- src/input_xml.F90 | 11 ++- src/nuclide_header.F90 | 39 ++++++++ src/simulation.F90 | 42 ++++++--- 10 files changed, 252 insertions(+), 139 deletions(-) delete mode 100644 src/energy_grid.F90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f8ce98e4..6dad4851c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -317,7 +317,6 @@ set(LIBOPENMC_FORTRAN_SRC src/endf.F90 src/endf_header.F90 src/energy_distribution.F90 - src/energy_grid.F90 src/error.F90 src/finalize.F90 src/geometry.F90 diff --git a/openmc/capi.py b/openmc/capi.py index 790fa1e20..a4ac38c32 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -28,6 +28,9 @@ class _OpenMCLibrary(object): self._dll.openmc_init.restype = None self._dll.openmc_load_nuclide.argtypes = [c_char_p] self._dll.openmc_load_nuclide.restype = c_int + self._dll.openmc_material_add_nuclide.argtypes = [ + c_int, c_char_p, c_double] + self._dll.openmc_material_add_nuclide.restype = c_int self._dll.openmc_material_get_densities.argtypes = [ c_int, _double_array] self._dll.openmc_material_get_densities.restype = c_int @@ -126,6 +129,27 @@ class _OpenMCLibrary(object): """ return self._dll.openmc_load_nuclide(name.encode()) + def material_add_nuclide(self, mat_id, name, density): + """Add a nuclide to a material. + + Parameters + ---------- + mat_id : int + ID of the material + name : str + Name of nuclide, e.g. 'U235' + density : float + Density in atom/b-cm + + Returns + ------- + int + Return status (negative if an error occurs). + + """ + return self._dll.openmc_material_add_nuclide( + mat_id, name.encode(), density) + def material_get_densities(self, mat_id): """Get atom densities in a material. diff --git a/src/api.F90 b/src/api.F90 index cba92da82..a7a7e3ab4 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -24,6 +24,7 @@ module openmc_api public :: openmc_finalize public :: openmc_find public :: openmc_init + public :: openmc_material_add_nuclide public :: openmc_material_get_densities public :: openmc_material_set_density public :: openmc_load_nuclide @@ -36,44 +37,6 @@ module openmc_api contains - function openmc_material_set_density(id, density) result(err) bind(C) - integer(C_INT), value, intent(in) :: id - real(C_DOUBLE), value, intent(in) :: density - integer(C_INT) :: err - - integer :: i - - err = -1 - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - err = m % set_density(density, nuclides) - end associate - end if - end if - end function openmc_material_set_density - - function openmc_material_get_densities(id, ptr) result(n) bind(C) - integer(C_INT), intent(in), value :: id - type(C_PTR), intent(out) :: ptr - integer(C_INT) :: n - - ptr = C_NULL_PTR - n = 0 - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - if (allocated(m % atom_density)) then - ptr = C_LOC(m % atom_density(1)) - n = size(m % atom_density) - end if - end associate - end if - end if - end function openmc_material_get_densities - !=============================================================================== ! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell !=============================================================================== @@ -138,20 +101,16 @@ contains character(kind=C_CHAR) :: name(*) integer(C_INT) :: err - integer :: i, n - integer(HID_T) :: file_id, group_id - character(10) :: name_ + integer :: n + integer(HID_T) :: file_id + integer(HID_T) :: group_id + character(:), allocatable :: name_ real(8) :: minmax(2) = [ZERO, INFINITY] type(VectorReal) :: temperature type(Nuclide), allocatable :: new_nuclides(:) ! Copy array of C_CHARs to normal Fortran string - name_ = '' - i = 1 - do while (name(i) /= C_NULL_CHAR) - name_(i:i) = name(i) - i = i + 1 - end do + name_ = to_f_string(name) err = -1 if (.not. nuclide_dict % has_key(to_lower(name_))) then @@ -184,12 +143,136 @@ contains ! Assign resonant scattering data if (res_scat_on) call assign_0K_elastic_scattering(nuclides(n)) + ! Initialize nuclide grid + call nuclides(n) % init_grid(energy_min_neutron, & + energy_max_neutron, n_log_bins) + err = 0 + else + err = -2 end if end if end function openmc_load_nuclide +!=============================================================================== +! OPENMC_MATERIAL_ADD_NUCLIDE +!=============================================================================== + + function openmc_material_add_nuclide(id, name, density) result(err) bind(C) + integer(C_INT), value, intent(in) :: id + character(kind=C_CHAR) :: name(*) + real(C_DOUBLE), value, intent(in) :: density + integer(C_INT) :: err + + integer :: i, j, k, n + integer :: err2 + real(8) :: awr + integer, allocatable :: new_nuclide(:) + real(8), allocatable :: new_density(:) + character(:), allocatable :: name_ + + name_ = to_f_string(name) + + err = -1 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + ! Check if nuclide is already in material + do j = 1, size(m % nuclide) + k = m % nuclide(j) + if (nuclides(k) % name == name_) then + awr = nuclides(k) % awr + m % density = m % density + density - m % atom_density(j) + m % density_gpcc = m % density_gpcc + (density - & + m % atom_density(j)) * awr * MASS_NEUTRON / N_AVOGADRO + m % atom_density(j) = density + err = 0 + end if + end do + + ! If nuclide wasn't found, extend nuclide/density arrays + if (err /= 0) then + ! If nuclide hasn't been loaded, load it now + err2 = openmc_load_nuclide(name) + + if (err2 /= -2) then + ! Extend arrays + n = size(m % nuclide) + allocate(new_nuclide(n + 1)) + new_nuclide(1:n) = m % nuclide + call move_alloc(FROM=new_nuclide, TO=m % nuclide) + + allocate(new_density(n + 1)) + new_density(1:n) = m % atom_density + call move_alloc(FROM=new_density, TO=m % atom_density) + + ! Append new nuclide/density + k = nuclide_dict % get_key(to_lower(name_)) + m % nuclide(n + 1) = k + m % atom_density(n + 1) = density + m % density = m % density + density + m % density_gpcc = m % density_gpcc + & + density * nuclides(k) % awr * MASS_NEUTRON / N_AVOGADRO + m % n_nuclides = n + 1 + + err = 0 + end if + end if + end associate + end if + end if + + end function openmc_material_add_nuclide + +!=============================================================================== +! OPENMC_MATERIAL_GET_DENSITIES returns an array of nuclide densities in a +! material +!=============================================================================== + + function openmc_material_get_densities(id, ptr) result(n) bind(C) + integer(C_INT), intent(in), value :: id + type(C_PTR), intent(out) :: ptr + integer(C_INT) :: n + + ptr = C_NULL_PTR + n = 0 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + if (allocated(m % atom_density)) then + ptr = C_LOC(m % atom_density(1)) + n = size(m % atom_density) + end if + end associate + end if + end if + end function openmc_material_get_densities + +!=============================================================================== +! OPENMC_MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm +!=============================================================================== + + function openmc_material_set_density(id, density) result(err) bind(C) + integer(C_INT), value, intent(in) :: id + real(C_DOUBLE), value, intent(in) :: density + integer(C_INT) :: err + + integer :: i + + err = -1 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + err = m % set_density(density, nuclides) + end associate + end if + end if + end function openmc_material_set_density + !=============================================================================== ! OPENMC_RESET resets all tallies !=============================================================================== @@ -306,4 +389,23 @@ contains end if end subroutine openmc_tally_results + function to_f_string(c_string) result(f_string) + character(kind=C_CHAR), intent(in) :: c_string(*) + character(:), allocatable :: f_string + + integer :: i, n + + ! Determine length of original string + n = 0 + do while (c_string(n + 1) /= C_NULL_CHAR) + n = n + 1 + end do + + ! Copy C string character by character + allocate(character(len=n) :: f_string) + do i = 1, n + f_string(i:i) = c_string(i) + end do + end function to_f_string + end module openmc_api diff --git a/src/cross_section.F90 b/src/cross_section.F90 index ce7d97133..28014f773 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -2,7 +2,6 @@ module cross_section use algorithm, only: binary_search use constants - use energy_grid, only: log_spacing use error, only: fatal_error use global use list_header, only: ListElemInt diff --git a/src/energy_grid.F90 b/src/energy_grid.F90 deleted file mode 100644 index 47408943e..000000000 --- a/src/energy_grid.F90 +++ /dev/null @@ -1,67 +0,0 @@ -module energy_grid - - use global - use list_header, only: ListReal - use output, only: write_message - - - implicit none - - integer :: grid_method ! how to treat the energy grid - integer :: n_log_bins ! number of bins for logarithmic grid - real(8) :: log_spacing ! spacing on logarithmic grid - -contains - -!=============================================================================== -! LOGARITHMIC_GRID determines a logarithmic mapping for energies to bounding -! indices on a nuclide energy grid -!=============================================================================== - - subroutine logarithmic_grid() - integer :: i, j, k ! Loop indices - integer :: t ! temperature index - integer :: M ! Number of equally log-spaced bins - real(8) :: E_max ! Maximum energy in MeV - real(8) :: E_min ! Minimum energy in MeV - real(8), allocatable :: umesh(:) ! Equally log-spaced energy grid - - ! Set minimum/maximum energies - E_max = energy_max_neutron - E_min = energy_min_neutron - - ! Determine equal-logarithmic energy spacing - M = n_log_bins - log_spacing = log(E_max/E_min)/M - - ! Create equally log-spaced energy grid - allocate(umesh(0:M)) - umesh(:) = [(i*log_spacing, i=0, M)] - - do i = 1, n_nuclides_total - associate (nuc => nuclides(i)) - do t = 1, size(nuc % grid) - ! Allocate logarithmic mapping for nuclide - allocate(nuc % grid(t) % grid_index(0:M)) - - ! Determine corresponding indices in nuclide grid to energies on - ! equal-logarithmic grid - j = 1 - do k = 0, M - do while (log(nuc % grid(t) % energy(j + 1)/E_min) <= umesh(k)) - ! Ensure that for isotopes where maxval(nuc % energy) << E_max - ! that there are no out-of-bounds issues. - if (j + 1 == size(nuc % grid(t) % energy)) exit - j = j + 1 - end do - nuc % grid(t) % grid_index(k) = j - end do - end do - end associate - end do - - deallocate(umesh) - - end subroutine logarithmic_grid - -end module energy_grid diff --git a/src/global.F90 b/src/global.F90 index 72628f6d0..2690ed151 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -112,6 +112,9 @@ module global real(8) :: temperature_default = 293.6_8 real(8) :: temperature_range(2) = [ZERO, ZERO] + integer :: n_log_bins ! number of bins for logarithmic grid + real(8) :: log_spacing ! spacing on logarithmic grid + ! ============================================================================ ! MULTI-GROUP CROSS SECTION RELATED VARIABLES diff --git a/src/initialize.F90 b/src/initialize.F90 index 329455e81..98f02863e 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -11,7 +11,6 @@ module initialize use constants use dict_header, only: DictIntInt, ElemKeyValueII use set_header, only: SetInt - use energy_grid, only: logarithmic_grid, grid_method use error, only: fatal_error, warning use geometry, only: neighbor_lists, count_instance, calc_offsets, & maximum_levels @@ -109,12 +108,6 @@ contains end if if (run_mode /= MODE_PLOTTING) then - ! Construct information needed for nuclear data - if (run_CE) then - ! Construct log energy grid for cross-sections - call logarithmic_grid() - end if - ! Allocate and setup tally stride, filter_matches, and tally maps call configure_tallies() diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 09a93d118..597b4f4c0 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -7,7 +7,6 @@ module input_xml use distribution_multivariate use distribution_univariate use endf, only: reaction_name - use energy_grid, only: grid_method, n_log_bins use error, only: fatal_error, warning use geometry_header, only: Cell, Lattice, RectLattice, HexLattice, & get_temperatures, root_universe @@ -5240,9 +5239,6 @@ contains allocate(nuclides(n_nuclides_total)) allocate(sab_tables(n_sab_tables)) -!$omp parallel - allocate(micro_xs(n_nuclides_total)) -!$omp end parallel ! Read cross sections do i = 1, size(materials) @@ -5294,6 +5290,13 @@ contains end do end do + ! Set up logarithmic grid for nuclides + do i = 1, size(nuclides) + call nuclides(i) % init_grid(energy_min_neutron, & + energy_max_neutron, n_log_bins) + end do + log_spacing = log(energy_max_neutron/energy_min_neutron) / n_log_bins + do i = 1, size(materials) ! Skip materials with no S(a,b) tables if (.not. allocated(materials(i) % sab_names)) cycle diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index a55e9c841..c03ebee1a 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -97,6 +97,7 @@ module nuclide_header contains procedure :: clear => nuclide_clear procedure :: from_hdf5 => nuclide_from_hdf5 + procedure :: init_grid => nuclide_init_grid procedure :: nu => nuclide_nu procedure, private :: create_derived => nuclide_create_derived end type Nuclide @@ -683,4 +684,42 @@ module nuclide_header end function nuclide_nu + subroutine nuclide_init_grid(this, E_min, E_max, M) + class(Nuclide), intent(inout) :: this + real(8), intent(in) :: E_min ! Minimum energy in MeV + real(8), intent(in) :: E_max ! Maximum energy in MeV + integer, intent(in) :: M ! Number of equally log-spaced bins + + integer :: i, j, k ! Loop indices + integer :: t ! temperature index + real(8) :: spacing + real(8), allocatable :: umesh(:) ! Equally log-spaced energy grid + + ! Determine equal-logarithmic energy spacing + spacing = log(E_max/E_min)/M + + ! Create equally log-spaced energy grid + allocate(umesh(0:M)) + umesh(:) = [(i*spacing, i=0, M)] + + do t = 1, size(this % grid) + ! Allocate logarithmic mapping for nuclide + allocate(this % grid(t) % grid_index(0:M)) + + ! Determine corresponding indices in nuclide grid to energies on + ! equal-logarithmic grid + j = 1 + do k = 0, M + do while (log(this % grid(t) % energy(j + 1)/E_min) <= umesh(k)) + ! Ensure that for isotopes where maxval(this % energy) << E_max + ! that there are no out-of-bounds issues. + if (j + 1 == size(this % grid(t) % energy)) exit + j = j + 1 + end do + this % grid(t) % grid_index(k) = j + end do + end do + + end subroutine nuclide_init_grid + end module nuclide_header diff --git a/src/simulation.F90 b/src/simulation.F90 index 1283752f6..87a17452d 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -42,17 +42,7 @@ contains type(Particle) :: p integer(8) :: i_work - if (.not. restart_run) call initialize_source() - - ! Display header - if (master) then - if (run_mode == MODE_FIXEDSOURCE) then - call header("FIXED SOURCE TRANSPORT SIMULATION", 3) - elseif (run_mode == MODE_EIGENVALUE) then - call header("K EIGENVALUE SIMULATION", 3) - if (verbosity >= 7) call print_columns() - end if - end if + call initialize_simulation() ! Turn on inactive timer call time_inactive % start() @@ -380,12 +370,40 @@ contains end subroutine replay_batch_history +!=============================================================================== +! INITIALIZE_SIMULATION +!=============================================================================== + + subroutine initialize_simulation() + +!$omp parallel + allocate(micro_xs(n_nuclides_total)) +!$omp end parallel + + if (.not. restart_run) call initialize_source() + + ! Display header + if (master) then + if (run_mode == MODE_FIXEDSOURCE) then + call header("FIXED SOURCE TRANSPORT SIMULATION", 3) + elseif (run_mode == MODE_EIGENVALUE) then + call header("K EIGENVALUE SIMULATION", 3) + if (verbosity >= 7) call print_columns() + end if + end if + + end subroutine initialize_simulation + !=============================================================================== ! FINALIZE_SIMULATION calculates tally statistics, writes tallies, and displays ! execution time and results !=============================================================================== - subroutine finalize_simulation + subroutine finalize_simulation() + +!$omp parallel + deallocate(micro_xs) +!$omp end parallel ! Increment total number of generations total_gen = total_gen + n_batches*gen_per_batch From 9a7f9e0dc05de969b13afe833c6f85f418ca0ee7 Mon Sep 17 00:00:00 2001 From: tjlaboss Date: Thu, 29 Jun 2017 09:02:02 -0600 Subject: [PATCH 054/123] Updated test suite to use S(a,b) fraction inputs_true.dat for many of the tests now contain the new syntax --- tests/test_asymmetric_lattice/inputs_true.dat | 18 +++++++++--------- tests/test_diff_tally/inputs_true.dat | 18 +++++++++--------- tests/test_filter_energyfun/inputs_true.dat | 18 +++++++++--------- tests/test_filter_mesh/inputs_true.dat | 18 +++++++++--------- tests/test_iso_in_lab/inputs_true.dat | 18 +++++++++--------- .../test_mgxs_library_ce_to_mg/inputs_true.dat | 2 +- .../test_mgxs_library_condense/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- tests/test_mgxs_library_mesh/inputs_true.dat | 18 +++++++++--------- .../inputs_true.dat | 2 +- .../test_mgxs_library_nuclides/inputs_true.dat | 2 +- tests/test_multipole/inputs_true.dat | 2 +- tests/test_periodic/inputs_true.dat | 2 +- tests/test_tallies/inputs_true.dat | 18 +++++++++--------- tests/test_tally_aggregation/inputs_true.dat | 18 +++++++++--------- tests/test_tally_arithmetic/inputs_true.dat | 18 +++++++++--------- tests/test_tally_slice_merge/inputs_true.dat | 18 +++++++++--------- tests/test_triso/inputs_true.dat | 8 ++++---- tests/test_volume_calc/inputs_true.dat | 2 +- 20 files changed, 103 insertions(+), 103 deletions(-) diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index 672f6bee1..50803105d 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -78,7 +78,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -159,7 +159,7 @@ - + @@ -174,7 +174,7 @@ - + @@ -187,7 +187,7 @@ - + @@ -200,7 +200,7 @@ - + diff --git a/tests/test_diff_tally/inputs_true.dat b/tests/test_diff_tally/inputs_true.dat index ff134bd5c..a2c5638cf 100644 --- a/tests/test_diff_tally/inputs_true.dat +++ b/tests/test_diff_tally/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_filter_energyfun/inputs_true.dat b/tests/test_filter_energyfun/inputs_true.dat index d857451cb..d6f7c1f79 100644 --- a/tests/test_filter_energyfun/inputs_true.dat +++ b/tests/test_filter_energyfun/inputs_true.dat @@ -171,7 +171,7 @@ - + @@ -179,7 +179,7 @@ - + @@ -207,7 +207,7 @@ - + @@ -222,7 +222,7 @@ - + @@ -237,7 +237,7 @@ - + @@ -252,7 +252,7 @@ - + @@ -267,7 +267,7 @@ - + @@ -280,7 +280,7 @@ - + @@ -293,7 +293,7 @@ - + diff --git a/tests/test_filter_mesh/inputs_true.dat b/tests/test_filter_mesh/inputs_true.dat index 6d14f9e7e..153f4dcd9 100644 --- a/tests/test_filter_mesh/inputs_true.dat +++ b/tests/test_filter_mesh/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 098056f5b..2311d8588 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index 8e8cde281..675ef50f1 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index d2f28d0fe..38a40c1cc 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index d7a4a186a..8b6522bdd 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -60,7 +60,7 @@ - + diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index d2f28d0fe..38a40c1cc 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 4756b27bf..8bfcc64b6 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index d2f28d0fe..38a40c1cc 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 826eb5b62..03e3b3ff6 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 0d1fe99bd..4b349ecba 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -25,7 +25,7 @@ - + diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 61958701b..26e700004 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -16,7 +16,7 @@ - + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index a85491e94..664e6e983 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 7a8bf4613..6ef6bdb4d 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index 743ca3c58..e9c156287 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index b1c089c96..2c90e475a 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index fdbc1cb5f..862c2db9a 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -403,12 +403,12 @@ - + - + @@ -420,12 +420,12 @@ - + - + diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 28f1cbd9f..35c866028 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -16,7 +16,7 @@ - + From b3ee0652068025a2902447c480beb7a29c2d976a Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 29 Jun 2017 13:57:25 -0400 Subject: [PATCH 055/123] Add fraction to S(a,b) test; move to PyAPI --- tests/test_salphabeta/geometry.xml | 15 ----- tests/test_salphabeta/inputs_true.dat | 60 ++++++++++++++++++ tests/test_salphabeta/materials.xml | 41 ------------- tests/test_salphabeta/results_true.dat | 2 +- tests/test_salphabeta/settings.xml | 15 ----- tests/test_salphabeta/test_salphabeta.py | 77 +++++++++++++++++++++++- 6 files changed, 136 insertions(+), 74 deletions(-) delete mode 100644 tests/test_salphabeta/geometry.xml create mode 100644 tests/test_salphabeta/inputs_true.dat delete mode 100644 tests/test_salphabeta/materials.xml delete mode 100644 tests/test_salphabeta/settings.xml diff --git a/tests/test_salphabeta/geometry.xml b/tests/test_salphabeta/geometry.xml deleted file mode 100644 index 2b978b914..000000000 --- a/tests/test_salphabeta/geometry.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/tests/test_salphabeta/inputs_true.dat b/tests/test_salphabeta/inputs_true.dat new file mode 100644 index 000000000..c42b90e8c --- /dev/null +++ b/tests/test_salphabeta/inputs_true.dat @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eigenvalue + 1000 + 5 + 0 + + + -4 -4 -4 4 4 4 + + + diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml deleted file mode 100644 index bfe0a6224..000000000 --- a/tests/test_salphabeta/materials.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_salphabeta/results_true.dat b/tests/test_salphabeta/results_true.dat index bdfb98990..e1121bce5 100644 --- a/tests/test_salphabeta/results_true.dat +++ b/tests/test_salphabeta/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.544160E-01 1.274133E-02 +8.403447E-01 2.461538E-02 diff --git a/tests/test_salphabeta/settings.xml b/tests/test_salphabeta/settings.xml deleted file mode 100644 index 70b4e802f..000000000 --- a/tests/test_salphabeta/settings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - eigenvalue - 10 - 5 - 1000 - - - - -4 -4 -4 4 4 4 - - - - diff --git a/tests/test_salphabeta/test_salphabeta.py b/tests/test_salphabeta/test_salphabeta.py index b04fcc6eb..600c70332 100644 --- a/tests/test_salphabeta/test_salphabeta.py +++ b/tests/test_salphabeta/test_salphabeta.py @@ -3,9 +3,82 @@ import os import sys sys.path.insert(0, os.pardir) -from testing_harness import TestHarness + +from testing_harness import PyAPITestHarness +import openmc +import openmc.model + + +def make_model(): + model = openmc.model.Model() + + # Materials + m1 = openmc.Material() + m1.set_density('g/cc', 4.5) + m1.add_nuclide('U235', 1.0) + m1.add_nuclide('H1', 1.0) + m1.add_s_alpha_beta('c_H_in_H2O', fraction=0.5) + + m2 = openmc.Material() + m2.set_density('g/cc', 4.5) + m2.add_nuclide('U235', 1.0) + m2.add_nuclide('C0', 1.0) + m2.add_s_alpha_beta('c_Graphite') + + m3 = openmc.Material() + m3.set_density('g/cc', 4.5) + m3.add_nuclide('U235', 1.0) + m3.add_nuclide('Be9', 1.0) + m3.add_nuclide('O16', 1.0) + m3.add_s_alpha_beta('c_Be_in_BeO') + m3.add_s_alpha_beta('c_O_in_BeO') + + m4 = openmc.Material() + m4.set_density('g/cm3', 5.90168) + m4.add_nuclide('H1', 0.3) + m4.add_nuclide('Zr90', 0.15) + m4.add_nuclide('Zr91', 0.1) + m4.add_nuclide('Zr92', 0.1) + m4.add_nuclide('Zr94', 0.05) + m4.add_nuclide('Zr96', 0.05) + m4.add_nuclide('U235', 0.1) + m4.add_nuclide('U238', 0.15) + m4.add_s_alpha_beta('c_Zr_in_ZrH') + m4.add_s_alpha_beta('c_H_in_ZrH') + + model.materials += [m1, m2, m3, m4] + + # Geometry + x0 = openmc.XPlane(x0=-10, boundary_type='vacuum') + x1 = openmc.XPlane(x0=-5) + x2 = openmc.XPlane(x0=0) + x3 = openmc.XPlane(x0=5) + x4 = openmc.XPlane(x0=10, boundary_type='vacuum') + + root_univ = openmc.Universe() + + surfs = (x0, x1, x2, x3, x4) + mats = (m1, m2, m3, m4) + cells = [] + for i in range(4): + cell = openmc.Cell() + cell.region = +surfs[i] & -surfs[i+1] + cell.fill = mats[i] + root_univ.add_cell(cell) + + model.geometry.root_universe = root_univ + + # Settings + model.settings.batches = 5 + model.settings.inactive = 0 + model.settings.particles = 1000 + model.settings.source = openmc.Source(space=openmc.stats.Box( + [-4, -4, -4], [4, 4, 4])) + + return model if __name__ == '__main__': - harness = TestHarness('statepoint.10.h5') + model = make_model() + harness = PyAPITestHarness('statepoint.5.h5', model) harness.main() From 7ba35310c8da200d896d418933d30237b3c1d414 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 29 Jun 2017 15:49:18 -0400 Subject: [PATCH 056/123] Update docs, RelaxNG for partial S(a,b) --- docs/source/io_formats/materials.rst | 6 +++++- src/relaxng/materials.rnc | 3 ++- src/relaxng/materials.rng | 28 ++++++++++++++++++++-------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/docs/source/io_formats/materials.rst b/docs/source/io_formats/materials.rst index fc57280f8..286342a2b 100644 --- a/docs/source/io_formats/materials.rst +++ b/docs/source/io_formats/materials.rst @@ -107,9 +107,13 @@ Each ``material`` element can have the following attributes or sub-elements: multi-group :ref:`energy_mode`. :sab: - Associates an S(a,b) table with the material. This element has one + Associates an S(a,b) table with the material. This element has an attribute/sub-element called ``name``. The ``name`` attribute is the name of the S(a,b) table that should be associated with the material. + There is also an optional ``fraction`` element which indicates what fraction + of the relevant nuclides will be affected by the S(a,b) table (e.g. which + fraction of a material is crystaline versus amorphus). ``fraction`` + defaults to unity. *Default*: None diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index 4ad3ea0f0..d55656536 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -28,7 +28,8 @@ element materials { }* & element sab { - (element name { xsd:string } | attribute name { xsd:string }) + (element name { xsd:string } | attribute name { xsd:string }) & + (element fraction { xsd:double } | attribute fraction { xsd:double })? }* }+ & diff --git a/src/relaxng/materials.rng b/src/relaxng/materials.rng index 0303d361e..0fa81c11b 100644 --- a/src/relaxng/materials.rng +++ b/src/relaxng/materials.rng @@ -119,14 +119,26 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + From 68070b12ca3f6a0e5ec3354d1600388afcf5ea10 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 3 Jul 2017 15:13:27 -0500 Subject: [PATCH 057/123] Fix allocation of micro_xs in a few places --- src/mgxs_data.F90 | 3 --- src/particle_restart.F90 | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mgxs_data.F90 b/src/mgxs_data.F90 index a43d45c0e..ad20aca83 100644 --- a/src/mgxs_data.F90 +++ b/src/mgxs_data.F90 @@ -73,9 +73,6 @@ contains ! allocate arrays for MGXS storage and cross section cache allocate(nuclides_MG(n_nuclides_total)) -!$omp parallel - allocate(micro_xs(n_nuclides_total)) -!$omp end parallel ! ========================================================================== ! READ ALL MGXS CROSS SECTION TABLES diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index ccf546dd9..4438c48c0 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -32,6 +32,8 @@ contains ! Set verbosity high verbosity = 10 + allocate(micro_xs(n_nuclides_total)) + ! Initialize the particle to be tracked call p % initialize() @@ -57,6 +59,8 @@ contains ! Write output if particle made it call print_particle(p) + deallocate(micro_xs) + end subroutine run_particle_restart !=============================================================================== From 9d456c3ff1f4b72f0c4b1dabf6d5cbf4eaa2b4b7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Jul 2017 14:33:18 -0500 Subject: [PATCH 058/123] Modify openmc_find to return instance as well. Add C API docs --- docs/source/capi/index.rst | 112 ++++++++++++++++++++++++++++++-- docs/source/pythonapi/capi.rst | 10 +++ docs/source/pythonapi/index.rst | 1 + openmc/__init__.py | 2 +- openmc/capi.py | 38 +++++++++-- src/api.F90 | 11 ++-- 6 files changed, 157 insertions(+), 17 deletions(-) create mode 100644 docs/source/pythonapi/capi.rst diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst index f3cdbb840..ae072448d 100644 --- a/docs/source/capi/index.rst +++ b/docs/source/capi/index.rst @@ -4,15 +4,39 @@ C API ===== -.. c:function:: int openmc_find(double* xyz, int rtype) +.. c:function:: void openmc_calculate_voumes() - Return the ID of the cell/material containing a given point + Run a stochastic volume calculation + +.. c:function:: int openmc_cell_set_temperature(int id, double T) + + Set the temperature of a cell. + + :param id: ID of the cell + :type id: int + :param T: Temperature in Kelvin + :type T: double + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: void openmc_finalize() + + Finalize a simulation + +.. c:function:: void openmc_find(double* xyz, int rtype, int* id, int* instance) + + Determine the ID of the cell/material containing a given point :param xyz: Cartesian coordinates :type xyz: double[3] :param rtype: Which ID to return (1=cell, 2=material) :type rtype: int - :rtype: int + :param id: ID of the cell/material found. If a material is requested and the + point is in a void, the ID is 0. If an error occurs, the ID is -1. + :type id: int + :param instance: If a cell is repetaed in the geometry, the instance of the + cell that was found and zero otherwise. + :type instance: int .. c:function:: void openmc_init(int intracomm) @@ -21,9 +45,54 @@ C API :param intracomm: MPI intracommunicator :type intracomm: int -.. c:function:: void openmc_finalize() +.. c:function:: int openmc_load_nuclide(char name[]) - Finalize a simulation + Load data for a nuclide from the HDF5 data library. + + :param name: Name of the nuclide. + :type name: char[] + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_material_add_nuclide(int id, char name[], double density) + + Add a nuclide to an existing material. If the nuclide already exists, the + density is overwritten. + + :param id: ID of the material + :type id: int + :param name: Name of the nuclide + :type name: char[] + :param density: Density in atom/b-cm + :type density: double + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_material_get_densities(int id, double* ptr) + + Get an array of nuclide densities for a material. + + :param id: ID of the material + :type id: int + :param ptr: Pointer to the array of densities + :type ptr: double* + :return: Length of the array + :rtype: int + +.. c:function:: int openmc_material_set_density(int id, double density) + + Set the density of a material. + + :param id: ID of the material + :type id: int + :param density: Density of the material in atom/b-cm + :type density: double + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: void openmc_plot_geometry() + + Run plotting mode. .. c:function:: void openmc_reset() @@ -32,3 +101,36 @@ C API .. c:function:: void openmc_run() Run a simulation + +.. c:function:: int openmc_set_density(double xyz[3], double density) + + Set the density of a material at a given point. + + :param xyz: Cartesian coordinates + :type xyz: double[3] + :param density: Density of the material to set in atom/b-cm + :type density: double + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_set_temperature(double xyz[3], double T) + + Set the density of a cell at a given point. + + :param xyz: Cartesian coordinates + :type xyz: double[3] + :param T: Temperature of the cell to set in Kelvin + :type T: double + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: void openmc_tally_results(int i, double** ptr, int shape_[3]) + + Get a pointer to tally results array. + + :param i: Index in the tallies array + :type i: int + :param ptr: Pointer to the results array + :type ptr: double** + :param shape_: Shape of the results array + :type shape_: int[3] diff --git a/docs/source/pythonapi/capi.rst b/docs/source/pythonapi/capi.rst new file mode 100644 index 000000000..c78c43fd3 --- /dev/null +++ b/docs/source/pythonapi/capi.rst @@ -0,0 +1,10 @@ +--------------------------------------------------- +:data:`openmc.capi` -- Python bindings to the C API +--------------------------------------------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclass.rst + + openmc.capi.OpenMCLibrary diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 5492f362d..bb99dd470 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -47,5 +47,6 @@ Modules mgxs model data + capi examples openmoc diff --git a/openmc/__init__.py b/openmc/__init__.py index 96bcaf6d2..74c991fda 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -27,6 +27,6 @@ from openmc.particle_restart import * from openmc.mixin import * from openmc.plotter import * from openmc.search import * -from openmc.capi import lib +from openmc.capi import lib, OpenMCLibrary __version__ = '0.9.0' diff --git a/openmc/capi.py b/openmc/capi.py index a4ac38c32..2df55abce 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -12,7 +12,20 @@ _double3 = c_double*3 _double_array = POINTER(POINTER(c_double)) -class _OpenMCLibrary(object): +class OpenMCLibrary(object): + """Provides bindings to C functions defined by OpenMC shared library. + + This class is normally not directly instantiated. Instead, when the + :mod:`openmc` package is imported, an instance is automatically created with + the name :data:`openmc.lib`. Calls to the OpenMC can then be made using that + instance, for example: + + .. code-block:: python + + openmc.lib.init() + openmc.lib.run() + + """ def __init__(self, filename): self._dll = CDLL(filename) @@ -22,8 +35,9 @@ class _OpenMCLibrary(object): c_int, c_double] self._dll.openmc_cell_set_temperature.restype = c_int self._dll.openmc_finalize.restype = None - self._dll.openmc_find.argtypes = [POINTER(_double3), c_int] - self._dll.openmc_find.restype = c_int + self._dll.openmc_find.argtypes = [ + POINTER(_double3), c_int, POINTER(c_int), POINTER(c_int)] + self._dll.openmc_find.restype = None self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None self._dll.openmc_load_nuclide.argtypes = [c_char_p] @@ -61,6 +75,7 @@ class _OpenMCLibrary(object): ID of the cell T : float Temperature in K + """ return self._dll.openmc_cell_set_temperature(cell_id, T) @@ -83,16 +98,25 @@ class _OpenMCLibrary(object): int or None ID of the cell or material. If 'material' is requested and no material exists at the given coordinate, None is returned. + int + If the cell at the given point is repeated in the geometry, this + indicates which instance it is, i.e., 0 would be the first instance. """ + # Set second argument to openmc_find if rtype == 'cell': - return self._dll.openmc_find(_double3(*xyz), 1) + r_int = 1 elif rtype == 'material': - uid = self._dll.openmc_find(_double3(*xyz), 2) - return uid if uid != 0 else None + r_int = 2 else: raise ValueError('Unknown return type: {}'.format(rtype)) + # Call openmc_find + uid = c_int() + instance = c_int() + self._dll.openmc_find(_double3(*xyz), r_int, byref(uid), byref(instance)) + return (uid.value if uid != 0 else None), instance.value + def init(self, intracomm=None): """Initialize OpenMC @@ -278,7 +302,7 @@ else: filename = pkg_resources.resource_filename( __name__, '_libopenmc.{}'.format(suffix)) try: - lib = _OpenMCLibrary(filename) + lib = OpenMCLibrary(filename) except OSError: warn("OpenMC shared library is not available from the Python API. This " "means you will not be able to use openmc.lib to make in-memory " diff --git a/src/api.F90 b/src/api.F90 index a7a7e3ab4..c0ee84594 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -24,10 +24,10 @@ module openmc_api public :: openmc_finalize public :: openmc_find public :: openmc_init + public :: openmc_load_nuclide public :: openmc_material_add_nuclide public :: openmc_material_get_densities public :: openmc_material_set_density - public :: openmc_load_nuclide public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run @@ -66,10 +66,11 @@ contains ! OPENMC_FIND determines the ID or a cell or material at a given point in space !=============================================================================== - function openmc_find(xyz, rtype) result(id) bind(C) + subroutine openmc_find(xyz, rtype, id, instance) bind(C) real(C_DOUBLE), intent(in) :: xyz(3) ! Cartesian point integer(C_INT), intent(in), value :: rtype ! 1 for cell, 2 for material - integer(C_INT) :: id + integer(C_INT), intent(out) :: id + integer(C_INT), intent(out) :: instance logical :: found type(Particle) :: p @@ -80,6 +81,7 @@ contains call find_cell(p, found) id = -1 + instance = -1 if (found) then if (rtype == 1) then id = cells(p % coord(p % n_coord) % cell) % id @@ -90,8 +92,9 @@ contains id = materials(p % material) % id end if end if + instance = p % cell_instance end if - end function openmc_find + end subroutine openmc_find !=============================================================================== ! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library From 14226862f33dbc1e3829b762df35e9ee3f556906 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Jul 2017 14:44:21 -0500 Subject: [PATCH 059/123] Have openmc_tally_results accept ID instead of array index --- docs/source/capi/index.rst | 6 +++--- src/api.F90 | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst index ae072448d..c932bcde9 100644 --- a/docs/source/capi/index.rst +++ b/docs/source/capi/index.rst @@ -124,12 +124,12 @@ C API :return: Return status (negative if an error occurs) :rtype: int -.. c:function:: void openmc_tally_results(int i, double** ptr, int shape_[3]) +.. c:function:: void openmc_tally_results(int id, double** ptr, int shape_[3]) Get a pointer to tally results array. - :param i: Index in the tallies array - :type i: int + :param id: ID of the tally + :type id: int :param ptr: Pointer to the results array :type ptr: double** :param shape_: Shape of the results array diff --git a/src/api.F90 b/src/api.F90 index c0ee84594..72879f41f 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -376,14 +376,17 @@ contains ! directly. !=============================================================================== - subroutine openmc_tally_results(i, ptr, shape_) bind(C) - integer(C_INT), intent(in), value :: i + subroutine openmc_tally_results(id, ptr, shape_) bind(C) + integer(C_INT), intent(in), value :: id type(C_PTR), intent(out) :: ptr integer(C_INT), intent(out) :: shape_(3) + integer :: i + ptr = C_NULL_PTR if (allocated(tallies)) then - if (i >= 1 .and. i <= size(tallies)) then + if (tally_dict % has_key(id)) then + i = tally_dict % get_key(id) if (allocated(tallies(i) % results)) then ptr = C_LOC(tallies(i) % results(1,1,1)) shape_(:) = shape(tallies(i) % results) From 712352c8e1bc9cf427c223838f84b331aa0d140e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Jul 2017 15:06:33 -0500 Subject: [PATCH 060/123] Add optional instance argument for openmc_cell_set_temperature --- docs/source/capi/index.rst | 5 ++++- openmc/capi.py | 11 +++++++++-- src/api.F90 | 19 ++++++++++++++----- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst index c932bcde9..4cc195ef2 100644 --- a/docs/source/capi/index.rst +++ b/docs/source/capi/index.rst @@ -8,7 +8,7 @@ C API Run a stochastic volume calculation -.. c:function:: int openmc_cell_set_temperature(int id, double T) +.. c:function:: int openmc_cell_set_temperature(int id, double T, int* instance) Set the temperature of a cell. @@ -16,6 +16,9 @@ C API :type id: int :param T: Temperature in Kelvin :type T: double + :param instance: Which instance of the cell. To set the temperature for all + instances, pass a null pointer. + :type instance: int* :return: Return status (negative if an error occurred) :rtype: int diff --git a/openmc/capi.py b/openmc/capi.py index 2df55abce..ea6f1e7c9 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -66,7 +66,7 @@ class OpenMCLibrary(object): """Run stochastic volume calculation""" return self._dll.openmc_calculate_volumes() - def cell_set_temperature(self, cell_id, T): + def cell_set_temperature(self, cell_id, T, instance=None): """Set the temperature of a cell Parameters @@ -75,9 +75,16 @@ class OpenMCLibrary(object): ID of the cell T : float Temperature in K + instance : int or None + Which instance of the cell """ - return self._dll.openmc_cell_set_temperature(cell_id, T) + if instance is not None: + return self._dll.openmc_cell_set_temperature( + cell_id, T, byref(c_int(instance))) + else: + return self._dll.openmc_cell_set_temperature(cell_id, T, None) + def finalize(self): """Finalize simulation and free memory""" diff --git a/src/api.F90 b/src/api.F90 index 72879f41f..444dc71f9 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -41,12 +41,13 @@ contains ! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell !=============================================================================== - function openmc_cell_set_temperature(id, T) result(err) bind(C) + function openmc_cell_set_temperature(id, T, instance) result(err) bind(C) integer(C_INT), value, intent(in) :: id ! id of cell real(C_DOUBLE), value, intent(in) :: T + integer(C_INT), optional, intent(in) :: instance integer(C_INT) :: err - integer :: i + integer :: i, n err = -1 if (allocated(cells)) then @@ -54,8 +55,16 @@ contains i = cell_dict % get_key(id) associate (c => cells(i)) if (allocated(c % sqrtkT)) then - c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) - err = 0 + n = size(c % sqrtkT) + if (present(instance) .and. n > 1) then + if (instance >= 0 .and. instance < n) then + c % sqrtkT(instance + 1) = sqrt(K_BOLTZMANN * T) + err = 0 + end if + else + c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) + err = 0 + end if end if end associate end if @@ -92,7 +101,7 @@ contains id = materials(p % material) % id end if end if - instance = p % cell_instance + instance = p % cell_instance - 1 end if end subroutine openmc_find From e52d5dc0a2d65fcd6f5496f15a7da402e0cc80d0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Jul 2017 15:52:37 -0500 Subject: [PATCH 061/123] Remove use of byref (ctypes is smart enough to pass by reference) --- openmc/capi.py | 12 ++++++------ src/geometry.F90 | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index ea6f1e7c9..74af8c003 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -1,4 +1,4 @@ -from ctypes import CDLL, c_int, POINTER, byref, c_double, c_char_p +from ctypes import CDLL, c_int, POINTER, c_double, c_char_p import sys from warnings import warn @@ -81,7 +81,7 @@ class OpenMCLibrary(object): """ if instance is not None: return self._dll.openmc_cell_set_temperature( - cell_id, T, byref(c_int(instance))) + cell_id, T, c_int(instance)) else: return self._dll.openmc_cell_set_temperature(cell_id, T, None) @@ -121,7 +121,7 @@ class OpenMCLibrary(object): # Call openmc_find uid = c_int() instance = c_int() - self._dll.openmc_find(_double3(*xyz), r_int, byref(uid), byref(instance)) + self._dll.openmc_find(_double3(*xyz), r_int, uid, instance) return (uid.value if uid != 0 else None), instance.value def init(self, intracomm=None): @@ -140,7 +140,7 @@ class OpenMCLibrary(object): intracomm = intracomm.py2f() except AttributeError: pass - return self._dll.openmc_init(byref(c_int(intracomm))) + return self._dll.openmc_init(c_int(intracomm)) else: return self._dll.openmc_init(None) @@ -196,7 +196,7 @@ class OpenMCLibrary(object): """ data = POINTER(c_double)() - n = self._dll.openmc_material_get_densities(mat_id, byref(data)) + n = self._dll.openmc_material_get_densities(mat_id, data) if data: return as_array(data, (n,)) else: @@ -284,7 +284,7 @@ class OpenMCLibrary(object): """ data = POINTER(c_double)() shape = _int3() - self._dll.openmc_tally_results(tally_id, byref(data), byref(shape)) + self._dll.openmc_tally_results(tally_id, data, shape) if data: return as_array(data, tuple(shape[::-1])) else: diff --git a/src/geometry.F90 b/src/geometry.F90 index fbbe75a18..444456232 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -283,6 +283,8 @@ contains ! Keep track of which instance of the cell the particle is in p % cell_instance = offset + 1 + else + p % cell_instance = 1 end if ! Save the material From 397511fc0d32147fa179bdc9933b68f414a78041 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 6 Jul 2017 21:11:39 -0500 Subject: [PATCH 062/123] Add scipy modules to mock modules for doc build --- docs/source/conf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index c3434914b..59928c5e1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -25,8 +25,9 @@ except ImportError: MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial', - 'h5py', 'pandas', 'uncertainties', 'openmoc', - 'openmc.data.reconstruct'] + 'scipy', 'scipy.sparse', 'scipy.interpolate', 'scipy.integrate', + 'scipy.optimize', 'scipy.special', 'h5py', 'pandas', + 'uncertainties', 'openmoc', 'openmc.data.reconstruct'] sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES) import numpy as np From 8dcd8dd4f0d20c1e8a1729b0fa699ecfa24ad52e Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 7 Jul 2017 15:55:19 -0400 Subject: [PATCH 063/123] Fix spelling errors --- docs/source/io_formats/materials.rst | 2 +- openmc/material.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/io_formats/materials.rst b/docs/source/io_formats/materials.rst index 286342a2b..5f0aa3a5e 100644 --- a/docs/source/io_formats/materials.rst +++ b/docs/source/io_formats/materials.rst @@ -112,7 +112,7 @@ Each ``material`` element can have the following attributes or sub-elements: is the name of the S(a,b) table that should be associated with the material. There is also an optional ``fraction`` element which indicates what fraction of the relevant nuclides will be affected by the S(a,b) table (e.g. which - fraction of a material is crystaline versus amorphus). ``fraction`` + fraction of a material is crystalline versus amorphous). ``fraction`` defaults to unity. *Default*: None diff --git a/openmc/material.py b/openmc/material.py index 6ac153c86..24cd3343a 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -628,7 +628,7 @@ class Material(IDManagerMixin): fraction : float The fraction of relevant nuclei that are affected by the :math:`S(\alpha,\beta)` table. For example, if the material is a - block of carbon that is 60% graphite and 40% amorphus then add a + block of carbon that is 60% graphite and 40% amorphous then add a graphite :math:`S(\alpha,\beta)` table with fraction=0.6. """ From 477a46f7f7b6b176d5231eb57d02186d05f88aa4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Jul 2017 10:36:39 -0500 Subject: [PATCH 064/123] Update versions of MPICH and HDF5 in travis_install.sh --- tests/travis_install.sh | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/travis_install.sh b/tests/travis_install.sh index 2e35c4f65..d32101214 100755 --- a/tests/travis_install.sh +++ b/tests/travis_install.sh @@ -4,36 +4,36 @@ set -ev # Build MPICH if [[ ! -e $HOME/mpich_install/bin/mpiexec ]]; then - wget -q http://www.mpich.org/static/downloads/3.1.3/mpich-3.1.3.tar.gz - tar -xzvf mpich-3.1.3.tar.gz >/dev/null 2>&1 - cd mpich-3.1.3 + wget -q http://www.mpich.org/static/downloads/3.2/mpich-3.2.tar.gz + tar -xzvf mpich-3.2.tar.gz >/dev/null 2>&1 + cd mpich-3.2 ./configure --prefix=$HOME/mpich_install -q - make -j 2 >/dev/null 2>&1 - make install >/dev/null 2>&1 + make -j 2 &> /dev/null + make install &> /dev/null cd .. fi # Build PHDF5 if [[ ! -e $HOME/phdf5_install/bin/h5pfc ]]; then - wget -q http://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.15/src/hdf5-1.8.15.tar.gz - tar -xzvf hdf5-1.8.15.tar.gz >/dev/null 2>&1 - mv hdf5-1.8.15 phdf5-1.8.15; cd phdf5-1.8.15 + wget -q https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.1/src/hdf5-1.10.1.tar.bz2 + tar -xjf hdf5-1.10.1.tar.bz2 + mv hdf5-1.10.1 phdf5-1.10.1 + cd phdf5-1.10.1 CC=$HOME/mpich_install/bin/mpicc FC=$HOME/mpich_install/bin/mpif90 \ - ./configure \ - --prefix=$HOME/phdf5_install -q --enable-fortran \ - --enable-fortran2003 --enable-parallel - make -j 2 >/dev/null 2>&1 - make install >/dev/null 2>&1 + ./configure --prefix=$HOME/phdf5_install -q \ + --enable-fortran --enable-parallel + make -j 2 &> /dev/null + make install &> /dev/null cd .. fi # Build HDF5 if [[ ! -e $HOME/hdf5_install/bin/h5fc ]]; then - tar -xzvf hdf5-1.8.15.tar.gz >/dev/null 2>&1 - cd hdf5-1.8.15 + tar -xjf hdf5-1.10.1.tar.bz2 + cd hdf5-1.10.1 CC=gcc FC=gfortran ./configure --prefix=$HOME/hdf5_install -q \ - --enable-fortran --enable-fortran2003 - make -j 2 >/dev/null 2>&1 - make install >/dev/null 2>&1 + --enable-fortran + make -j 2 &> /dev/null + make install &> /dev/null cd .. fi From 42b2999ae433e3eb1f89cb0a302be19e7f59c2de Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Jul 2017 11:20:39 -0500 Subject: [PATCH 065/123] Raise fatal error if user is using outdated format for tallies.xml Now that filters are separate elements in the XML, if you run with a tallies.xml file where appears under , it is simply ignored and the simulation proceeds as though no filters were specified at all. --- src/input_xml.F90 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5ff4d119e..3e1370843 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3362,6 +3362,15 @@ contains ! ======================================================================= ! READ DATA FOR FILTERS + ! Check if user is using old XML format and throw an error if so + if (check_for_node(node_tal, "filter")) then + call fatal_error("Tally filters must be specified independently of & + &tallies in a element. The element itself should & + &have a list of filters that apply, e.g., 1 2 & + &where 1 and 2 are the IDs of filters specified outside of & + &.") + end if + ! Determine number of filters if (check_for_node(node_tal, "filters")) then n_filter = node_word_count(node_tal, "filters") From 17a3fbc9a98e996ad5d619bf97366329819bd50b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Jul 2017 12:41:00 -0500 Subject: [PATCH 066/123] Use MPICH from package manager --- .travis.yml | 7 ++++--- tests/travis_install.sh | 13 +------------ 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index c1d3c86b2..b842b3bb1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,9 +9,10 @@ addons: packages: - gfortran - g++ + - mpich + - libmpich-dev cache: directories: - - $HOME/mpich_install - $HOME/hdf5_install - $HOME/phdf5_install - $HOME/nndc_hdf5 @@ -32,10 +33,10 @@ before_install: - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION six numpy scipy h5py=2.5 pandas - source activate test-environment - # Install GCC, MPICH, HDF5, PHDF5 + # Install GCC, HDF5, PHDF5 - ./tests/travis_install.sh - export FC=gfortran - - export MPI_DIR=$HOME/mpich_install + - export MPI_DIR=/usr - export PHDF5_DIR=$HOME/phdf5_install - export HDF5_DIR=$HOME/hdf5_install diff --git a/tests/travis_install.sh b/tests/travis_install.sh index d32101214..02f84fd3e 100755 --- a/tests/travis_install.sh +++ b/tests/travis_install.sh @@ -2,24 +2,13 @@ set -ev -# Build MPICH -if [[ ! -e $HOME/mpich_install/bin/mpiexec ]]; then - wget -q http://www.mpich.org/static/downloads/3.2/mpich-3.2.tar.gz - tar -xzvf mpich-3.2.tar.gz >/dev/null 2>&1 - cd mpich-3.2 - ./configure --prefix=$HOME/mpich_install -q - make -j 2 &> /dev/null - make install &> /dev/null - cd .. -fi - # Build PHDF5 if [[ ! -e $HOME/phdf5_install/bin/h5pfc ]]; then wget -q https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.1/src/hdf5-1.10.1.tar.bz2 tar -xjf hdf5-1.10.1.tar.bz2 mv hdf5-1.10.1 phdf5-1.10.1 cd phdf5-1.10.1 - CC=$HOME/mpich_install/bin/mpicc FC=$HOME/mpich_install/bin/mpif90 \ + CC=/usr/bin/mpicc FC=/usr/bin/mpif90 \ ./configure --prefix=$HOME/phdf5_install -q \ --enable-fortran --enable-parallel make -j 2 &> /dev/null From 653b7b89db7f19ebf6108f776d5e71caa2d8654f Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Jul 2017 12:59:10 -0500 Subject: [PATCH 067/123] Try using HDF5 1.8.19 instead of 1.10.1 --- tests/travis_install.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/travis_install.sh b/tests/travis_install.sh index 02f84fd3e..7339a6605 100755 --- a/tests/travis_install.sh +++ b/tests/travis_install.sh @@ -4,13 +4,13 @@ set -ev # Build PHDF5 if [[ ! -e $HOME/phdf5_install/bin/h5pfc ]]; then - wget -q https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.1/src/hdf5-1.10.1.tar.bz2 - tar -xjf hdf5-1.10.1.tar.bz2 - mv hdf5-1.10.1 phdf5-1.10.1 - cd phdf5-1.10.1 + wget -q https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.19/src/hdf5-1.8.19.tar.bz2 + tar -xjf hdf5-1.8.19.tar.bz2 + mv hdf5-1.8.19 phdf5-1.8.19 + cd phdf5-1.8.19 CC=/usr/bin/mpicc FC=/usr/bin/mpif90 \ ./configure --prefix=$HOME/phdf5_install -q \ - --enable-fortran --enable-parallel + --enable-fortran --enable-fortran2003 --enable-parallel make -j 2 &> /dev/null make install &> /dev/null cd .. @@ -18,10 +18,10 @@ fi # Build HDF5 if [[ ! -e $HOME/hdf5_install/bin/h5fc ]]; then - tar -xjf hdf5-1.10.1.tar.bz2 - cd hdf5-1.10.1 + tar -xjf hdf5-1.8.19.tar.bz2 + cd hdf5-1.8.19 CC=gcc FC=gfortran ./configure --prefix=$HOME/hdf5_install -q \ - --enable-fortran + --enable-fortran --enable-fortran2003 make -j 2 &> /dev/null make install &> /dev/null cd .. From e2fcd68d1f4dffaa739fe3f6bda98d6913146e2b Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 10 Jul 2017 14:43:18 -0400 Subject: [PATCH 068/123] Fatal error for nuclides in multiple S(a,b) tables --- src/input_xml.F90 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 2e7219a31..ef742ed45 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5193,6 +5193,19 @@ contains end if end do ASSIGN_SAB + ! Make sure each nuclide only appears in one table. + do j = 1, i_sab_nuclides % size() + do k = j+1, i_sab_nuclides % size() + if (i_sab_nuclides % data(j) == i_sab_nuclides % data(k)) then + call fatal_error(trim( & + nuclides(mat % nuclide(i_sab_nuclides % data(j))) % name) & + // " in material " // trim(to_str(mat % id)) // " was found & + &in multiple S(a,b) tables. Each nuclide can only appear in & + &one S(a,b) table per material.") + end if + end do + end do + ! Update i_sab_tables and i_sab_nuclides deallocate(mat % i_sab_tables) deallocate(mat % sab_fracs) From 786bb5bc6cd36369e75915d171df33a113d98e7b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 10 Jul 2017 14:55:16 -0500 Subject: [PATCH 069/123] Use a PPA to install HDF5 and PHDF5 on Travis --- .travis.yml | 10 +++++----- CMakeLists.txt | 10 ++++++---- tests/run_tests.py | 11 +++++++++-- tests/travis_install.sh | 28 ---------------------------- 4 files changed, 20 insertions(+), 39 deletions(-) delete mode 100755 tests/travis_install.sh diff --git a/.travis.yml b/.travis.yml index b842b3bb1..fcefaa8f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,8 +13,6 @@ addons: - libmpich-dev cache: directories: - - $HOME/hdf5_install - - $HOME/phdf5_install - $HOME/nndc_hdf5 before_install: @@ -34,11 +32,13 @@ before_install: - source activate test-environment # Install GCC, HDF5, PHDF5 - - ./tests/travis_install.sh + - sudo add-apt-repository ppa:nschloe/hdf5-backports -y + - sudo apt-get update -q + - sudo apt-get install libhdf5-serial-dev libhdf5-mpich-dev -y - export FC=gfortran - export MPI_DIR=/usr - - export PHDF5_DIR=$HOME/phdf5_install - - export HDF5_DIR=$HOME/hdf5_install + - export PHDF5_DIR=/usr + - export HDF5_DIR=/usr install: true diff --git a/CMakeLists.txt b/CMakeLists.txt index 19d2d3886..7b07b3c48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,10 +62,12 @@ endif() # this, we check for the environment variable HDF5_ROOT and if it exists, use it # to check whether its a parallel version. -if(DEFINED ENV{HDF5_ROOT} AND EXISTS $ENV{HDF5_ROOT}/bin/h5pcc) - set(HDF5_PREFER_PARALLEL TRUE) -else() - set(HDF5_PREFER_PARALLEL FALSE) +if(NOT DEFINED HDF5_PREFER_PARALLEL) + if(DEFINED ENV{HDF5_ROOT} AND EXISTS $ENV{HDF5_ROOT}/bin/h5pcc) + set(HDF5_PREFER_PARALLEL TRUE) + else() + set(HDF5_PREFER_PARALLEL FALSE) + endif() endif() find_package(HDF5 COMPONENTS Fortran_HL) diff --git a/tests/run_tests.py b/tests/run_tests.py index 2d9112e92..cd6c02607 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -188,6 +188,10 @@ class Test(object): build_str += "-Dopenmp=OFF " if self.coverage: build_str += "-Dcoverage=ON " + if self.phdf5: + build_str += "-DHDF5_PREFER_PARALLEL=ON " + else: + build_str += "-DHDF5_PREFER_PARALLEL=OFF " self.build_opts = build_str return self.build_opts @@ -214,6 +218,9 @@ class Test(object): # Runs cmake when in non-script mode def run_cmake(self): + build_opts = self.build_opts.split() + self.cmake += build_opts + os.environ['FC'] = self.fc os.environ['CC'] = self.cc os.environ['CXX'] = self.cxx @@ -221,10 +228,10 @@ class Test(object): os.environ['MPI_DIR'] = MPI_DIR if self.phdf5: os.environ['HDF5_ROOT'] = PHDF5_DIR + self.cmake.append('-DHDF5_PREFER_PARALLEL=ON') else: os.environ['HDF5_ROOT'] = HDF5_DIR - build_opts = self.build_opts.split() - self.cmake += build_opts + self.cmake.append('-DHDF5_PREFER_PARALLEL=OFF') rc = call(self.cmake) if rc != 0: self.success = False diff --git a/tests/travis_install.sh b/tests/travis_install.sh deleted file mode 100755 index 7339a6605..000000000 --- a/tests/travis_install.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -set -ev - -# Build PHDF5 -if [[ ! -e $HOME/phdf5_install/bin/h5pfc ]]; then - wget -q https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.19/src/hdf5-1.8.19.tar.bz2 - tar -xjf hdf5-1.8.19.tar.bz2 - mv hdf5-1.8.19 phdf5-1.8.19 - cd phdf5-1.8.19 - CC=/usr/bin/mpicc FC=/usr/bin/mpif90 \ - ./configure --prefix=$HOME/phdf5_install -q \ - --enable-fortran --enable-fortran2003 --enable-parallel - make -j 2 &> /dev/null - make install &> /dev/null - cd .. -fi - -# Build HDF5 -if [[ ! -e $HOME/hdf5_install/bin/h5fc ]]; then - tar -xjf hdf5-1.8.19.tar.bz2 - cd hdf5-1.8.19 - CC=gcc FC=gfortran ./configure --prefix=$HOME/hdf5_install -q \ - --enable-fortran --enable-fortran2003 - make -j 2 &> /dev/null - make install &> /dev/null - cd .. -fi From 8e67c6f0050411b416408c6d46b26ddbd552105f Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 11 Jul 2017 14:19:05 -0500 Subject: [PATCH 070/123] Run ctest in normal mode. Remove phdf5-omp-debug configuration. --- tests/travis.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/travis.sh b/tests/travis.sh index 443e951cc..2dc352834 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -5,7 +5,7 @@ set -ev # Run all debug tests ./check_source.py if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - ./run_tests.py -C "^hdf5-debug$|^omp-hdf5-debug|^mpi-hdf5-debug|^phdf5-debug$|^phdf5-omp-debug$" -j 2 -s + ./run_tests.py -C "^hdf5-debug$|^omp-hdf5-debug|^mpi-hdf5-debug|^phdf5-debug$" -j 2 else ./run_tests.py -C "^hdf5-debug$" -j 2 fi From 27d1a1b56251e1bca366ad3191ba584a3df11244 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 12 Jul 2017 11:40:21 -0400 Subject: [PATCH 071/123] Fix sorting of S(a,b) fractions --- src/input_xml.F90 | 6 +++++- tests/test_salphabeta/results_true.dat | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3aae18f19..aa41dc4b5 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5167,6 +5167,7 @@ contains integer :: m ! position for sorting integer :: temp_nuclide ! temporary value for sorting integer :: temp_table ! temporary value for sorting + real(8) :: temp_frac ! temporary value for sorting logical :: found type(VectorInt) :: i_sab_tables type(VectorInt) :: i_sab_nuclides @@ -5224,7 +5225,7 @@ contains allocate(mat % sab_fracs(m)) mat % i_sab_tables(:) = i_sab_tables % data(1:m) mat % i_sab_nuclides(:) = i_sab_nuclides % data(1:m) - mat % sab_fracs = sab_fracs % data(1:m) + mat % sab_fracs(:) = sab_fracs % data(1:m) ! Clear entries in vectors for next material call i_sab_tables % clear() @@ -5242,6 +5243,7 @@ contains m = k temp_nuclide = mat % i_sab_nuclides(k) temp_table = mat % i_sab_tables(k) + temp_frac = mat % i_sab_tables(k) MOVE_OVER: do ! Check if insertion value is greater than (m-1)th value @@ -5250,6 +5252,7 @@ contains ! Move values over until hitting one that's not larger mat % i_sab_nuclides(m) = mat % i_sab_nuclides(m-1) mat % i_sab_tables(m) = mat % i_sab_tables(m-1) + mat % sab_fracs(m) = mat % sab_fracs(m-1) m = m - 1 ! Exit if we've reached the beginning of the list @@ -5259,6 +5262,7 @@ contains ! Put the original value into its new position mat % i_sab_nuclides(m) = temp_nuclide mat % i_sab_tables(m) = temp_table + mat % sab_fracs(m) = temp_frac end do SORT_SAB end if diff --git a/tests/test_salphabeta/results_true.dat b/tests/test_salphabeta/results_true.dat index e1121bce5..2a99303f6 100644 --- a/tests/test_salphabeta/results_true.dat +++ b/tests/test_salphabeta/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.403447E-01 2.461538E-02 +8.447580E-01 1.806149E-02 From 391cb442ef22984af7459ab60e485a313f06693b Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 12 Jul 2017 11:53:50 -0400 Subject: [PATCH 072/123] Only put S(a,b) fraction in XML if not unity --- openmc/material.py | 3 ++- tests/test_asymmetric_lattice/inputs_true.dat | 18 +++++++++--------- tests/test_diff_tally/inputs_true.dat | 18 +++++++++--------- tests/test_filter_energyfun/inputs_true.dat | 18 +++++++++--------- tests/test_filter_mesh/inputs_true.dat | 18 +++++++++--------- tests/test_iso_in_lab/inputs_true.dat | 18 +++++++++--------- .../test_mgxs_library_ce_to_mg/inputs_true.dat | 2 +- .../test_mgxs_library_condense/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- tests/test_mgxs_library_mesh/inputs_true.dat | 18 +++++++++--------- .../inputs_true.dat | 2 +- .../test_mgxs_library_nuclides/inputs_true.dat | 2 +- tests/test_multipole/inputs_true.dat | 2 +- tests/test_periodic/inputs_true.dat | 2 +- tests/test_salphabeta/inputs_true.dat | 10 +++++----- tests/test_tallies/inputs_true.dat | 18 +++++++++--------- tests/test_tally_aggregation/inputs_true.dat | 18 +++++++++--------- tests/test_tally_arithmetic/inputs_true.dat | 18 +++++++++--------- tests/test_tally_slice_merge/inputs_true.dat | 18 +++++++++--------- tests/test_triso/inputs_true.dat | 8 ++++---- tests/test_volume_calc/inputs_true.dat | 2 +- 22 files changed, 110 insertions(+), 109 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 24cd3343a..03ef7fbc4 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -982,7 +982,8 @@ class Material(IDManagerMixin): for sab in self._sab: subelement = ET.SubElement(element, "sab") subelement.set("name", sab[0]) - subelement.set("fraction", str(sab[1])) + if sab[1] != 1.0: + subelement.set("fraction", str(sab[1])) return element diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index 50803105d..672f6bee1 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -78,7 +78,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -159,7 +159,7 @@ - + @@ -174,7 +174,7 @@ - + @@ -187,7 +187,7 @@ - + @@ -200,7 +200,7 @@ - + diff --git a/tests/test_diff_tally/inputs_true.dat b/tests/test_diff_tally/inputs_true.dat index a2c5638cf..ff134bd5c 100644 --- a/tests/test_diff_tally/inputs_true.dat +++ b/tests/test_diff_tally/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_filter_energyfun/inputs_true.dat b/tests/test_filter_energyfun/inputs_true.dat index d6f7c1f79..d857451cb 100644 --- a/tests/test_filter_energyfun/inputs_true.dat +++ b/tests/test_filter_energyfun/inputs_true.dat @@ -171,7 +171,7 @@ - + @@ -179,7 +179,7 @@ - + @@ -207,7 +207,7 @@ - + @@ -222,7 +222,7 @@ - + @@ -237,7 +237,7 @@ - + @@ -252,7 +252,7 @@ - + @@ -267,7 +267,7 @@ - + @@ -280,7 +280,7 @@ - + @@ -293,7 +293,7 @@ - + diff --git a/tests/test_filter_mesh/inputs_true.dat b/tests/test_filter_mesh/inputs_true.dat index 153f4dcd9..6d14f9e7e 100644 --- a/tests/test_filter_mesh/inputs_true.dat +++ b/tests/test_filter_mesh/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 2311d8588..098056f5b 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index 675ef50f1..8e8cde281 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index 38a40c1cc..d2f28d0fe 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 8b6522bdd..d7a4a186a 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -60,7 +60,7 @@ - + diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index 38a40c1cc..d2f28d0fe 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 8bfcc64b6..4756b27bf 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index 38a40c1cc..d2f28d0fe 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 03e3b3ff6..826eb5b62 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -33,7 +33,7 @@ - + diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 4b349ecba..0d1fe99bd 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -25,7 +25,7 @@ - + diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 26e700004..61958701b 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -16,7 +16,7 @@ - + diff --git a/tests/test_salphabeta/inputs_true.dat b/tests/test_salphabeta/inputs_true.dat index c42b90e8c..02e6813f0 100644 --- a/tests/test_salphabeta/inputs_true.dat +++ b/tests/test_salphabeta/inputs_true.dat @@ -22,15 +22,15 @@ - + - - + + @@ -42,8 +42,8 @@ - - + + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index 664e6e983..a85491e94 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 6ef6bdb4d..7a8bf4613 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index e9c156287..743ca3c58 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index 2c90e475a..b1c089c96 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -170,7 +170,7 @@ - + @@ -178,7 +178,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 862c2db9a..fdbc1cb5f 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -403,12 +403,12 @@ - + - + @@ -420,12 +420,12 @@ - + - + diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 35c866028..28f1cbd9f 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -16,7 +16,7 @@ - + From 53f38806d8bec0ac6cd21b18991ba216c453d6e3 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 12 Jul 2017 14:39:24 -0400 Subject: [PATCH 073/123] Restructure S(a,b) treatment in NuclideMicroXS Also make sure cross sections are re-evaluated if sab_frac changes --- src/cross_section.F90 | 52 +++++++++++++++++++++--------------------- src/nuclide_header.F90 | 45 ++++++++++++++++++------------------ src/physics.F90 | 8 +++---- src/tally.F90 | 3 +-- 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 1306fb669..1222624d4 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -61,22 +61,24 @@ contains ! Add contribution from each nuclide in material do i = 1, mat % n_nuclides - ! ======================================================================== + ! ====================================================================== ! CHECK FOR S(A,B) TABLE i_sab = 0 - ! Check if this nuclide matches one of the S(a,b) tables specified -- this - ! relies on i_sab_nuclides being in sorted order + ! Check if this nuclide matches one of the S(a,b) tables specified. + ! This relies on i_sab_nuclides being in sorted order if (check_sab) then if (i == mat % i_sab_nuclides(j)) then ! Get index in sab_tables i_sab = mat % i_sab_tables(j) sab_frac = mat % sab_fracs(j) - ! If particle energy is greater than the highest energy for the S(a,b) - ! table, don't use the S(a,b) table - if (p % E > sab_tables(i_sab) % data(1) % threshold_inelastic) i_sab = 0 + ! If particle energy is greater than the highest energy for the + ! S(a,b) table, then don't use the S(a,b) table + if (p % E > sab_tables(i_sab) % data(1) % threshold_inelastic) then + i_sab = 0 + end if ! Increment position in i_sab_nuclides j = j + 1 @@ -94,10 +96,9 @@ contains ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E & - .or. p % sqrtkT /= micro_xs(i_nuclide) % last_sqrtkT) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, & - p % sqrtkT, sab_frac) - else if (i_sab /= micro_xs(i_nuclide) % last_index_sab) then + .or. p % sqrtkT /= micro_xs(i_nuclide) % last_sqrtkT & + .or. i_sab /= micro_xs(i_nuclide) % index_sab & + .or. sab_frac /= micro_xs(i_nuclide) % sab_frac) then call calculate_nuclide_xs(i_nuclide, i_sab, p % E, i_grid, & p % sqrtkT, sab_frac) end if @@ -114,8 +115,7 @@ contains ! Add contributions to material macroscopic scattering cross section material_xs % elastic = material_xs % elastic + & - atom_density * (micro_xs(i_nuclide) % elastic & - + micro_xs(i_nuclide) % scatter_sab) + atom_density * micro_xs(i_nuclide) % elastic ! Add contributions to material macroscopic absorption cross section material_xs % absorption = material_xs % absorption + & @@ -250,10 +250,10 @@ contains micro_xs(i_nuclide) % interp_factor = f ! Initialize nuclide cross-sections to zero - micro_xs(i_nuclide) % fission = ZERO - micro_xs(i_nuclide) % nu_fission = ZERO - micro_xs(i_nuclide) % scatter_sab = ZERO - micro_xs(i_nuclide) % elastic_sab = ZERO + micro_xs(i_nuclide) % fission = ZERO + micro_xs(i_nuclide) % nu_fission = ZERO + micro_xs(i_nuclide) % thermal = ZERO + micro_xs(i_nuclide) % thermal_elastic = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * xs % total(i_grid) & @@ -280,11 +280,10 @@ contains end if ! Initialize sab treatment to false - micro_xs(i_nuclide) % index_sab = NONE - micro_xs(i_nuclide) % elastic_sab = ZERO + micro_xs(i_nuclide) % index_sab = NONE ! Initialize URR probability table treatment to false - micro_xs(i_nuclide) % use_ptable = .false. + micro_xs(i_nuclide) % use_ptable = .false. ! If there is S(a,b) data for this nuclide, we need to set the sab_scatter ! and sab_elastic cross sections and correct the total and elastic cross @@ -305,7 +304,6 @@ contains end if micro_xs(i_nuclide) % last_E = E - micro_xs(i_nuclide) % last_index_sab = i_sab micro_xs(i_nuclide) % last_sqrtkT = sqrtkT end associate @@ -414,17 +412,19 @@ contains end associate ! Store the S(a,b) cross sections. - micro_xs(i_nuclide) % scatter_sab = sab_frac * (elastic + inelastic) - micro_xs(i_nuclide) % elastic_sab = sab_frac * elastic + micro_xs(i_nuclide) % thermal = sab_frac * (elastic + inelastic) + micro_xs(i_nuclide) % thermal_elastic = sab_frac * elastic ! Correct total and elastic cross sections micro_xs(i_nuclide) % total = micro_xs(i_nuclide) % total & - + sab_frac * (elastic + inelastic - micro_xs(i_nuclide) % elastic) - micro_xs(i_nuclide) % elastic = & - (ONE - sab_frac) * micro_xs(i_nuclide) % elastic + + micro_xs(i_nuclide) % thermal & + - sab_frac * micro_xs(i_nuclide) % elastic + micro_xs(i_nuclide) % elastic = micro_xs(i_nuclide) % thermal & + + (ONE - sab_frac) * micro_xs(i_nuclide) % elastic - ! Save temperature index + ! Save temperature index and thermal fraction micro_xs(i_nuclide) % index_temp_sab = i_temp + micro_xs(i_nuclide) % sab_frac = sab_frac end subroutine calculate_sab_xs diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 41b1008a8..5c5131abc 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -102,34 +102,35 @@ module nuclide_header end type Nuclide !=============================================================================== -! NUCLIDEMICROXS contains cached microscopic cross sections for a -! particular nuclide at the current energy +! NUCLIDEMICROXS contains cached microscopic cross sections for a particular +! nuclide at the current energy !=============================================================================== type NuclideMicroXS - integer :: index_grid ! index on nuclide energy grid - integer :: index_temp ! temperature index for nuclide - real(8) :: last_E = ZERO ! last evaluated energy - real(8) :: interp_factor ! interpolation factor on nuc. energy grid - real(8) :: total ! microscropic total xs - real(8) :: elastic ! microscopic elastic scattering xs (non S(a,b)) - real(8) :: absorption ! microscopic absorption xs - real(8) :: fission ! microscopic fission xs - real(8) :: nu_fission ! microscopic production xs - real(8) :: scatter_sab ! microscopic scattering xs due to S(a,b) + ! Microscopic cross sections in barns + real(8) :: total + real(8) :: elastic ! If sab_frac is not 1 or 0, then this value is + ! averaged over bound and non-bound nuclei + real(8) :: absorption + real(8) :: fission + real(8) :: nu_fission + real(8) :: thermal ! Bound thermal elastic & inelastic scattering + real(8) :: thermal_elastic ! Bound thermal elastic scattering - ! Information for S(a,b) use - integer :: index_sab ! index in sab_tables (zero means no table) - integer :: last_index_sab = 0 ! index in sab_tables last used by this nuclide - integer :: index_temp_sab ! temperature index for sab_tables - real(8) :: elastic_sab ! microscopic elastic scattering on S(a,b) table + ! Indicies and factors needed to compute cross sections from the data tables + integer :: index_grid ! Index on nuclide energy grid + integer :: index_temp ! Temperature index for nuclide + real(8) :: interp_factor ! Interpolation factor on nuc. energy grid + integer :: index_sab = NONE ! Index in sab_tables + integer :: index_temp_sab ! Temperature index for sab_tables + real(8) :: sab_frac ! Fraction of atoms affected by S(a,b) + logical :: use_ptable ! In URR range with probability tables? - ! Information for URR probability table use - logical :: use_ptable ! in URR range with probability tables? - - ! Information for Doppler broadening + ! Energy and temperature last used to evaluate these cross sections. If + ! these values have changed, then the cross sections must be re-evaluated. + real(8) :: last_E = ZERO ! Last evaluated energy real(8) :: last_sqrtkT = ZERO ! Last temperature in sqrt(Boltzmann - ! constant * temperature (eV)) + ! constant * temperature (eV)) end type NuclideMicroXS !=============================================================================== diff --git a/src/physics.F90 b/src/physics.F90 index 15b53fd7f..3d557b44f 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -342,7 +342,7 @@ contains micro_xs(i_nuclide) % absorption) sampled = .false. - prob = micro_xs(i_nuclide) % elastic + prob = micro_xs(i_nuclide) % elastic - micro_xs(i_nuclide) % thermal if (prob > cutoff) then ! ======================================================================= ! NON-S(A,B) ELASTIC SCATTERING @@ -362,7 +362,7 @@ contains sampled = .true. end if - prob = prob + micro_xs(i_nuclide) % scatter_sab + prob = micro_xs(i_nuclide) % elastic if (prob > cutoff .and. .not. sampled) then ! ======================================================================= ! S(A,B) SCATTERING @@ -567,8 +567,8 @@ contains associate (sab => sab_tables(i_sab) % data(i_temp)) ! Determine whether inelastic or elastic scattering will occur - if (prn() < micro_xs(i_nuclide) % elastic_sab / & - micro_xs(i_nuclide) % scatter_sab) then + if (prn() < micro_xs(i_nuclide) % thermal_elastic / & + micro_xs(i_nuclide) % thermal) then ! elastic scattering ! Get index and interpolation factor for elastic grid diff --git a/src/tally.F90 b/src/tally.F90 index d827d9bac..0ee041cbe 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1051,8 +1051,7 @@ contains else if (i_nuclide > 0) then - score = (micro_xs(i_nuclide) % elastic & - + micro_xs(i_nuclide) % scatter_sab) * atom_density * flux + score = micro_xs(i_nuclide) % elastic * atom_density * flux else score = material_xs % elastic * flux end if From b21b6e8331260246ec70fcd07cdb52875d2d6dfa Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Tue, 11 Jul 2017 11:32:29 -0400 Subject: [PATCH 074/123] Use Travis CI build matrix --- .travis.yml | 3 +++ tests/travis.sh | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index fcefaa8f1..ece6c3fc6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,9 @@ addons: cache: directories: - $HOME/nndc_hdf5 +env: + - OPENMC_CONFIG="^hdf5-debug$|^omp-hdf5-debug$" + - OPENMC_CONFIG="^mpi-hdf5-debug$|^phdf5-debug$" before_install: # ============== Handle Python third-party packages ============== diff --git a/tests/travis.sh b/tests/travis.sh index 2dc352834..f7cc3cd77 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -4,8 +4,4 @@ set -ev # Run all debug tests ./check_source.py -if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - ./run_tests.py -C "^hdf5-debug$|^omp-hdf5-debug|^mpi-hdf5-debug|^phdf5-debug$" -j 2 -else - ./run_tests.py -C "^hdf5-debug$" -j 2 -fi +./run_tests.py -C $OPENMC_CONFIG -j 2 From 952224324e1ee6bf9cda2c95b6e19254e8fa4f6c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 12 Jul 2017 15:46:37 -0400 Subject: [PATCH 075/123] Run check_source separately from run_tests --- .travis.yml | 27 +++++++++++++++++++-------- tests/travis.sh | 7 ------- 2 files changed, 19 insertions(+), 15 deletions(-) delete mode 100755 tests/travis.sh diff --git a/.travis.yml b/.travis.yml index ece6c3fc6..099bba55a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,13 @@ cache: directories: - $HOME/nndc_hdf5 env: + - OPENMC_CONFIG="check_source" - OPENMC_CONFIG="^hdf5-debug$|^omp-hdf5-debug$" - OPENMC_CONFIG="^mpi-hdf5-debug$|^phdf5-debug$" +matrix: + exclude: + - python: "2.7" + env: OPENMC_CONFIG="check_source" before_install: # ============== Handle Python third-party packages ============== @@ -35,13 +40,15 @@ before_install: - source activate test-environment # Install GCC, HDF5, PHDF5 - - sudo add-apt-repository ppa:nschloe/hdf5-backports -y - - sudo apt-get update -q - - sudo apt-get install libhdf5-serial-dev libhdf5-mpich-dev -y - - export FC=gfortran - - export MPI_DIR=/usr - - export PHDF5_DIR=/usr - - export HDF5_DIR=/usr + - if [[ $OPENMC_CONFIG != "check_source" ]]; then + sudo add-apt-repository ppa:nschloe/hdf5-backports -y; + sudo apt-get update -q; + sudo apt-get install libhdf5-serial-dev libhdf5-mpich-dev -y; + export FC=gfortran; + export MPI_DIR=/usr; + export PHDF5_DIR=/usr; + export HDF5_DIR=/usr; + fi install: true @@ -58,5 +65,9 @@ before_script: script: - cd tests - export OMP_NUM_THREADS=2 - - ./travis.sh + - if [[ $OPENMC_CONFIG == "check_source" ]]; then + ./check_source.py; + else + ./run_tests.py -C $OPENMC_CONFIG -j 2; + fi - cd .. diff --git a/tests/travis.sh b/tests/travis.sh deleted file mode 100755 index f7cc3cd77..000000000 --- a/tests/travis.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -set -ev - -# Run all debug tests -./check_source.py -./run_tests.py -C $OPENMC_CONFIG -j 2 From 0b36d0cd74a450c238f6828acb20d663e30a2871 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 12 Jul 2017 16:52:44 -0400 Subject: [PATCH 076/123] Speed up Travis check_source jobs --- .travis.yml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 099bba55a..22408b72e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,8 @@ env: - OPENMC_CONFIG="check_source" - OPENMC_CONFIG="^hdf5-debug$|^omp-hdf5-debug$" - OPENMC_CONFIG="^mpi-hdf5-debug$|^phdf5-debug$" + +# We aren't testing the check_source script so just run it with Python 3. matrix: exclude: - python: "2.7" @@ -36,11 +38,9 @@ before_install: - conda config --set always_yes yes --set changeps1 no - conda update -q conda - conda info -a - - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION six numpy scipy h5py=2.5 pandas - - source activate test-environment - - # Install GCC, HDF5, PHDF5 - if [[ $OPENMC_CONFIG != "check_source" ]]; then + conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION six numpy scipy h5py=2.5 pandas; + source activate test-environment; sudo add-apt-repository ppa:nschloe/hdf5-backports -y; sudo apt-get update -q; sudo apt-get install libhdf5-serial-dev libhdf5-mpich-dev -y; @@ -53,14 +53,15 @@ before_install: install: true before_script: - - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then - wget https://anl.box.com/shared/static/a6sw2cep34wlz6b9i9jwiotaqoayxcxt.xz -O - | tar -C $HOME -xvJ; + - if [[ $OPENMC_CONFIG != "check_source" ]]; then + if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then + wget https://anl.box.com/shared/static/a6sw2cep34wlz6b9i9jwiotaqoayxcxt.xz -O - | tar -C $HOME -xvJ; + fi; + export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml; + git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib; + tar xzvf wmp_lib/multipole_lib.tar.gz; + export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib; fi - - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml - - - git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib - - tar xzvf wmp_lib/multipole_lib.tar.gz - - export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib script: - cd tests From a97779d5497ab4f68a686f1b0dee54d1f9df1677 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 13 Jul 2017 11:32:45 -0400 Subject: [PATCH 077/123] Split CI builds into 4 different configurations --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 22408b72e..64fbdc9df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,10 @@ cache: - $HOME/nndc_hdf5 env: - OPENMC_CONFIG="check_source" - - OPENMC_CONFIG="^hdf5-debug$|^omp-hdf5-debug$" - - OPENMC_CONFIG="^mpi-hdf5-debug$|^phdf5-debug$" + - OPENMC_CONFIG="^hdf5-debug$" + - OPENMC_CONFIG="^omp-hdf5-debug$" + - OPENMC_CONFIG="^mpi-hdf5-debug$" + - OPENMC_CONFIG="^phdf5-debug$" # We aren't testing the check_source script so just run it with Python 3. matrix: From 4ce4235099e41867d25dd739efe242887eb38b17 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 13 Jul 2017 12:16:46 -0400 Subject: [PATCH 078/123] Make sure micro_xs % sab_frac is defined Otherwise, cross sections can be unnecessarily re-evaluated --- src/cross_section.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 1222624d4..0b3c1fdb0 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -281,6 +281,7 @@ contains ! Initialize sab treatment to false micro_xs(i_nuclide) % index_sab = NONE + micro_xs(i_nuclide) % sab_frac = ZERO ! Initialize URR probability table treatment to false micro_xs(i_nuclide) % use_ptable = .false. From 0ced86c595947c64b72386fc41d2fe53938a21e1 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 13 Jul 2017 12:31:06 -0400 Subject: [PATCH 079/123] Make sure sab_frac is defined --- src/cross_section.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 0b3c1fdb0..68955f2df 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -65,6 +65,7 @@ contains ! CHECK FOR S(A,B) TABLE i_sab = 0 + sab_frac = ZERO ! Check if this nuclide matches one of the S(a,b) tables specified. ! This relies on i_sab_nuclides being in sorted order From 5fda1abcca740b64ed8c6187554ea76cad99d6f4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 13 Jul 2017 15:35:36 -0500 Subject: [PATCH 080/123] Use int32_t for IDs to ensure they are 4 bytes --- openmc/capi.py | 20 ++++++++++---------- src/api.F90 | 22 +++++++++++----------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index 74af8c003..c04aea457 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -1,4 +1,4 @@ -from ctypes import CDLL, c_int, POINTER, c_double, c_char_p +from ctypes import CDLL, c_int, c_int32, c_double, c_char_p, POINTER import sys from warnings import warn @@ -32,23 +32,23 @@ class OpenMCLibrary(object): # Set argument/return types self._dll.openmc_calculate_volumes.restype = None self._dll.openmc_cell_set_temperature.argtypes = [ - c_int, c_double] + c_int32, c_double, c_int32] self._dll.openmc_cell_set_temperature.restype = c_int self._dll.openmc_finalize.restype = None self._dll.openmc_find.argtypes = [ - POINTER(_double3), c_int, POINTER(c_int), POINTER(c_int)] + POINTER(_double3), c_int, POINTER(c_int32), POINTER(c_int32)] self._dll.openmc_find.restype = None self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None self._dll.openmc_load_nuclide.argtypes = [c_char_p] self._dll.openmc_load_nuclide.restype = c_int self._dll.openmc_material_add_nuclide.argtypes = [ - c_int, c_char_p, c_double] + c_int32, c_char_p, c_double] self._dll.openmc_material_add_nuclide.restype = c_int self._dll.openmc_material_get_densities.argtypes = [ - c_int, _double_array] + c_int32, _double_array] self._dll.openmc_material_get_densities.restype = c_int - self._dll.openmc_material_set_density.argtypes = [c_int, c_double] + self._dll.openmc_material_set_density.argtypes = [c_int32, c_double] self._dll.openmc_material_set_density.restype = c_int self._dll.openmc_plot_geometry.restype = None self._dll.openmc_run.restype = None @@ -59,7 +59,7 @@ class OpenMCLibrary(object): POINTER(_double3), c_double] self._dll.openmc_set_temperature.restype = c_int self._dll.openmc_tally_results.argtypes = [ - c_int, _double_array, POINTER(_int3)] + c_int32, _double_array, POINTER(_int3)] self._dll.openmc_tally_results.restype = None def calculate_volumes(self): @@ -81,7 +81,7 @@ class OpenMCLibrary(object): """ if instance is not None: return self._dll.openmc_cell_set_temperature( - cell_id, T, c_int(instance)) + cell_id, T, instance) else: return self._dll.openmc_cell_set_temperature(cell_id, T, None) @@ -119,8 +119,8 @@ class OpenMCLibrary(object): raise ValueError('Unknown return type: {}'.format(rtype)) # Call openmc_find - uid = c_int() - instance = c_int() + uid = c_int32() + instance = c_int32() self._dll.openmc_find(_double3(*xyz), r_int, uid, instance) return (uid.value if uid != 0 else None), instance.value diff --git a/src/api.F90 b/src/api.F90 index 444dc71f9..1317ebb42 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -42,9 +42,9 @@ contains !=============================================================================== function openmc_cell_set_temperature(id, T, instance) result(err) bind(C) - integer(C_INT), value, intent(in) :: id ! id of cell + integer(C_INT32_T), value, intent(in) :: id ! id of cell real(C_DOUBLE), value, intent(in) :: T - integer(C_INT), optional, intent(in) :: instance + integer(C_INT32_T), optional, intent(in) :: instance integer(C_INT) :: err integer :: i, n @@ -78,8 +78,8 @@ contains subroutine openmc_find(xyz, rtype, id, instance) bind(C) real(C_DOUBLE), intent(in) :: xyz(3) ! Cartesian point integer(C_INT), intent(in), value :: rtype ! 1 for cell, 2 for material - integer(C_INT), intent(out) :: id - integer(C_INT), intent(out) :: instance + integer(C_INT32_T), intent(out) :: id + integer(C_INT32_T), intent(out) :: instance logical :: found type(Particle) :: p @@ -172,7 +172,7 @@ contains !=============================================================================== function openmc_material_add_nuclide(id, name, density) result(err) bind(C) - integer(C_INT), value, intent(in) :: id + integer(C_INT32_T), value, intent(in) :: id character(kind=C_CHAR) :: name(*) real(C_DOUBLE), value, intent(in) :: density integer(C_INT) :: err @@ -244,8 +244,8 @@ contains !=============================================================================== function openmc_material_get_densities(id, ptr) result(n) bind(C) - integer(C_INT), intent(in), value :: id - type(C_PTR), intent(out) :: ptr + integer(C_INT32_T), intent(in), value :: id + type(C_PTR), intent(out) :: ptr integer(C_INT) :: n ptr = C_NULL_PTR @@ -268,7 +268,7 @@ contains !=============================================================================== function openmc_material_set_density(id, density) result(err) bind(C) - integer(C_INT), value, intent(in) :: id + integer(C_INT32_T), value, intent(in) :: id real(C_DOUBLE), value, intent(in) :: density integer(C_INT) :: err @@ -386,9 +386,9 @@ contains !=============================================================================== subroutine openmc_tally_results(id, ptr, shape_) bind(C) - integer(C_INT), intent(in), value :: id - type(C_PTR), intent(out) :: ptr - integer(C_INT), intent(out) :: shape_(3) + integer(C_INT32_T), intent(in), value :: id + type(C_PTR), intent(out) :: ptr + integer(C_INT), intent(out) :: shape_(3) integer :: i From 23cd067bdaa4af26855d52c5e49579ecc2347855 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 17 Jul 2017 06:42:28 -0500 Subject: [PATCH 081/123] Remove openmc_set_density and openmc_set_temperature --- docs/source/capi/index.rst | 22 -------------- openmc/capi.py | 41 -------------------------- src/api.F90 | 59 -------------------------------------- 3 files changed, 122 deletions(-) diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst index 4cc195ef2..9bb1b2c66 100644 --- a/docs/source/capi/index.rst +++ b/docs/source/capi/index.rst @@ -105,28 +105,6 @@ C API Run a simulation -.. c:function:: int openmc_set_density(double xyz[3], double density) - - Set the density of a material at a given point. - - :param xyz: Cartesian coordinates - :type xyz: double[3] - :param density: Density of the material to set in atom/b-cm - :type density: double - :return: Return status (negative if an error occurs) - :rtype: int - -.. c:function:: int openmc_set_temperature(double xyz[3], double T) - - Set the density of a cell at a given point. - - :param xyz: Cartesian coordinates - :type xyz: double[3] - :param T: Temperature of the cell to set in Kelvin - :type T: double - :return: Return status (negative if an error occurs) - :rtype: int - .. c:function:: void openmc_tally_results(int id, double** ptr, int shape_[3]) Get a pointer to tally results array. diff --git a/openmc/capi.py b/openmc/capi.py index c04aea457..a194e2d26 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -53,11 +53,6 @@ class OpenMCLibrary(object): self._dll.openmc_plot_geometry.restype = None self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None - self._dll.openmc_set_density.argtypes = [POINTER(_double3), c_double] - self._dll.openmc_set_density.restype = c_int - self._dll.openmc_set_temperature.argtypes = [ - POINTER(_double3), c_double] - self._dll.openmc_set_temperature.restype = c_int self._dll.openmc_tally_results.argtypes = [ c_int32, _double_array, POINTER(_int3)] self._dll.openmc_tally_results.restype = None @@ -232,42 +227,6 @@ class OpenMCLibrary(object): """Run simulation""" return self._dll.openmc_run() - def set_density(self, xyz, density): - """Set density at a given point. - - Parameters - ---------- - xyz : iterable of float - Cartesian coordinates at position - density : float - Density in atom/b-cm - - Returns - ------- - int - Return status (negative if an error occurs) - - """ - return self._dll.openmc_set_density(_double3(*xyz), density) - - def set_temperature(self, xyz, T): - """Set temperature at a given point. - - Parameters - ---------- - xyz : iterable of float - Cartesian coordinates at position - T : float - Temperature in K - - Returns - ------- - int - Return status (negative if an error occurs) - - """ - return self._dll.openmc_set_temperature(_double3(*xyz), T) - def tally_results(self, tally_id): """Get tally results array diff --git a/src/api.F90 b/src/api.F90 index 1317ebb42..b00193fcf 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -31,8 +31,6 @@ module openmc_api public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run - public :: openmc_set_density - public :: openmc_set_temperature public :: openmc_tally_results contains @@ -322,63 +320,6 @@ contains end subroutine openmc_reset -!=============================================================================== -! OPENMC_SET_DENSITY sets the density of a material at a given point -!=============================================================================== - - function openmc_set_density(xyz, density) result(err) bind(C) - real(C_DOUBLE), intent(in) :: xyz(3) - real(C_DOUBLE), intent(in), value :: density - integer(C_INT) :: err - - logical :: found - type(Particle) :: p - - call p % initialize() - p % coord(1) % xyz(:) = xyz - p % coord(1) % uvw(:) = [ZERO, ZERO, ONE] - call find_cell(p, found) - - err = -1 - if (found) then - if (p % material /= MATERIAL_VOID) then - associate (m => materials(p % material)) - err = m % set_density(density, nuclides) - end associate - end if - end if - end function openmc_set_density - -!=============================================================================== -! OPENMC_SET_TEMPERATURE sets the temperature of a cell at a given point -!=============================================================================== - - function openmc_set_temperature(xyz, T) result(err) bind(C) - real(C_DOUBLE), intent(in) :: xyz(3) - real(C_DOUBLE), intent(in), value :: T - integer(C_INT) :: err - - logical :: found - type(Particle) :: p - - call p % initialize() - p % coord(1) % xyz(:) = xyz - p % coord(1) % uvw(:) = [ZERO, ZERO, ONE] - call find_cell(p, found) - - err = -1 - if (found) then - associate (c => cells(p % coord(p % n_coord) % cell)) - if (size(c % sqrtkT) > 1) then - c % sqrtkT(p % cell_instance) = sqrt(K_BOLTZMANN * T) - else - c % sqrtkT(1) = sqrt(K_BOLTZMANN * T) - end if - err = 0 - end associate - end if - end function openmc_set_temperature - !=============================================================================== ! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its ! shape. This allows a user to obtain in-memory tally results from Python From ca28d20a016509a88d476aaf65c05ca6a03e12e0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 17 Jul 2017 07:09:21 -0500 Subject: [PATCH 082/123] Make sure valid communicator is passed to initialize_mpi --- src/initialize.F90 | 15 ++++++++++++--- src/material_header.F90 | 4 ++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/initialize.F90 b/src/initialize.F90 index 98f02863e..69479907e 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -49,14 +49,23 @@ contains integer, intent(in), optional :: intracomm ! MPI intracommunicator ! Copy the communicator to a new variable. This is done to avoid changing - ! the signature of this subroutine. + ! the signature of this subroutine. If MPI is being used but no communicator + ! was passed, assume MPI_COMM_WORLD. #ifdef MPI #ifdef MPIF08 type(MPI_Comm), intent(in) :: comm ! MPI intracommunicator - comm % MPI_VAL = intracomm + if (present(intracomm)) then + comm % MPI_VAL = intracomm + else + comm = MPI_COMM_WORLD + end if #else integer :: comm - comm = intracomm + if (present(intracomm)) then + comm = intracomm + else + comm = MPI_COMM_WORLD + end if #endif #endif diff --git a/src/material_header.F90 b/src/material_header.F90 index da2faf4a6..4415ad086 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -48,6 +48,10 @@ module material_header contains +!=============================================================================== +! MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm. +!=============================================================================== + function material_set_density(m, density, nuclides) result(err) class(Material), intent(inout) :: m real(8), intent(in) :: density From 35657d5e1b3acafde1723c07c03ed0946a8471a0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 17 Jul 2017 07:58:35 -0500 Subject: [PATCH 083/123] Add context manager for shared library calls --- docs/source/pythonapi/capi.rst | 7 +++++++ openmc/__init__.py | 2 +- openmc/capi.py | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/docs/source/pythonapi/capi.rst b/docs/source/pythonapi/capi.rst index c78c43fd3..af00363cc 100644 --- a/docs/source/pythonapi/capi.rst +++ b/docs/source/pythonapi/capi.rst @@ -2,6 +2,13 @@ :data:`openmc.capi` -- Python bindings to the C API --------------------------------------------------- +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myfunction.rst + + openmc.capi.lib_context + .. autosummary:: :toctree: generated :nosignatures: diff --git a/openmc/__init__.py b/openmc/__init__.py index 74c991fda..a0fe26491 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -27,6 +27,6 @@ from openmc.particle_restart import * from openmc.mixin import * from openmc.plotter import * from openmc.search import * -from openmc.capi import lib, OpenMCLibrary +from openmc.capi import * __version__ = '0.9.0' diff --git a/openmc/capi.py b/openmc/capi.py index a194e2d26..bb9241d7d 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -1,3 +1,4 @@ +from contextlib import contextmanager from ctypes import CDLL, c_int, c_int32, c_double, c_char_p, POINTER import sys from warnings import warn @@ -7,6 +8,8 @@ from numpy.ctypeslib import as_array import pkg_resources +__all__ = ['OpenMCLibrary', 'lib', 'lib_context'] + _int3 = c_int*3 _double3 = c_double*3 _double_array = POINTER(POINTER(c_double)) @@ -80,7 +83,6 @@ class OpenMCLibrary(object): else: return self._dll.openmc_cell_set_temperature(cell_id, T, None) - def finalize(self): """Finalize simulation and free memory""" return self._dll.openmc_finalize() @@ -124,7 +126,7 @@ class OpenMCLibrary(object): Parameters ---------- - intracomm : int or None + intracomm : mpi4py.MPI.Intracomm or None MPI intracommunicator """ @@ -258,6 +260,32 @@ class OpenMCLibrary(object): .format(key)) +@contextmanager +def lib_context(intracomm=None): + """Provides context manager for calling OpenMC shared library functions. + + This function is intended to be used in a 'with' statement and ensures that + OpenMC is properly initialized/finalized. At the completion of the 'with' + block, all memory that was allocated during the block is freed. For + example:: + + with openmc.lib_context() as lib: + for i in range(n_iters): + lib.reset() + do_stuff() + lib.run() + + Parameters + ---------- + intracomm : mpi4py.MPI.Intracomm or None + MPI intracommunicator + + """ + lib.init(comm) + yield lib + lib.finalize() + + # Determine shared-library suffix if sys.platform == 'darwin': suffix = 'dylib' From 24f3dd6f55e1fd8dbeb5e0f587dfdbeda7578c5f Mon Sep 17 00:00:00 2001 From: tjlaboss Date: Tue, 25 Jul 2017 15:51:24 -0600 Subject: [PATCH 084/123] Replace ZAID notation with human-readable --- scripts/openmc-update-inputs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index 72aee9c0f..7143851d8 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -11,6 +11,7 @@ from itertools import chain from random import randint from shutil import move import xml.etree.ElementTree as ET +import re import openmc.data @@ -238,6 +239,18 @@ def update_geometry(geometry_root): return was_updated +def replace_zaid(name): + """Replace a nuclide name in the ZAID notation with the correct name.""" + # TODO: Account for metastable and any other special cases + name = name.strip() + z = int(name[:-3]) + a = int(name[-3:]) # Strips leading 0s + symbol = openmc.data.ATOMIC_SYMBOL[z] + name = str(symbol).title() + str(a) + return name + + + def update_materials(root): """Update the given XML materials tree. Return True if changes were made.""" was_updated = False @@ -247,6 +260,9 @@ def update_materials(root): if 'name' in nuclide.attrib: nucname = nuclide.attrib['name'] nucname = nucname.replace('-', '') + s = re.search("\s*(? Date: Tue, 25 Jul 2017 22:13:41 -0500 Subject: [PATCH 085/123] Make k-effective accessible from C API --- openmc/capi.py | 16 ++++++++++++++++ src/api.F90 | 3 ++- src/eigenvalue.F90 | 20 ++++++++++++++------ src/global.F90 | 1 - src/output.F90 | 11 +++++++++-- src/simulation.F90 | 15 ++------------- src/state_point.F90 | 8 +++++--- src/trigger.F90 | 6 ++++++ 8 files changed, 54 insertions(+), 26 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index bb9241d7d..f4c9a7f3c 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -43,6 +43,8 @@ class OpenMCLibrary(object): self._dll.openmc_find.restype = None self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None + self._dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] + self._dll.openmc_get_keff.restype = c_int self._dll.openmc_load_nuclide.argtypes = [c_char_p] self._dll.openmc_load_nuclide.restype = c_int self._dll.openmc_material_add_nuclide.argtypes = [ @@ -141,7 +143,21 @@ class OpenMCLibrary(object): else: return self._dll.openmc_init(None) + def keff(self): + """Return the calculated k-eigenvalue and its standard deviation. + + Returns + ------- + tuple + Mean k-eigenvalue and standard deviation of the mean + + """ + k = (c_double*2)() + err = self._dll.openmc_get_keff(k) + return tuple(k) + def load_nuclide(self, name): + """Load cross section data for a nuclide. Parameters diff --git a/src/api.F90 b/src/api.F90 index b00193fcf..45f511f9c 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -5,7 +5,7 @@ module openmc_api use hdf5, only: HID_T use constants, only: K_BOLTZMANN - use eigenvalue, only: k_sum + use eigenvalue, only: k_sum, openmc_get_keff use finalize, only: openmc_finalize use geometry, only: find_cell use global @@ -23,6 +23,7 @@ module openmc_api public :: openmc_cell_set_temperature public :: openmc_finalize public :: openmc_find + public :: openmc_get_keff public :: openmc_init public :: openmc_load_nuclide public :: openmc_material_add_nuclide diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index f370ab38e..9f4da7c82 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -1,5 +1,6 @@ module eigenvalue + use, intrinsic :: ISO_C_BINDING use algorithm, only: binary_search use constants, only: ZERO @@ -439,8 +440,8 @@ contains end subroutine calculate_average_keff !=============================================================================== -! CALCULATE_COMBINED_KEFF calculates a minimum variance estimate of k-effective -! based on a linear combination of the collision, absorption, and tracklength +! OPENMC_GET_KEFF calculates a minimum variance estimate of k-effective based on +! a linear combination of the collision, absorption, and tracklength ! estimates. The theory behind this can be found in M. Halperin, "Almost ! linearly-optimum combination of unbiased estimates," J. Am. Stat. Assoc., 56, ! 36-43 (1961), doi:10.1080/01621459.1961.10482088. The implementation here @@ -448,7 +449,9 @@ contains ! of keff confidence intervals in MCNP," Nucl. Technol., 111, 169-182 (1995). !=============================================================================== - subroutine calculate_combined_keff() + function openmc_get_keff(k_combined) result(err) bind(C) + real(C_DOUBLE), intent(out) :: k_combined(2) + integer(C_INT) :: err integer :: l ! loop index integer :: i, j, k ! indices referring to collision, absorption, or track @@ -459,9 +462,14 @@ contains real(8) :: g ! sum of weighting factors real(8) :: S(3) ! sums used for variance calculation + k_combined = ZERO + ! Make sure we have at least four realizations. Notice that at the end, ! there is a N-3 term in a denominator. - if (n_realizations <= 3) return + if (n_realizations <= 3) then + err = -1 + return + end if ! Initialize variables n = real(n_realizations, 8) @@ -523,7 +531,6 @@ contains ! Initialize variables g = ZERO S = ZERO - k_combined = ZERO do l = 1, 3 ! Permutations of estimates @@ -590,8 +597,9 @@ contains k_combined(2) = sqrt(k_combined(2)) end if + err = 0 - end subroutine calculate_combined_keff + end function openmc_get_keff !=============================================================================== ! COUNT_SOURCE_FOR_UFS determines the source fraction in each UFS mesh cell and diff --git a/src/global.F90 b/src/global.F90 index 2690ed151..41f865469 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -256,7 +256,6 @@ module global real(8) :: k_col_abs = ZERO ! sum over batches of k_collision * k_absorption real(8) :: k_col_tra = ZERO ! sum over batches of k_collision * k_tracklength real(8) :: k_abs_tra = ZERO ! sum over batches of k_absorption * k_tracklength - real(8) :: k_combined(2) ! combined best estimate of k-effective ! Shannon entropy logical :: entropy_on = .false. diff --git a/src/output.F90 b/src/output.F90 index 828af717d..9835225e0 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1,8 +1,10 @@ module output + use, intrinsic :: ISO_C_BINDING use, intrinsic :: ISO_FORTRAN_ENV use constants + use eigenvalue, only: openmc_get_keff use endf, only: reaction_name use error, only: fatal_error, warning use geometry_header, only: Cell, Universe, Lattice, RectLattice, & @@ -608,6 +610,8 @@ contains real(8) :: t_n1 ! t-value with N-1 degrees of freedom real(8) :: t_n3 ! t-value with N-3 degrees of freedom real(8) :: x(2) ! mean and standard deviation + real(C_DOUBLE) :: k_combined(2) + integer(C_INT) :: err ! display header block for results call header("Results", 4) @@ -634,8 +638,11 @@ contains write(ou,102) "k-effective (Track-length)", x(1), t_n1 * x(2) x(:) = mean_stdev(r(:, K_ABSORPTION), n) write(ou,102) "k-effective (Absorption)", x(1), t_n1 * x(2) - if (n > 3) write(ou,102) "Combined k-effective", k_combined(1), & - t_n3 * k_combined(2) + if (n > 3) then + err = openmc_get_keff(k_combined) + write(ou,102) "Combined k-effective", k_combined(1), & + t_n3 * k_combined(2) + end if end if x(:) = mean_stdev(global_tallies(:, LEAKAGE), n) write(ou,102) "Leakage Fraction", x(1), t_n1 * x(2) diff --git a/src/simulation.F90 b/src/simulation.F90 index 87a17452d..505d5b528 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -5,9 +5,8 @@ module simulation use cmfd_execute, only: cmfd_init_batch, execute_cmfd use constants, only: ZERO use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & - calculate_combined_keff, calculate_generation_keff, & - shannon_entropy, synchronize_bank, keff_generation, & - k_sum + calculate_generation_keff, shannon_entropy, & + synchronize_bank, keff_generation, k_sum #ifdef _OPENMP use eigenvalue, only: join_bank_from_threads #endif @@ -300,9 +299,6 @@ contains if (run_mode == MODE_EIGENVALUE) then ! Perform CMFD calculation if on if (cmfd_on) call execute_cmfd() - - ! Calculate combined estimate of k-effective - if (master) call calculate_combined_keff() end if ! Check_triggers @@ -327,13 +323,6 @@ contains call write_source_point() end if - if (master .and. current_batch == n_max_batches .and. & - run_mode == MODE_EIGENVALUE) then - ! Make sure combined estimate of k-effective is calculated at the last - ! batch in case no state point is written - call calculate_combined_keff() - end if - end subroutine finalize_batch !=============================================================================== diff --git a/src/state_point.F90 b/src/state_point.F90 index e4c9a43ae..f48b5638b 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -11,11 +11,12 @@ module state_point ! intervals, using the tag. !=============================================================================== - use, intrinsic :: ISO_C_BINDING, only: c_loc, c_ptr + use, intrinsic :: ISO_C_BINDING use hdf5 use constants + use eigenvalue, only: openmc_get_keff use endf, only: reaction_name use error, only: fatal_error, warning use global @@ -46,6 +47,8 @@ contains integer(HID_T) :: cmfd_group, tallies_group, tally_group, meshes_group, & mesh_group, filters_group, filter_group, derivs_group, & deriv_group, runtime_group + integer(C_INT) :: err + real(C_DOUBLE) :: k_combined(2) character(MAX_WORD_LEN), allocatable :: str_array(:) character(MAX_FILE_LEN) :: filename type(TallyObject), pointer :: tally @@ -117,6 +120,7 @@ contains call write_dataset(file_id, "k_col_abs", k_col_abs) call write_dataset(file_id, "k_col_tra", k_col_tra) call write_dataset(file_id, "k_abs_tra", k_abs_tra) + err = openmc_get_keff(k_combined) call write_dataset(file_id, "k_combined", k_combined) ! Write out CMFD info @@ -647,7 +651,6 @@ contains integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group integer(HID_T) :: tally_group - real(8) :: real_array(3) logical :: source_present character(MAX_WORD_LEN) :: word @@ -727,7 +730,6 @@ contains call read_dataset(k_col_abs, file_id, "k_col_abs") call read_dataset(k_col_tra, file_id, "k_col_tra") call read_dataset(k_abs_tra, file_id, "k_abs_tra") - call read_dataset(real_array(1:2), file_id, "k_combined") ! Take maximum of statepoint n_inactive and input n_inactive n_inactive = max(n_inactive, int_array(1)) diff --git a/src/trigger.F90 b/src/trigger.F90 index 9eb39e9cc..dc0a10b15 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -1,10 +1,13 @@ module trigger + use, intrinsic :: ISO_C_BINDING + #ifdef MPI use message_passing #endif use constants + use eigenvalue, only: openmc_get_keff use global use string, only: to_str use output, only: warning, write_message @@ -101,10 +104,12 @@ contains integer :: score_index ! scoring bin index integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders + integer(C_INT) :: err real(8) :: uncertainty ! trigger uncertainty real(8) :: std_dev = ZERO ! trigger standard deviation real(8) :: rel_err = ZERO ! trigger relative error real(8) :: ratio ! ratio of the uncertainty/trigger threshold + real(C_DOUBLE) :: k_combined(2) type(TallyObject), pointer :: t ! tally pointer type(TriggerObject), pointer :: trigger ! tally trigger @@ -119,6 +124,7 @@ contains ! Check eigenvalue trigger if (run_mode == MODE_EIGENVALUE) then if (keff_trigger % trigger_type /= 0) then + err = openmc_get_keff(k_combined) select case (keff_trigger % trigger_type) case(VARIANCE) uncertainty = k_combined(2) ** 2 From 09d1dd7f3c53aaf1c80e4510e5f75175ec960e5a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 11:05:07 -0500 Subject: [PATCH 086/123] Reset global variables on openmc_finalize --- CMakeLists.txt | 1 - src/api.F90 | 104 +++++++++++++++++++++++++++++++++++++++++++---- src/finalize.F90 | 40 ------------------ src/global.F90 | 13 ++++-- src/main.F90 | 9 ++-- 5 files changed, 107 insertions(+), 60 deletions(-) delete mode 100644 src/finalize.F90 diff --git a/CMakeLists.txt b/CMakeLists.txt index f83d95625..386c07100 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -320,7 +320,6 @@ set(LIBOPENMC_FORTRAN_SRC src/endf_header.F90 src/energy_distribution.F90 src/error.F90 - src/finalize.F90 src/geometry.F90 src/geometry_header.F90 src/global.F90 diff --git a/src/api.F90 b/src/api.F90 index 45f511f9c..efe772a8c 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -2,19 +2,20 @@ module openmc_api use, intrinsic :: ISO_C_BINDING - use hdf5, only: HID_T + use hdf5, only: HID_T, h5tclose_f, h5close_f use constants, only: K_BOLTZMANN use eigenvalue, only: k_sum, openmc_get_keff - use finalize, only: openmc_finalize use geometry, only: find_cell + use geometry_header, only: root_universe use global use hdf5_interface - use message_passing, only: master + use message_passing use initialize, only: openmc_init use input_xml, only: assign_0K_elastic_scattering, check_data_version use particle_header, only: Particle use plot, only: openmc_plot_geometry + use random_lcg, only: seed use simulation, only: openmc_run use volume_calc, only: openmc_calculate_volumes @@ -70,6 +71,89 @@ contains end if end function openmc_cell_set_temperature +!=============================================================================== +! OPENMC_FINALIZE frees up memory by deallocating arrays and resetting global +! variables +!=============================================================================== + + subroutine openmc_finalize() bind(C) + + integer :: hdf5_err + + ! Clear results + call openmc_reset() + + ! Reset global variables + assume_separate = .false. + check_overlaps = .false. + confidence_intervals = .false. + create_fission_neutrons = .true. + current_batch = 0 + current_gen = 0 + energy_cutoff = ZERO + energy_max_neutron = INFINITY + energy_min_neutron = ZERO + entropy_on = .false. + gen_per_batch = 1 + i_user_tallies = -1 + i_cmfd_tallies = -1 + keff = ONE + legendre_to_tabular = .true. + legendre_to_tabular_points = 33 + n_batch_interval = 1 + n_particles = 0 + n_source_points = 0 + n_state_points = 0 + output_summary = .true. + output_tallies = .true. + particle_restart_run = .false. + pred_batches = .false. + reduce_tallies = .true. + res_scat_on = .false. + res_scat_method = RES_SCAT_ARES + res_scat_energy_min = 0.01_8 + res_scat_energy_max = 1000.0_8 + restart_run = .false. + root_universe = -1 + run_CE = .true. + run_mode = NONE + satisfy_triggers = .false. + seed = 1_8 + source_latest = .false. + source_separate = .false. + source_write = .true. + survival_biasing = .false. + temperature_default = 293.6_8 + temperature_method = TEMPERATURE_NEAREST + temperature_multipole = .false. + temperature_range = [ZERO, ZERO] + temperature_tolerance = 10.0_8 + total_gen = 0 + trigger_on = .false. + ufs = .false. + urr_ptables_on = .true. + verbosity = 7 + weight_cutoff = 0.25_8 + weight_survive = ONE + write_all_tracks = .false. + write_initial_source = .false. + + ! Deallocate arrays + call free_memory() + + ! Release compound datatypes + call h5tclose_f(hdf5_bank_t, hdf5_err) + + ! Close FORTRAN interface. + call h5close_f(hdf5_err) + +#ifdef MPI + ! Free all MPI types + call MPI_TYPE_FREE(MPI_BANK, mpi_err) +#endif + + end subroutine openmc_finalize + !=============================================================================== ! OPENMC_FIND determines the ID or a cell or material at a given point in space !=============================================================================== @@ -291,12 +375,14 @@ contains subroutine openmc_reset() bind(C) integer :: i - do i = 1, size(tallies) - tallies(i) % n_realizations = 0 - if (allocated(tallies(i) % results)) then - tallies(i) % results(:, :, :) = ZERO - end if - end do + if (allocated(tallies)) then + do i = 1, size(tallies) + tallies(i) % n_realizations = 0 + if (allocated(tallies(i) % results)) then + tallies(i) % results(:, :, :) = ZERO + end if + end do + end if ! Reset global tallies n_realizations = 0 diff --git a/src/finalize.F90 b/src/finalize.F90 deleted file mode 100644 index 6164371a0..000000000 --- a/src/finalize.F90 +++ /dev/null @@ -1,40 +0,0 @@ -module finalize - - use, intrinsic :: ISO_C_BINDING - - use hdf5, only: h5tclose_f, h5close_f - - use global - use hdf5_interface, only: hdf5_bank_t - use message_passing - - implicit none - -contains - -!=============================================================================== -! FINALIZE_RUN does all post-simulation tasks such as calculating tally -! statistics and writing out tallies -!=============================================================================== - - subroutine openmc_finalize() bind(C) - - integer :: hdf5_err - - ! Deallocate arrays - call free_memory() - - ! Release compound datatypes - call h5tclose_f(hdf5_bank_t, hdf5_err) - - ! Close FORTRAN interface. - call h5close_f(hdf5_err) - -#ifdef MPI - ! Free all MPI types - call MPI_TYPE_FREE(MPI_BANK, mpi_err) -#endif - - end subroutine openmc_finalize - -end module finalize diff --git a/src/global.F90 b/src/global.F90 index 41f865469..9d9002e9c 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -140,7 +140,7 @@ module global integer :: max_order ! Whether or not to convert Legendres to tabulars - logical :: legendre_to_tabular = .True. + logical :: legendre_to_tabular = .true. ! Number of points to use in the Legendre to tabular conversion integer :: legendre_to_tabular_points = 33 @@ -466,6 +466,7 @@ contains if (allocated(surfaces)) deallocate(surfaces) if (allocated(materials)) deallocate(materials) if (allocated(plots)) deallocate(plots) + if (allocated(volume_calcs)) deallocate(volume_calcs) ! Deallocate geometry debugging information if (allocated(overlap_check_cnt)) deallocate(overlap_check_cnt) @@ -478,6 +479,7 @@ contains end do deallocate(nuclides) end if + if (allocated(libraries)) deallocate(libraries) if (allocated(res_scat_nuclides)) deallocate(res_scat_nuclides) @@ -486,7 +488,6 @@ contains if (allocated(macro_xs)) deallocate(macro_xs) if (allocated(sab_tables)) deallocate(sab_tables) - if (allocated(micro_xs)) deallocate(micro_xs) ! Deallocate external source if (allocated(external_source)) deallocate(external_source) @@ -501,21 +502,24 @@ contains if (allocated(meshes)) deallocate(meshes) if (allocated(filters)) deallocate(filters) if (allocated(tallies)) deallocate(tallies) - if (allocated(filter_matches)) deallocate(filter_matches) ! Deallocate fission and source bank and entropy !$omp parallel if (allocated(fission_bank)) deallocate(fission_bank) + if (allocated(filter_matches)) deallocate(filter_matches) + if (allocated(tally_derivs)) deallocate(tally_derivs) !$omp end parallel #ifdef _OPENMP if (allocated(master_fission_bank)) deallocate(master_fission_bank) #endif if (allocated(source_bank)) deallocate(source_bank) - if (allocated(entropy_p)) deallocate(entropy_p) ! Deallocate array of work indices if (allocated(work_index)) deallocate(work_index) + if (allocated(energy_bins)) deallocate(energy_bins) + if (allocated(energy_bin_avg)) deallocate(energy_bin_avg) + ! Deallocate CMFD call deallocate_cmfd(cmfd) @@ -541,6 +545,7 @@ contains call plot_dict % clear() call nuclide_dict % clear() call sab_dict % clear() + call library_dict % clear() ! Clear statepoint and sourcepoint batch set call statepoint_batch % clear() diff --git a/src/main.F90 b/src/main.F90 index 723c87df9..b8c96927e 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -1,14 +1,11 @@ program main use constants - use finalize, only: openmc_finalize use global - use initialize, only: openmc_init use message_passing - use particle_restart, only: run_particle_restart - use plot, only: openmc_plot_geometry - use simulation, only: openmc_run - use volume_calc, only: openmc_calculate_volumes + use openmc_api, only: openmc_init, openmc_finalize, openmc_run, & + openmc_plot_geometry, openmc_calculate_volumes + use particle_restart, only: run_particle_restart implicit none From 27870417ca64be355117b5cdd7f80c1e22129ba3 Mon Sep 17 00:00:00 2001 From: tjlaboss Date: Thu, 27 Jul 2017 11:32:15 -0600 Subject: [PATCH 087/123] Make use of openmc.data.neutron.get_metadata() Changed _get_metadata() to a public function and used it in openmc-update-inputs --- openmc/data/neutron.py | 4 ++-- scripts/openmc-update-inputs | 10 ++-------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 1d3a0176d..07b1f7686 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -34,7 +34,7 @@ from openmc.mixin import EqualityMixin _RESONANCE_ENERGY_GRID = np.logspace(-3, 3, 61) -def _get_metadata(zaid, metastable_scheme='nndc'): +def get_metadata(zaid, metastable_scheme='nndc'): """Return basic identifying data for a nuclide with a given ZAID. Parameters @@ -677,7 +677,7 @@ class IncidentNeutron(EqualityMixin): # If mass number hasn't been specified, make an educated guess zaid, xs = ace.name.split('.') name, element, Z, mass_number, metastable = \ - _get_metadata(int(zaid), metastable_scheme) + get_metadata(int(zaid), metastable_scheme) # Assign temperature to the running list kTs = [ace.temperature*EV_PER_MEV] diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index 7143851d8..ea6506942 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -241,15 +241,9 @@ def update_geometry(geometry_root): def replace_zaid(name): """Replace a nuclide name in the ZAID notation with the correct name.""" - # TODO: Account for metastable and any other special cases - name = name.strip() - z = int(name[:-3]) - a = int(name[-3:]) # Strips leading 0s - symbol = openmc.data.ATOMIC_SYMBOL[z] - name = str(symbol).title() + str(a) + zaid = int(name.strip()) + name = openmc.data.neutron.get_metadata(zaid)[0] return name - - def update_materials(root): """Update the given XML materials tree. Return True if changes were made.""" From 6cada92c50c8e2bdec93b9610ec54ab86c3d151a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 13:18:49 -0500 Subject: [PATCH 088/123] Update tallies.xml in examples to separate --- examples/xml/basic/tallies.xml | 21 +++++++++++++++------ examples/xml/lattice/nested/tallies.xml | 6 +++++- examples/xml/lattice/simple/tallies.xml | 6 +++++- examples/xml/pincell/tallies.xml | 11 +++++++++-- examples/xml/pincell_multigroup/tallies.xml | 9 +++++++-- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/examples/xml/basic/tallies.xml b/examples/xml/basic/tallies.xml index 26e61995d..a125e9ca2 100644 --- a/examples/xml/basic/tallies.xml +++ b/examples/xml/basic/tallies.xml @@ -1,21 +1,30 @@ + + 100 + + + + 0 20.0e6 + + + + 0 20.0e6 + + - + 1 total scatter nu-scatter absorption fission nu-fission - - + 1 2 total scatter nu-scatter absorption fission nu-fission - - - + 1 2 3 scatter nu-scatter nu-fission diff --git a/examples/xml/lattice/nested/tallies.xml b/examples/xml/lattice/nested/tallies.xml index 89c0774f1..d342174a9 100644 --- a/examples/xml/lattice/nested/tallies.xml +++ b/examples/xml/lattice/nested/tallies.xml @@ -8,8 +8,12 @@ 1.0 1.0 + + 1 + + - + 1 total diff --git a/examples/xml/lattice/simple/tallies.xml b/examples/xml/lattice/simple/tallies.xml index 89c0774f1..d342174a9 100644 --- a/examples/xml/lattice/simple/tallies.xml +++ b/examples/xml/lattice/simple/tallies.xml @@ -8,8 +8,12 @@ 1.0 1.0 + + 1 + + - + 1 total diff --git a/examples/xml/pincell/tallies.xml b/examples/xml/pincell/tallies.xml index f740530cf..642bdd7cd 100644 --- a/examples/xml/pincell/tallies.xml +++ b/examples/xml/pincell/tallies.xml @@ -7,9 +7,16 @@ 0.62992 0.62992 1.e50 + + 1 + + + + 0. 4. 20.0e6 + + - - + 1 2 flux fission nu-fission diff --git a/examples/xml/pincell_multigroup/tallies.xml b/examples/xml/pincell_multigroup/tallies.xml index 1591a556b..d84e129f2 100644 --- a/examples/xml/pincell_multigroup/tallies.xml +++ b/examples/xml/pincell_multigroup/tallies.xml @@ -5,9 +5,14 @@ -0.63 -0.63 -1e+50 0.63 0.63 1e+50 + + 1e-05 0.0635 10.0 100.0 1000.0 500000.0 1000000.0 20000000.0 + + + 1 + - - + 1 2 flux fission nu-fission From 306c96c74b20e9813d1a444605e6ca6079480c78 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 14:00:49 -0500 Subject: [PATCH 089/123] Broadcast tally results at end of simulation --- src/simulation.F90 | 33 ++++++++++++++++++++++++++++++--- src/tally.F90 | 6 +++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/simulation.F90 b/src/simulation.F90 index 505d5b528..7edaf8be2 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -20,7 +20,7 @@ module simulation use source, only: initialize_source, sample_external_source use state_point, only: write_state_point, write_source_point use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies + use tally, only: accumulate_tallies, setup_active_usertallies use trigger, only: check_triggers use tracking, only: transport @@ -285,9 +285,9 @@ contains subroutine finalize_batch() - ! Collect tallies + ! Reduce tallies onto master process and accumulate call time_tallies % start() - call synchronize_tallies() + call accumulate_tallies() call time_tallies % stop() ! Reset global tally results @@ -390,6 +390,10 @@ contains subroutine finalize_simulation() + integer :: i ! loop index for tallies + integer :: n ! size of arrays + real(8) :: temp(3) ! temporary array for communication + !$omp parallel deallocate(micro_xs) !$omp end parallel @@ -400,6 +404,29 @@ contains ! Start finalization timer call time_finalize % start() +#ifdef MPI + ! Broadcast tally results so that each process has access to results + do i = 1, size(tallies) + n = size(tallies(i) % results) + call MPI_BCAST(tallies(i) % results, n, MPI_DOUBLE, 0, & + mpi_intracomm, mpi_err) + end do + + ! Also broadcast global tally results + n = size(global_tallies) + call MPI_BCAST(global_tallies, n, MPI_DOUBLE, 0, mpi_intracomm, mpi_err) + + ! These guys are needed so that non-master processes can calculate the + ! combined estimate of k-effective + temp(1) = k_col_abs + temp(2) = k_col_tra + temp(3) = k_abs_tra + call MPI_BCAST(temp, 3, MPI_REAL8, 0, mpi_intracomm, mpi_err) + k_col_abs = temp(1) + k_col_tra = temp(2) + k_abs_tra = temp(3) +#endif + ! Write tally results to tallies.out if (output_tallies .and. master) call write_tallies() if (check_overlaps) call reduce_overlap_count() diff --git a/src/tally.F90 b/src/tally.F90 index 14940551b..b8e46678c 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4182,11 +4182,11 @@ contains end subroutine zero_flux_derivs !=============================================================================== -! SYNCHRONIZE_TALLIES accumulates the sum of the contributions from each history +! ACCUMULATE_TALLIES accumulates the sum of the contributions from each history ! within the batch to a new random variable !=============================================================================== - subroutine synchronize_tallies() + subroutine accumulate_tallies() integer :: i real(C_DOUBLE) :: k_col ! Copy of batch collision estimate of keff @@ -4236,7 +4236,7 @@ contains end do end if - end subroutine synchronize_tallies + end subroutine accumulate_tallies !=============================================================================== ! REDUCE_TALLY_RESULTS collects all the results from tallies onto one processor From 0fba66b8fe847d0b6081e262d88ea5f5a3b315ef Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 14:16:00 -0500 Subject: [PATCH 090/123] Reset a few more global variables, ugh --- src/api.F90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/api.F90 b/src/api.F90 index efe772a8c..dc9548f10 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -101,9 +101,15 @@ contains legendre_to_tabular = .true. legendre_to_tabular_points = 33 n_batch_interval = 1 + n_filters = 0 + n_meshes = 0 n_particles = 0 n_source_points = 0 n_state_points = 0 + n_tallies = 0 + n_user_filters = 0 + n_user_meshes = 0 + n_user_tallies = 0 output_summary = .true. output_tallies = .true. particle_restart_run = .false. From c124a4e8e3c43fccb6bff981ea13027c602f84fd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 14:53:35 -0500 Subject: [PATCH 091/123] Get rid of almost all MPI_IN_PLACE specifiers --- src/mesh.F90 | 36 ++++++++++++------------------------ src/simulation.F90 | 12 +++++------- src/state_point.F90 | 19 +++++-------------- src/tally.F90 | 38 +++++++++++++------------------------- 4 files changed, 35 insertions(+), 70 deletions(-) diff --git a/src/mesh.F90 b/src/mesh.F90 index b778cbdf0..393df5dda 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -137,21 +137,19 @@ contains real(8), intent(in), optional :: energies(:) ! energy grid to search integer(8), intent(in), optional :: size_bank ! # of bank sites (on each proc) logical, intent(inout), optional :: sites_outside ! were there sites outside mesh? + real(8), allocatable :: cnt_(:,:,:,:) integer :: i ! loop index for local fission sites integer :: n_sites ! size of bank array integer :: ijk(3) ! indices on mesh - integer :: n_groups ! number of groups in energies + integer :: n ! number of energy groups / size integer :: e_bin ! energy_bin logical :: in_mesh ! was single site outside mesh? logical :: outside ! was any site outside mesh? -#ifdef MPI - integer :: n ! total size of count variable - real(8) :: dummy ! temporary receive buffer for non-root reductions -#endif ! initialize variables - cnt = ZERO + allocate(cnt_(size(cnt,1), size(cnt,2), size(cnt,3), size(cnt,4))) + cnt_ = ZERO outside = .false. ! Set size of bank @@ -163,9 +161,9 @@ contains ! Determine number of energies in group structure if (present(energies)) then - n_groups = size(energies) - 1 + n = size(energies) - 1 else - n_groups = 1 + n = 1 end if ! loop over fission sites and count how many are in each mesh box @@ -183,40 +181,30 @@ contains if (present(energies)) then if (bank_array(i) % E < energies(1)) then e_bin = 1 - elseif (bank_array(i) % E > energies(n_groups+1)) then - e_bin = n_groups + elseif (bank_array(i) % E > energies(n + 1)) then + e_bin = n else - e_bin = binary_search(energies, n_groups + 1, bank_array(i) % E) + e_bin = binary_search(energies, n + 1, bank_array(i) % E) end if else e_bin = 1 end if ! add to appropriate mesh box - cnt(e_bin,ijk(1),ijk(2),ijk(3)) = cnt(e_bin,ijk(1),ijk(2),ijk(3)) + & + cnt_(e_bin,ijk(1),ijk(2),ijk(3)) = cnt_(e_bin,ijk(1),ijk(2),ijk(3)) + & bank_array(i) % wgt end do FISSION_SITES #ifdef MPI - ! determine total number of mesh cells - n = n_groups * size(cnt,2) * size(cnt,3) * size(cnt,4) - ! collect values from all processors - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, cnt, n, MPI_REAL8, MPI_SUM, 0, & - mpi_intracomm, mpi_err) - else - ! Receive buffer not significant at other processors - call MPI_REDUCE(cnt, dummy, n, MPI_REAL8, MPI_SUM, 0, & - mpi_intracomm, mpi_err) - end if + n = size(cnt_) + call MPI_REDUCE(cnt_, cnt, n, MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) ! Check if there were sites outside the mesh for any processor if (present(sites_outside)) then call MPI_REDUCE(outside, sites_outside, 1, MPI_LOGICAL, MPI_LOR, 0, & mpi_intracomm, mpi_err) end if - #else sites_outside = outside #endif diff --git a/src/simulation.F90 b/src/simulation.F90 index 7edaf8be2..ced5a74f1 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -448,14 +448,12 @@ contains subroutine reduce_overlap_count() + integer(8) :: temp + #ifdef MPI - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - else - call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - end if + call MPI_REDUCE(overlap_check_cnt, temp, n_cells, MPI_INTEGER8, & + MPI_SUM, 0, mpi_intracomm, mpi_err) + overlap_check_cnt = temp #endif end subroutine reduce_overlap_count diff --git a/src/state_point.F90 b/src/state_point.F90 index f48b5638b..301a4efdd 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -539,18 +539,15 @@ contains tallies_group = open_group(file_id, "tallies") end if - ! Copy global tallies into temporary array for reducing - n_bins = 3 * N_GLOBAL_TALLIES - global_temp(:,:) = global_tallies(:,:) - if (master) then - ! The MPI_IN_PLACE specifier allows the master to copy values into a - ! receive buffer without having a temporary variable #ifdef MPI - call MPI_REDUCE(MPI_IN_PLACE, global_temp, n_bins, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) + ! Reduce global tallies + n_bins = size(global_tallies) + call MPI_REDUCE(global_tallies, global_temp, n_bins, MPI_REAL8, MPI_SUM, & + 0, mpi_intracomm, mpi_err) #endif + if (master) then ! Transfer values to value on master if (current_batch == n_max_batches .or. satisfy_triggers) then global_tallies(:,:) = global_temp(:,:) @@ -558,12 +555,6 @@ contains ! Write out global tallies sum and sum_sq call write_dataset(file_id, "global_tallies", global_temp) - else - ! Receive buffer not significant at other processors -#ifdef MPI - call MPI_REDUCE(global_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) -#endif end if if (tallies_on) then diff --git a/src/tally.F90 b/src/tally.F90 index b8e46678c..8f871e39b 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4249,13 +4249,12 @@ contains integer :: n ! number of filter bins integer :: m ! number of score bins integer :: n_bins ! total number of bins - real(8), allocatable :: tally_temp(:,:) ! contiguous array of results - real(8) :: global_temp(N_GLOBAL_TALLIES) + real(C_DOUBLE), allocatable :: tally_temp(:,:) ! contiguous array of results + real(C_DOUBLE) :: temp(N_GLOBAL_TALLIES), temp2(N_GLOBAL_TALLIES) real(8) :: dummy ! temporary receive buffer for non-root reduces - type(TallyObject), pointer :: t do i = 1, active_tallies % size() - t => tallies(active_tallies % data(i)) + associate (t => tallies(active_tallies % data(i))) m = t % total_score_bins n = t % total_filter_bins @@ -4282,37 +4281,26 @@ contains t % results(RESULT_VALUE,:,:) = ZERO end if + end associate + deallocate(tally_temp) end do - ! Copy global tallies into array to be reduced - global_temp = global_tallies(RESULT_VALUE, :) - + ! Reduce global tallies onto master + temp = global_tallies(RESULT_VALUE, :) + call MPI_REDUCE(temp, temp2, N_GLOBAL_TALLIES, MPI_DOUBLE, MPI_SUM, & + 0, mpi_intracomm, mpi_err) if (master) then - call MPI_REDUCE(MPI_IN_PLACE, global_temp, N_GLOBAL_TALLIES, & - MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) - - ! Transfer values back to global_tallies on master - global_tallies(RESULT_VALUE, :) = global_temp + global_tallies(RESULT_VALUE, :) = temp2 else - ! Receive buffer not significant at other processors - call MPI_REDUCE(global_temp, dummy, N_GLOBAL_TALLIES, & - MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) - - ! Reset value on other processors global_tallies(RESULT_VALUE, :) = ZERO end if ! We also need to determine the total starting weight of particles from the ! last realization - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, total_weight, 1, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) - else - ! Receive buffer not significant at other processors - call MPI_REDUCE(total_weight, dummy, 1, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) - end if + temp(1) = total_weight + call MPI_REDUCE(temp, total_weight, 1, MPI_REAL8, MPI_SUM, & + 0, mpi_intracomm, mpi_err) end subroutine reduce_tally_results #endif From ba318df3c42d8706bb0a6ea2b2fe9d4ec68e512d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 15:25:06 -0500 Subject: [PATCH 092/123] Don't use MPI_IN_PLACE for reducing tally results --- src/tally.F90 | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 8f871e39b..8b52ad032 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4249,41 +4249,34 @@ contains integer :: n ! number of filter bins integer :: m ! number of score bins integer :: n_bins ! total number of bins - real(C_DOUBLE), allocatable :: tally_temp(:,:) ! contiguous array of results + real(C_DOUBLE), allocatable :: tally_temp(:,:) ! contiguous array of results + real(C_DOUBLE), allocatable :: tally_temp2(:,:) ! reduced contiguous results real(C_DOUBLE) :: temp(N_GLOBAL_TALLIES), temp2(N_GLOBAL_TALLIES) - real(8) :: dummy ! temporary receive buffer for non-root reduces do i = 1, active_tallies % size() associate (t => tallies(active_tallies % data(i))) - m = t % total_score_bins - n = t % total_filter_bins - n_bins = m*n + m = size(t % results, 2) + n = size(t % results, 3) + n_bins = m*n - allocate(tally_temp(m,n)) + allocate(tally_temp(m,n), tally_temp2(m,n)) - tally_temp = t % results(RESULT_VALUE,:,:) - - if (master) then - ! The MPI_IN_PLACE specifier allows the master to copy values into - ! a receive buffer without having a temporary variable - call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & + ! Reduce contiguous set of tally results + tally_temp = t % results(RESULT_VALUE,:,:) + call MPI_REDUCE(tally_temp, tally_temp2, n_bins, MPI_DOUBLE, & MPI_SUM, 0, mpi_intracomm, mpi_err) - ! Transfer values to value on master - t % results(RESULT_VALUE,:,:) = tally_temp - else - ! Receive buffer not significant at other processors - call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, & - MPI_SUM, 0, mpi_intracomm, mpi_err) - - ! Reset value on other processors - t % results(RESULT_VALUE,:,:) = ZERO - end if + if (master) then + ! Transfer values to value on master + t % results(RESULT_VALUE,:,:) = tally_temp2 + else + ! Reset value on other processors + t % results(RESULT_VALUE,:,:) = ZERO + end if + deallocate(tally_temp, tally_temp2) end associate - - deallocate(tally_temp) end do ! Reduce global tallies onto master From b4b7e3f7c62b478cd4df0daeee24ce00cd495051 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 27 Jul 2017 16:02:02 -0500 Subject: [PATCH 093/123] Fix two bugs --- src/mesh.F90 | 1 + src/simulation.F90 | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mesh.F90 b/src/mesh.F90 index 393df5dda..427710790 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -207,6 +207,7 @@ contains end if #else sites_outside = outside + cnt = cnt_ #endif end subroutine count_bank_sites diff --git a/src/simulation.F90 b/src/simulation.F90 index ced5a74f1..8a32493ca 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -406,11 +406,13 @@ contains #ifdef MPI ! Broadcast tally results so that each process has access to results - do i = 1, size(tallies) - n = size(tallies(i) % results) - call MPI_BCAST(tallies(i) % results, n, MPI_DOUBLE, 0, & - mpi_intracomm, mpi_err) - end do + if (allocated(tallies)) then + do i = 1, size(tallies) + n = size(tallies(i) % results) + call MPI_BCAST(tallies(i) % results, n, MPI_DOUBLE, 0, & + mpi_intracomm, mpi_err) + end do + end if ! Also broadcast global tally results n = size(global_tallies) From 35d24a955d29abfde0d3c08970a6f2836621f73c Mon Sep 17 00:00:00 2001 From: liangjg Date: Fri, 28 Jul 2017 10:08:37 -0400 Subject: [PATCH 094/123] skip adding 0K elastic xs if it already exists --- openmc/data/neutron.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 1d3a0176d..ed2f4f8b7 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -866,12 +866,13 @@ class IncidentNeutron(EqualityMixin): data.fission_energy = FissionEnergyRelease.from_endf(ev, data) # Add 0K elastic scattering cross section - pendf = Evaluation(pendf_file) - file_obj = StringIO(pendf.section[3, 2]) - get_head_record(file_obj) - params, xs = get_tab1_record(file_obj) - data.energy['0K'] = xs.x - data[2].xs['0K'] = xs + if '0K' not in data.energy: + pendf = Evaluation(pendf_file) + file_obj = StringIO(pendf.section[3, 2]) + get_head_record(file_obj) + params, xs = get_tab1_record(file_obj) + data.energy['0K'] = xs.x + data[2].xs['0K'] = xs finally: # Get rid of temporary files From 3a6ee672c61609e62ca0d4623fabe7b28f5b1e94 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 28 Jul 2017 10:31:28 -0500 Subject: [PATCH 095/123] Add three more functions for getting/setting nuclide densities in materials --- openmc/capi.py | 88 ++++++++++++++++++++++++++++++++++++++++ src/api.F90 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) diff --git a/openmc/capi.py b/openmc/capi.py index f4c9a7f3c..2164a9d81 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -12,6 +12,7 @@ __all__ = ['OpenMCLibrary', 'lib', 'lib_context'] _int3 = c_int*3 _double3 = c_double*3 +_int_array = POINTER(POINTER(c_int)) _double_array = POINTER(POINTER(c_double)) @@ -47,14 +48,25 @@ class OpenMCLibrary(object): self._dll.openmc_get_keff.restype = c_int self._dll.openmc_load_nuclide.argtypes = [c_char_p] self._dll.openmc_load_nuclide.restype = c_int + + # Material interface self._dll.openmc_material_add_nuclide.argtypes = [ c_int32, c_char_p, c_double] self._dll.openmc_material_add_nuclide.restype = c_int self._dll.openmc_material_get_densities.argtypes = [ c_int32, _double_array] self._dll.openmc_material_get_densities.restype = c_int + self._dll.openmc_material_get_nuclides.argtypes = [ + c_int32, _int_array] + self._dll.openmc_material_get_nuclides.restype = c_int self._dll.openmc_material_set_density.argtypes = [c_int32, c_double] self._dll.openmc_material_set_density.restype = c_int + self._dll.openmc_material_set_densities.argtypes = [ + c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] + self._dll.openmc_material_set_densities.restype = c_int + + self._dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] + self._dll.openmc_nuclide_name.restype = c_int self._dll.openmc_plot_geometry.restype = None self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None @@ -215,6 +227,27 @@ class OpenMCLibrary(object): else: return None + def material_get_nuclides(self, mat_id): + """Get list of nuclides in a material. + + Parameters + ---------- + mat_id : int + ID of the material + + Returns + ------- + list of str + Nuclides in specified material + + """ + data = POINTER(c_int)() + n = self._dll.openmc_material_get_nuclides(mat_id, data) + if data: + return [self.nuclide_name(data[i]) for i in range(n)] + else: + return None + def material_set_density(self, mat_id, density): """Set density of a material. @@ -233,6 +266,61 @@ class OpenMCLibrary(object): """ return self._dll.openmc_material_set_density(mat_id, density) + def material_set_densities(self, mat_id, nuclides, densities): + """Set the densities of a list of nuclides in a material + + Parameters + ---------- + mat_id : int + ID of the material + nuclides : iterable of str + Nuclide names + densities : iterable of float + Corresponding densities in atom/b-cm + + Returns + ------- + int + Return status (negative if an error occurs). + + """ + # Convert strings to an array of char* + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + + # Get numpy array as a double* + d = np.asarray(densities) + dp = d.ctypes.data_as(POINTER(c_double)) + + return self._dll.openmc_material_set_densities( + mat_id, len(nuclides), nucs, dp) + + def nuclide_name(self, index): + """Name of nuclide with given index + + Parameter + --------- + index : int + Index in internal nuclides array + + Returns + ------- + str + Name of nuclide + + """ + name = c_char_p() + err = self._dll.openmc_nuclide_name(index, name) + + # Find blank in name + if err == 0: + i = 0 + while name.value[i:i+1] != b' ': + i += 1 + return name.value[:i].decode() + else: + return None + def plot_geometry(self): """Plot geometry""" return self._dll.openmc_plot_geometry() diff --git a/src/api.F90 b/src/api.F90 index dc9548f10..50beddd5d 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -19,6 +19,8 @@ module openmc_api use simulation, only: openmc_run use volume_calc, only: openmc_calculate_volumes + implicit none + private public :: openmc_calculate_volumes public :: openmc_cell_set_temperature @@ -29,7 +31,10 @@ module openmc_api public :: openmc_load_nuclide public :: openmc_material_add_nuclide public :: openmc_material_get_densities + public :: openmc_material_get_nuclides public :: openmc_material_set_density + public :: openmc_material_set_densities + public :: openmc_nuclide_name public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run @@ -202,6 +207,7 @@ contains character(kind=C_CHAR) :: name(*) integer(C_INT) :: err + integer :: i_library integer :: n integer(HID_T) :: file_id integer(HID_T) :: group_id @@ -337,6 +343,8 @@ contains type(C_PTR), intent(out) :: ptr integer(C_INT) :: n + integer :: i + ptr = C_NULL_PTR n = 0 if (allocated(materials)) then @@ -352,6 +360,55 @@ contains end if end function openmc_material_get_densities +!=============================================================================== +! OPENMC_MATERIAL_GET_NUCLIDES returns an array that indicates for each nuclide +! in a material its index in the global nuclides array +!=============================================================================== + + function openmc_material_get_nuclides(id, ptr) result(n) bind(C) + integer(C_INT32_T), intent(in), value :: id + type(C_PTR), intent(out) :: ptr + integer(C_INT) :: n + + integer :: i + + ptr = C_NULL_PTR + n = 0 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + if (allocated(m % nuclide)) then + ptr = C_LOC(m % nuclide(1)) + n = size(m % nuclide) + end if + end associate + end if + end if + end function openmc_material_get_nuclides + +!=============================================================================== +! OPENMC_NUCLIDE_NAME returns the name of a nuclide with a given index +!=============================================================================== + + function openmc_nuclide_name(index, name) result(err) bind(C) + integer(C_INT), value, intent(in) :: index + type(c_ptr), intent(out) :: name + integer(C_INT) :: err + + character(C_CHAR), pointer :: name_ + + err = -1 + name = C_NULL_PTR + if (allocated(nuclides)) then + if (index >= 1 .and. index <= size(nuclides)) then + name_ => nuclides(index) % name(1:1) + name = C_LOC(name_) + err = 0 + end if + end if + end function openmc_nuclide_name + !=============================================================================== ! OPENMC_MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm !=============================================================================== @@ -374,6 +431,57 @@ contains end if end function openmc_material_set_density +!=============================================================================== +! OPENMC_MATERIAL_SET_DENSITIES sets the densities for a list of nuclides in a +! material. If the nuclides don't already exist in the material, they will be +! added +!=============================================================================== + + function openmc_material_set_densities(id, n, name, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: id + integer(C_INT), value, intent(in) :: n + type(C_PTR), intent(in) :: name(n) + real(C_DOUBLE), intent(in) :: density(n) + integer(C_INT) :: err + + integer :: i, j, k + logical :: has_nuclide + character(C_CHAR), pointer :: string(:) + character(len=:, kind=C_CHAR), allocatable :: name_ + + err = -1 + if (allocated(materials)) then + if (material_dict % has_key(id)) then + i = material_dict % get_key(id) + associate (m => materials(i)) + do i = 1, n + ! Convert C string to Fortran string + call c_f_pointer(name(i), string, [10]) + name_ = to_f_string(string) + + ! Find corresponding nuclide and set density + has_nuclide = .false. + do j = 1, size(m % nuclide) + k = m % nuclide(j) + if (nuclides(k) % name == name_) then + m % atom_density(j) = density(i) + has_nuclide = .true. + end if + end do + + ! If nuclide wasn't found, try to load it + err = openmc_material_add_nuclide(id, string, density(i)) + if (err /= 0) return + end do + + ! Set total density to the sum of the vector + err = m % set_density(sum(m % atom_density), nuclides) + end associate + end if + end if + + end function openmc_material_set_densities + !=============================================================================== ! OPENMC_RESET resets all tallies !=============================================================================== From 7988bad6dacdf29b04210f8f16edc7a29fb2d684 Mon Sep 17 00:00:00 2001 From: liangjg Date: Fri, 28 Jul 2017 11:56:32 -0400 Subject: [PATCH 096/123] made error tolerance a parameter for generating data from njoy --- openmc/data/neutron.py | 6 ++++-- openmc/data/njoy.py | 24 +++++++++++++++--------- openmc/data/thermal.py | 7 +++++-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index ed2f4f8b7..8accabfc7 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -824,7 +824,7 @@ class IncidentNeutron(EqualityMixin): return data @classmethod - def from_njoy(cls, filename, temperatures=None, **kwargs): + def from_njoy(cls, filename, temperatures=None, error=0.001, **kwargs): """Generate incident neutron data by running NJOY. Parameters @@ -834,6 +834,8 @@ class IncidentNeutron(EqualityMixin): temperatures : iterable of float Temperatures in Kelvin to produce data at. If omitted, data is produced at room temperature (293.6 K) + error : float, optional + Fractional error tolerance for NJOY processing. **kwargs Keyword arguments passed to :func:`openmc.data.njoy.make_ace` @@ -851,7 +853,7 @@ class IncidentNeutron(EqualityMixin): ace_file = os.path.join(tmpdir, 'ace') xsdir_file = os.path.join(tmpdir, 'xsdir') pendf_file = os.path.join(tmpdir, 'pendf') - make_ace(filename, temperatures, ace_file, xsdir_file, + make_ace(filename, temperatures, error, ace_file, xsdir_file, pendf_file, **kwargs) # Create instance from ACE tables within library diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index b6fce5e3e..5365d9740 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -68,14 +68,14 @@ reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% 20 21 '{library} PENDF for {zsymam}'/ {mat} 2/ -0.001 0.0 0.003/ err tempr errmax +{error}/ err '{library}: {zsymam}'/ 'Processed by NJOY'/ 0/ broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 21 22 {mat} {num_temp} 0 0 0. / -0.001 1.0e6 0.003 / +{error}/ errthn {temps} 0/ heatr / %%%%%%%%%%%%%%%%%%%%%%%%% Add heating kerma %%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -104,26 +104,26 @@ reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% 20 22 '{library} PENDF for {zsymam}'/ {mat} 2/ -0.001 0. 0.001/ err tempr errmax +{error}/ err '{library}: PENDF for {zsymam}'/ 'Processed by NJOY'/ 0/ broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 22 23 {mat} {num_temp} 0 0 0./ -0.001 2.0e+6 0.001/ errthn thnmax errmax +{error}/ errthn {temps} 0/ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (free gas) %%%%%%%%%%%%%%% 0 23 62 0 {mat} 12 {num_temp} 1 0 {iform} 1 221 1/ {temps} -0.001 {energy_max} +{error} {energy_max} thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (bound) %%%%%%%%%%%%%%%%%% 60 62 27 {mat_thermal} {mat} 16 {num_temp} {inelastic} {elastic} {iform} {natom} 222 1/ {temps} -0.001 {energy_max} +{error} {energy_max} """ _ACE_THERMAL_TEMPLATE_ACER = """acer / @@ -195,7 +195,7 @@ def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): return njoy.returncode -def make_pendf(filename, pendf='pendf', stdout=False): +def make_pendf(filename, pendf='pendf', error=0.001, stdout=False): """Generate ACE file from an ENDF file Parameters @@ -204,6 +204,8 @@ def make_pendf(filename, pendf='pendf', stdout=False): Path to ENDF file pendf : str, optional Path of pointwise ENDF file to write + error : float, optional + Fractional error tolerance for NJOY processing. stdout : bool Whether to display NJOY standard output @@ -226,7 +228,7 @@ def make_pendf(filename, pendf='pendf', stdout=False): return run(commands, tapein, tapeout, stdout) -def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', +def make_ace(filename, temperatures=None, error=0.001, ace='ace', xsdir='xsdir', pendf=None, **kwargs): """Generate incident neutron ACE file from an ENDF file @@ -237,6 +239,8 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', temperatures : iterable of float, optional Temperatures in Kelvin to produce ACE files at. If omitted, data is produced at room temperature (293.6 K). + error : float, optional + Fractional error tolerance for NJOY processing. ace : str, optional Path of ACE file to write xsdir : str, optional @@ -311,7 +315,7 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', return retcode -def make_ace_thermal(filename, filename_thermal, temperatures=None, +def make_ace_thermal(filename, filename_thermal, temperatures=None, error=0.001, ace='ace', xsdir='xsdir', **kwargs): """Generate thermal scattering ACE file from ENDF files @@ -324,6 +328,8 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, temperatures : iterable of float, optional Temperatures in Kelvin to produce data at. If omitted, data is produced at all temperatures given in the ENDF thermal scattering sublibrary. + error : float, optional + Fractional error tolerance for NJOY processing. ace : str, optional Path of ACE file to write xsdir : str, optional diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 6e7b0fe02..1d63c1ade 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -588,7 +588,8 @@ class ThermalScattering(EqualityMixin): return table @classmethod - def from_njoy(cls, filename, filename_thermal, temperatures=None, **kwargs): + def from_njoy(cls, filename, filename_thermal, temperatures=None, + error=0.001, **kwargs): """Generate incident neutron data by running NJOY. Parameters @@ -601,6 +602,8 @@ class ThermalScattering(EqualityMixin): Temperatures in Kelvin to produce data at. If omitted, data is produced at all temperatures in the ENDF thermal scattering sublibrary. + error : float, optional + Fractional error tolerance for NJOY processing. **kwargs Keyword arguments passed to :func:`openmc.data.njoy.make_ace_thermal` @@ -617,7 +620,7 @@ class ThermalScattering(EqualityMixin): # Run NJOY to create an ACE library ace_file = os.path.join(tmpdir, 'ace') xsdir_file = os.path.join(tmpdir, 'xsdir') - make_ace_thermal(filename, filename_thermal, temperatures, + make_ace_thermal(filename, filename_thermal, temperatures, error, ace_file, xsdir_file, **kwargs) # Create instance from ACE tables within library From 851e50afbcdff9385efa8f089626a99d57dca1a3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 28 Jul 2017 14:59:29 -0500 Subject: [PATCH 097/123] Awesome error handling thanks to ctypes --- openmc/capi.py | 150 ++++++++++++++++++++++++++++--------------------- src/api.F90 | 112 +++++++++++++++++++++++++++--------- 2 files changed, 171 insertions(+), 91 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index 2164a9d81..a2225b571 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -16,6 +16,53 @@ _int_array = POINTER(POINTER(c_int)) _double_array = POINTER(POINTER(c_double)) +class GeometryError(Exception): + pass + + +def _error_code(s): + """Get error code corresponding to global constant.""" + return c_int.in_dll(lib._dll, s).value + + +def _error_handler(err, func, args): + """Raise exception according to error code.""" + if err == _error_code('e_out_of_bounds'): + raise IndexError('Array index out of bounds.') + + elif err == _error_code('e_cell_not_allocated'): + raise MemoryError("Memory has not been allocated for cells.") + + elif err == _error_code('e_cell_invalid_id'): + raise KeyError("No cell exists with ID={}.".format(args[0])) + + elif err == _error_code('e_cell_not_found'): + raise GeometryError("Could not find cell at position ({}, {}, {})" + .format(*args[0])) + + elif err == _error_code('e_nuclide_not_allocated'): + raise MemoryError("Memory has not been allocated for nuclides.") + + elif err == _error_code('e_nuclide_not_in_library'): + raise KeyError("Specified nuclide doesn't exist in the cross " + "section library.") + + elif err == _error_code('e_material_not_allocated'): + raise MemoryError("Memory has not been allocated for materials.") + + elif err == _error_code('e_material_invalid_id'): + raise KeyError("No material exists with ID={}.".format(args[0])) + + elif err == _error_code('e_tally_not_allocated'): + raise MemoryError("Memory has not been allocated for tallies.") + + elif err == _error_code('e_tally_invalid_id'): + raise KeyError("No tally exists with ID={}.".format(args[0])) + + elif err < 0: + raise Exception("Unknown error encountered (code {}).".format(err)) + + class OpenMCLibrary(object): """Provides bindings to C functions defined by OpenMC shared library. @@ -36,47 +83,58 @@ class OpenMCLibrary(object): # Set argument/return types self._dll.openmc_calculate_volumes.restype = None self._dll.openmc_cell_set_temperature.argtypes = [ - c_int32, c_double, c_int32] + c_int32, c_double, POINTER(c_int32)] self._dll.openmc_cell_set_temperature.restype = c_int + self._dll.openmc_cell_set_temperature.errcheck = _error_handler self._dll.openmc_finalize.restype = None self._dll.openmc_find.argtypes = [ POINTER(_double3), c_int, POINTER(c_int32), POINTER(c_int32)] - self._dll.openmc_find.restype = None + self._dll.openmc_find.restype = c_int + self._dll.openmc_find.errcheck = _error_handler self._dll.openmc_init.argtypes = [POINTER(c_int)] self._dll.openmc_init.restype = None self._dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] self._dll.openmc_get_keff.restype = c_int + self._dll.openmc_get_keff.errcheck = _error_handler self._dll.openmc_load_nuclide.argtypes = [c_char_p] self._dll.openmc_load_nuclide.restype = c_int + self._dll.openmc_load_nuclide.errcheck = _error_handler # Material interface self._dll.openmc_material_add_nuclide.argtypes = [ c_int32, c_char_p, c_double] self._dll.openmc_material_add_nuclide.restype = c_int + self._dll.openmc_material_add_nuclide.errcheck = _error_handler self._dll.openmc_material_get_densities.argtypes = [ - c_int32, _double_array] + c_int32, _double_array, POINTER(c_int)] self._dll.openmc_material_get_densities.restype = c_int + self._dll.openmc_material_get_densities.errcheck = _error_handler self._dll.openmc_material_get_nuclides.argtypes = [ - c_int32, _int_array] + c_int32, _int_array, POINTER(c_int)] self._dll.openmc_material_get_nuclides.restype = c_int + self._dll.openmc_material_get_nuclides.errcheck = _error_handler self._dll.openmc_material_set_density.argtypes = [c_int32, c_double] self._dll.openmc_material_set_density.restype = c_int + self._dll.openmc_material_set_density.errcheck = _error_handler self._dll.openmc_material_set_densities.argtypes = [ c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] self._dll.openmc_material_set_densities.restype = c_int + self._dll.openmc_material_set_densities.errcheck = _error_handler self._dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] self._dll.openmc_nuclide_name.restype = c_int + self._dll.openmc_nuclide_name.errcheck = _error_handler self._dll.openmc_plot_geometry.restype = None self._dll.openmc_run.restype = None self._dll.openmc_reset.restype = None self._dll.openmc_tally_results.argtypes = [ c_int32, _double_array, POINTER(_int3)] - self._dll.openmc_tally_results.restype = None + self._dll.openmc_tally_results.restype = c_int + self._dll.openmc_tally_results.errcheck = _error_handler def calculate_volumes(self): """Run stochastic volume calculation""" - return self._dll.openmc_calculate_volumes() + self._dll.openmc_calculate_volumes() def cell_set_temperature(self, cell_id, T, instance=None): """Set the temperature of a cell @@ -91,15 +149,11 @@ class OpenMCLibrary(object): Which instance of the cell """ - if instance is not None: - return self._dll.openmc_cell_set_temperature( - cell_id, T, instance) - else: - return self._dll.openmc_cell_set_temperature(cell_id, T, None) + self._dll.openmc_cell_set_temperature(cell_id, T, instance) def finalize(self): """Finalize simulation and free memory""" - return self._dll.openmc_finalize() + self._dll.openmc_finalize() def find(self, xyz, rtype='cell'): """Find the cell or material at a given point @@ -151,9 +205,9 @@ class OpenMCLibrary(object): intracomm = intracomm.py2f() except AttributeError: pass - return self._dll.openmc_init(c_int(intracomm)) + self._dll.openmc_init(c_int(intracomm)) else: - return self._dll.openmc_init(None) + self._dll.openmc_init(None) def keff(self): """Return the calculated k-eigenvalue and its standard deviation. @@ -165,7 +219,7 @@ class OpenMCLibrary(object): """ k = (c_double*2)() - err = self._dll.openmc_get_keff(k) + self._dll.openmc_get_keff(k) return tuple(k) def load_nuclide(self, name): @@ -177,13 +231,8 @@ class OpenMCLibrary(object): name : str Name of nuclide, e.g. 'U235' - Returns - ------- - int - Return status (negative if an error occurs). - """ - return self._dll.openmc_load_nuclide(name.encode()) + self._dll.openmc_load_nuclide(name.encode()) def material_add_nuclide(self, mat_id, name, density): """Add a nuclide to a material. @@ -197,14 +246,8 @@ class OpenMCLibrary(object): density : float Density in atom/b-cm - Returns - ------- - int - Return status (negative if an error occurs). - """ - return self._dll.openmc_material_add_nuclide( - mat_id, name.encode(), density) + self._dll.openmc_material_add_nuclide(mat_id, name.encode(), density) def material_get_densities(self, mat_id): """Get atom densities in a material. @@ -221,11 +264,9 @@ class OpenMCLibrary(object): """ data = POINTER(c_double)() - n = self._dll.openmc_material_get_densities(mat_id, data) - if data: - return as_array(data, (n,)) - else: - return None + n = c_int() + self._dll.openmc_material_get_densities(mat_id, data, n) + return as_array(data, (n.value,)) def material_get_nuclides(self, mat_id): """Get list of nuclides in a material. @@ -242,11 +283,9 @@ class OpenMCLibrary(object): """ data = POINTER(c_int)() - n = self._dll.openmc_material_get_nuclides(mat_id, data) - if data: - return [self.nuclide_name(data[i]) for i in range(n)] - else: - return None + n = c_int() + self._dll.openmc_material_get_nuclides(mat_id, data, n) + return [self.nuclide_name(data[i]) for i in range(n.value)] def material_set_density(self, mat_id, density): """Set density of a material. @@ -258,13 +297,8 @@ class OpenMCLibrary(object): density : float Density in atom/b-cm - Returns - ------- - int - Return status (negative if an error occurs). - """ - return self._dll.openmc_material_set_density(mat_id, density) + self._dll.openmc_material_set_density(mat_id, density) def material_set_densities(self, mat_id, nuclides, densities): """Set the densities of a list of nuclides in a material @@ -278,11 +312,6 @@ class OpenMCLibrary(object): densities : iterable of float Corresponding densities in atom/b-cm - Returns - ------- - int - Return status (negative if an error occurs). - """ # Convert strings to an array of char* nucs = (c_char_p * len(nuclides))() @@ -292,8 +321,7 @@ class OpenMCLibrary(object): d = np.asarray(densities) dp = d.ctypes.data_as(POINTER(c_double)) - return self._dll.openmc_material_set_densities( - mat_id, len(nuclides), nucs, dp) + self._dll.openmc_material_set_densities(mat_id, len(nuclides), nucs, dp) def nuclide_name(self, index): """Name of nuclide with given index @@ -310,28 +338,25 @@ class OpenMCLibrary(object): """ name = c_char_p() - err = self._dll.openmc_nuclide_name(index, name) + self._dll.openmc_nuclide_name(index, name) # Find blank in name - if err == 0: - i = 0 - while name.value[i:i+1] != b' ': - i += 1 - return name.value[:i].decode() - else: - return None + i = 0 + while name.value[i:i+1] != b' ': + i += 1 + return name.value[:i].decode() def plot_geometry(self): """Plot geometry""" - return self._dll.openmc_plot_geometry() + self._dll.openmc_plot_geometry() def reset(self): """Reset tallies""" - return self._dll.openmc_reset() + self._dll.openmc_reset() def run(self): """Run simulation""" - return self._dll.openmc_run() + self._dll.openmc_run() def tally_results(self, tally_id): """Get tally results array @@ -363,7 +388,6 @@ class OpenMCLibrary(object): raise AttributeError("OpenMC library doesn't have a '{}' function" .format(key)) - @contextmanager def lib_context(intracomm=None): """Provides context manager for calling OpenMC shared library functions. diff --git a/src/api.F90 b/src/api.F90 index 50beddd5d..3bea4af99 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -40,6 +40,19 @@ module openmc_api public :: openmc_run public :: openmc_tally_results + ! Error codes + integer(C_INT), public, bind(C) :: E_UNASSIGNED = -1 + integer(C_INT), public, bind(C) :: E_OUT_OF_BOUNDS = -2 + integer(C_INT), public, bind(C) :: E_CELL_NOT_ALLOCATED = -3 + integer(C_INT), public, bind(C) :: E_CELL_INVALID_ID = -4 + integer(C_INT), public, bind(C) :: E_CELL_NOT_FOUND = -5 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_ALLOCATED = -6 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_IN_LIBRARY = -7 + integer(C_INT), public, bind(C) :: E_MATERIAL_NOT_ALLOCATED = -8 + integer(C_INT), public, bind(C) :: E_MATERIAL_INVALID_ID = -9 + integer(C_INT), public, bind(C) :: E_TALLY_NOT_ALLOCATED = -10 + integer(C_INT), public, bind(C) :: E_TALLY_INVALID_ID = -11 + contains !=============================================================================== @@ -54,7 +67,7 @@ contains integer :: i, n - err = -1 + err = E_UNASSIGNED if (allocated(cells)) then if (cell_dict % has_key(id)) then i = cell_dict % get_key(id) @@ -72,7 +85,11 @@ contains end if end if end associate + else + err = E_CELL_INVALID_ID end if + else + err = E_CELL_NOT_ALLOCATED end if end function openmc_cell_set_temperature @@ -169,11 +186,12 @@ contains ! OPENMC_FIND determines the ID or a cell or material at a given point in space !=============================================================================== - subroutine openmc_find(xyz, rtype, id, instance) bind(C) + function openmc_find(xyz, rtype, id, instance) result(err) bind(C) real(C_DOUBLE), intent(in) :: xyz(3) ! Cartesian point integer(C_INT), intent(in), value :: rtype ! 1 for cell, 2 for material integer(C_INT32_T), intent(out) :: id integer(C_INT32_T), intent(out) :: instance + integer(C_INT) :: err logical :: found type(Particle) :: p @@ -185,6 +203,8 @@ contains id = -1 instance = -1 + err = E_UNASSIGNED + if (found) then if (rtype == 1) then id = cells(p % coord(p % n_coord) % cell) % id @@ -196,8 +216,12 @@ contains end if end if instance = p % cell_instance - 1 + err = 0 + else + err = E_CELL_NOT_FOUND end if - end subroutine openmc_find + + end function openmc_find !=============================================================================== ! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library @@ -219,7 +243,7 @@ contains ! Copy array of C_CHARs to normal Fortran string name_ = to_f_string(name) - err = -1 + err = 0 if (.not. nuclide_dict % has_key(to_lower(name_))) then if (library_dict % has_key(to_lower(name_))) then ! allocate extra space in nuclides array @@ -253,10 +277,8 @@ contains ! Initialize nuclide grid call nuclides(n) % init_grid(energy_min_neutron, & energy_max_neutron, n_log_bins) - - err = 0 else - err = -2 + err = E_NUCLIDE_NOT_IN_LIBRARY end if end if @@ -273,7 +295,6 @@ contains integer(C_INT) :: err integer :: i, j, k, n - integer :: err2 real(8) :: awr integer, allocatable :: new_nuclide(:) real(8), allocatable :: new_density(:) @@ -281,7 +302,7 @@ contains name_ = to_f_string(name) - err = -1 + err = E_UNASSIGNED if (allocated(materials)) then if (material_dict % has_key(id)) then i = material_dict % get_key(id) @@ -302,9 +323,9 @@ contains ! If nuclide wasn't found, extend nuclide/density arrays if (err /= 0) then ! If nuclide hasn't been loaded, load it now - err2 = openmc_load_nuclide(name) + err = openmc_load_nuclide(name) - if (err2 /= -2) then + if (err == 0) then ! Extend arrays n = size(m % nuclide) allocate(new_nuclide(n + 1)) @@ -323,12 +344,14 @@ contains m % density_gpcc = m % density_gpcc + & density * nuclides(k) % awr * MASS_NEUTRON / N_AVOGADRO m % n_nuclides = n + 1 - - err = 0 end if end if end associate + else + err = E_MATERIAL_INVALID_ID end if + else + err = E_MATERIAL_NOT_ALLOCATED end if end function openmc_material_add_nuclide @@ -338,15 +361,17 @@ contains ! material !=============================================================================== - function openmc_material_get_densities(id, ptr) result(n) bind(C) + function openmc_material_get_densities(id, ptr, n) result(err) bind(C) integer(C_INT32_T), intent(in), value :: id type(C_PTR), intent(out) :: ptr - integer(C_INT) :: n + integer(C_INT), intent(out) :: n + integer(C_INT) :: err integer :: i ptr = C_NULL_PTR - n = 0 + n = -1 + err = E_UNASSIGNED if (allocated(materials)) then if (material_dict % has_key(id)) then i = material_dict % get_key(id) @@ -354,9 +379,14 @@ contains if (allocated(m % atom_density)) then ptr = C_LOC(m % atom_density(1)) n = size(m % atom_density) + err = 0 end if end associate + else + err = E_MATERIAL_INVALID_ID end if + else + err = E_MATERIAL_NOT_ALLOCATED end if end function openmc_material_get_densities @@ -365,15 +395,17 @@ contains ! in a material its index in the global nuclides array !=============================================================================== - function openmc_material_get_nuclides(id, ptr) result(n) bind(C) + function openmc_material_get_nuclides(id, ptr, n) result(err) bind(C) integer(C_INT32_T), intent(in), value :: id type(C_PTR), intent(out) :: ptr - integer(C_INT) :: n + integer(C_INT), intent(out) :: n + integer(C_INT) :: err integer :: i ptr = C_NULL_PTR - n = 0 + n = -1 + err = E_UNASSIGNED if (allocated(materials)) then if (material_dict % has_key(id)) then i = material_dict % get_key(id) @@ -381,9 +413,14 @@ contains if (allocated(m % nuclide)) then ptr = C_LOC(m % nuclide(1)) n = size(m % nuclide) + err = 0 end if end associate + else + err = E_MATERIAL_INVALID_ID end if + else + err = E_MATERIAL_NOT_ALLOCATED end if end function openmc_material_get_nuclides @@ -398,14 +435,18 @@ contains character(C_CHAR), pointer :: name_ - err = -1 + err = E_UNASSIGNED name = C_NULL_PTR if (allocated(nuclides)) then if (index >= 1 .and. index <= size(nuclides)) then name_ => nuclides(index) % name(1:1) name = C_LOC(name_) err = 0 + else + err = E_OUT_OF_BOUNDS end if + else + err = E_NUCLIDE_NOT_ALLOCATED end if end function openmc_nuclide_name @@ -427,7 +468,11 @@ contains associate (m => materials(i)) err = m % set_density(density, nuclides) end associate + else + err = E_MATERIAL_INVALID_ID end if + else + err = E_MATERIAL_NOT_ALLOCATED end if end function openmc_material_set_density @@ -445,11 +490,10 @@ contains integer(C_INT) :: err integer :: i, j, k - logical :: has_nuclide character(C_CHAR), pointer :: string(:) character(len=:, kind=C_CHAR), allocatable :: name_ - err = -1 + err = E_UNASSIGNED if (allocated(materials)) then if (material_dict % has_key(id)) then i = material_dict % get_key(id) @@ -460,24 +504,29 @@ contains name_ = to_f_string(string) ! Find corresponding nuclide and set density - has_nuclide = .false. do j = 1, size(m % nuclide) k = m % nuclide(j) if (nuclides(k) % name == name_) then m % atom_density(j) = density(i) - has_nuclide = .true. + err = 0 end if end do ! If nuclide wasn't found, try to load it - err = openmc_material_add_nuclide(id, string, density(i)) - if (err /= 0) return + if (err /= 0) then + err = openmc_material_add_nuclide(id, string, density(i)) + if (err /= 0) return + end if end do ! Set total density to the sum of the vector err = m % set_density(sum(m % atom_density), nuclides) end associate + else + err = E_MATERIAL_INVALID_ID end if + else + err = E_MATERIAL_NOT_ALLOCATED end if end function openmc_material_set_densities @@ -527,24 +576,31 @@ contains ! directly. !=============================================================================== - subroutine openmc_tally_results(id, ptr, shape_) bind(C) + function openmc_tally_results(id, ptr, shape_) result(err) bind(C) integer(C_INT32_T), intent(in), value :: id type(C_PTR), intent(out) :: ptr integer(C_INT), intent(out) :: shape_(3) + integer(C_INT) :: err integer :: i ptr = C_NULL_PTR + err = E_UNASSIGNED if (allocated(tallies)) then if (tally_dict % has_key(id)) then i = tally_dict % get_key(id) if (allocated(tallies(i) % results)) then ptr = C_LOC(tallies(i) % results(1,1,1)) shape_(:) = shape(tallies(i) % results) + err = 0 end if + else + err = E_TALLY_INVALID_ID end if + else + err = E_TALLY_NOT_ALLOCATED end if - end subroutine openmc_tally_results + end function openmc_tally_results function to_f_string(c_string) result(f_string) character(kind=C_CHAR), intent(in) :: c_string(*) From 25e585881f8de46c37154f5b2bfc4841b9044003 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 28 Jul 2017 15:17:57 -0500 Subject: [PATCH 098/123] Combine material_get_densities and material_get_nuclides --- openmc/capi.py | 37 ++++++++++++------------------------- src/api.F90 | 47 ++++++++--------------------------------------- 2 files changed, 20 insertions(+), 64 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index a2225b571..7712e0e3e 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -106,13 +106,9 @@ class OpenMCLibrary(object): self._dll.openmc_material_add_nuclide.restype = c_int self._dll.openmc_material_add_nuclide.errcheck = _error_handler self._dll.openmc_material_get_densities.argtypes = [ - c_int32, _double_array, POINTER(c_int)] + c_int32, _int_array, _double_array, POINTER(c_int)] self._dll.openmc_material_get_densities.restype = c_int self._dll.openmc_material_get_densities.errcheck = _error_handler - self._dll.openmc_material_get_nuclides.argtypes = [ - c_int32, _int_array, POINTER(c_int)] - self._dll.openmc_material_get_nuclides.restype = c_int - self._dll.openmc_material_get_nuclides.errcheck = _error_handler self._dll.openmc_material_set_density.argtypes = [c_int32, c_double] self._dll.openmc_material_set_density.restype = c_int self._dll.openmc_material_set_density.errcheck = _error_handler @@ -259,33 +255,24 @@ class OpenMCLibrary(object): Returns ------- + list of string + List of nuclide names numpy.ndarray Array of densities in atom/b-cm """ - data = POINTER(c_double)() + # Allocate memory for arguments that are written to + nuclides = POINTER(c_int)() + densities = POINTER(c_double)() n = c_int() - self._dll.openmc_material_get_densities(mat_id, data, n) - return as_array(data, (n.value,)) - def material_get_nuclides(self, mat_id): - """Get list of nuclides in a material. + # Get nuclide names and densities + self._dll.openmc_material_get_densities(mat_id, nuclides, densities, n) - Parameters - ---------- - mat_id : int - ID of the material - - Returns - ------- - list of str - Nuclides in specified material - - """ - data = POINTER(c_int)() - n = c_int() - self._dll.openmc_material_get_nuclides(mat_id, data, n) - return [self.nuclide_name(data[i]) for i in range(n.value)] + # Convert to appropriate types and return + nuclide_list = [self.nuclide_name(nuclides[i]) for i in range(n.value)] + density_array = as_array(densities, (n.value,)) + return nuclide_list, density_array def material_set_density(self, mat_id, density): """Set density of a material. diff --git a/src/api.F90 b/src/api.F90 index 3bea4af99..6b71bf2fc 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -31,7 +31,6 @@ module openmc_api public :: openmc_load_nuclide public :: openmc_material_add_nuclide public :: openmc_material_get_densities - public :: openmc_material_get_nuclides public :: openmc_material_set_density public :: openmc_material_set_densities public :: openmc_nuclide_name @@ -361,15 +360,18 @@ contains ! material !=============================================================================== - function openmc_material_get_densities(id, ptr, n) result(err) bind(C) + function openmc_material_get_densities(id, nuclides, densities, n) & + result(err) bind(C) integer(C_INT32_T), intent(in), value :: id - type(C_PTR), intent(out) :: ptr + type(C_PTR), intent(out) :: nuclides + type(C_PTR), intent(out) :: densities integer(C_INT), intent(out) :: n integer(C_INT) :: err integer :: i - ptr = C_NULL_PTR + nuclides = C_NULL_PTR + densities = C_NULL_PTR n = -1 err = E_UNASSIGNED if (allocated(materials)) then @@ -377,7 +379,8 @@ contains i = material_dict % get_key(id) associate (m => materials(i)) if (allocated(m % atom_density)) then - ptr = C_LOC(m % atom_density(1)) + nuclides = C_LOC(m % nuclide(1)) + densities = C_LOC(m % atom_density(1)) n = size(m % atom_density) err = 0 end if @@ -390,40 +393,6 @@ contains end if end function openmc_material_get_densities -!=============================================================================== -! OPENMC_MATERIAL_GET_NUCLIDES returns an array that indicates for each nuclide -! in a material its index in the global nuclides array -!=============================================================================== - - function openmc_material_get_nuclides(id, ptr, n) result(err) bind(C) - integer(C_INT32_T), intent(in), value :: id - type(C_PTR), intent(out) :: ptr - integer(C_INT), intent(out) :: n - integer(C_INT) :: err - - integer :: i - - ptr = C_NULL_PTR - n = -1 - err = E_UNASSIGNED - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - if (allocated(m % nuclide)) then - ptr = C_LOC(m % nuclide(1)) - n = size(m % nuclide) - err = 0 - end if - end associate - else - err = E_MATERIAL_INVALID_ID - end if - else - err = E_MATERIAL_NOT_ALLOCATED - end if - end function openmc_material_get_nuclides - !=============================================================================== ! OPENMC_NUCLIDE_NAME returns the name of a nuclide with a given index !=============================================================================== From a33502e8fa1f482bceda48ffd55a583279c03956 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 28 Jul 2017 15:46:35 -0500 Subject: [PATCH 099/123] Get rid of OpenMCLibrary object and make all methods regular functions --- openmc/__init__.py | 2 +- openmc/capi.py | 647 ++++++++++++++++++++++----------------------- 2 files changed, 324 insertions(+), 325 deletions(-) diff --git a/openmc/__init__.py b/openmc/__init__.py index a0fe26491..571b5a93a 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -27,6 +27,6 @@ from openmc.particle_restart import * from openmc.mixin import * from openmc.plotter import * from openmc.search import * -from openmc.capi import * +import openmc.capi __version__ = '0.9.0' diff --git a/openmc/capi.py b/openmc/capi.py index 7712e0e3e..2e6b17d43 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -1,3 +1,15 @@ +"""Provides bindings to C functions defined by OpenMC shared library. + +When the :mod:`openmc` package is imported, the OpenMC shared library is +automatically loaded. Calls to the OpenMC library can then be made, for example: + +.. code-block:: python + + openmc.capi.init() + openmc.capi.run() + +""" + from contextlib import contextmanager from ctypes import CDLL, c_int, c_int32, c_double, c_char_p, POINTER import sys @@ -5,11 +17,8 @@ from warnings import warn import numpy as np from numpy.ctypeslib import as_array - import pkg_resources -__all__ = ['OpenMCLibrary', 'lib', 'lib_context'] - _int3 = c_int*3 _double3 = c_double*3 _int_array = POINTER(POINTER(c_int)) @@ -22,7 +31,7 @@ class GeometryError(Exception): def _error_code(s): """Get error code corresponding to global constant.""" - return c_int.in_dll(lib._dll, s).value + return c_int.in_dll(_dll, s).value def _error_handler(err, func, args): @@ -63,332 +72,70 @@ def _error_handler(err, func, args): raise Exception("Unknown error encountered (code {}).".format(err)) -class OpenMCLibrary(object): - """Provides bindings to C functions defined by OpenMC shared library. +def calculate_volumes(): + """Run stochastic volume calculation""" + _dll.openmc_calculate_volumes() - This class is normally not directly instantiated. Instead, when the - :mod:`openmc` package is imported, an instance is automatically created with - the name :data:`openmc.lib`. Calls to the OpenMC can then be made using that - instance, for example: - .. code-block:: python +def cell_set_temperature(cell_id, T, instance=None): + """Set the temperature of a cell - openmc.lib.init() - openmc.lib.run() + Parameters + ---------- + cell_id : int + ID of the cell + T : float + Temperature in K + instance : int or None + Which instance of the cell """ - def __init__(self, filename): - self._dll = CDLL(filename) + _dll.openmc_cell_set_temperature(cell_id, T, instance) - # Set argument/return types - self._dll.openmc_calculate_volumes.restype = None - self._dll.openmc_cell_set_temperature.argtypes = [ - c_int32, c_double, POINTER(c_int32)] - self._dll.openmc_cell_set_temperature.restype = c_int - self._dll.openmc_cell_set_temperature.errcheck = _error_handler - self._dll.openmc_finalize.restype = None - self._dll.openmc_find.argtypes = [ - POINTER(_double3), c_int, POINTER(c_int32), POINTER(c_int32)] - self._dll.openmc_find.restype = c_int - self._dll.openmc_find.errcheck = _error_handler - self._dll.openmc_init.argtypes = [POINTER(c_int)] - self._dll.openmc_init.restype = None - self._dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] - self._dll.openmc_get_keff.restype = c_int - self._dll.openmc_get_keff.errcheck = _error_handler - self._dll.openmc_load_nuclide.argtypes = [c_char_p] - self._dll.openmc_load_nuclide.restype = c_int - self._dll.openmc_load_nuclide.errcheck = _error_handler - # Material interface - self._dll.openmc_material_add_nuclide.argtypes = [ - c_int32, c_char_p, c_double] - self._dll.openmc_material_add_nuclide.restype = c_int - self._dll.openmc_material_add_nuclide.errcheck = _error_handler - self._dll.openmc_material_get_densities.argtypes = [ - c_int32, _int_array, _double_array, POINTER(c_int)] - self._dll.openmc_material_get_densities.restype = c_int - self._dll.openmc_material_get_densities.errcheck = _error_handler - self._dll.openmc_material_set_density.argtypes = [c_int32, c_double] - self._dll.openmc_material_set_density.restype = c_int - self._dll.openmc_material_set_density.errcheck = _error_handler - self._dll.openmc_material_set_densities.argtypes = [ - c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] - self._dll.openmc_material_set_densities.restype = c_int - self._dll.openmc_material_set_densities.errcheck = _error_handler - self._dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] - self._dll.openmc_nuclide_name.restype = c_int - self._dll.openmc_nuclide_name.errcheck = _error_handler - self._dll.openmc_plot_geometry.restype = None - self._dll.openmc_run.restype = None - self._dll.openmc_reset.restype = None - self._dll.openmc_tally_results.argtypes = [ - c_int32, _double_array, POINTER(_int3)] - self._dll.openmc_tally_results.restype = c_int - self._dll.openmc_tally_results.errcheck = _error_handler +def finalize(): + """Finalize simulation and free memory""" + _dll.openmc_finalize() - def calculate_volumes(self): - """Run stochastic volume calculation""" - self._dll.openmc_calculate_volumes() - def cell_set_temperature(self, cell_id, T, instance=None): - """Set the temperature of a cell +def find(xyz, rtype='cell'): + """Find the cell or material at a given point - Parameters - ---------- - cell_id : int - ID of the cell - T : float - Temperature in K - instance : int or None - Which instance of the cell + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates of position + rtype : {'cell', 'material'} + Whether to return the cell or material ID - """ - self._dll.openmc_cell_set_temperature(cell_id, T, instance) + Returns + ------- + int or None + ID of the cell or material. If 'material' is requested and no + material exists at the given coordinate, None is returned. + int + If the cell at the given point is repeated in the geometry, this + indicates which instance it is, i.e., 0 would be the first instance. - def finalize(self): - """Finalize simulation and free memory""" - self._dll.openmc_finalize() + """ + # Set second argument to openmc_find + if rtype == 'cell': + r_int = 1 + elif rtype == 'material': + r_int = 2 + else: + raise ValueError('Unknown return type: {}'.format(rtype)) - def find(self, xyz, rtype='cell'): - """Find the cell or material at a given point + # Call openmc_find + uid = c_int32() + instance = c_int32() + _dll.openmc_find(_double3(*xyz), r_int, uid, instance) + return (uid.value if uid != 0 else None), instance.value - Parameters - ---------- - xyz : iterable of float - Cartesian coordinates of position - rtype : {'cell', 'material'} - Whether to return the cell or material ID - Returns - ------- - int or None - ID of the cell or material. If 'material' is requested and no - material exists at the given coordinate, None is returned. - int - If the cell at the given point is repeated in the geometry, this - indicates which instance it is, i.e., 0 would be the first instance. - - """ - # Set second argument to openmc_find - if rtype == 'cell': - r_int = 1 - elif rtype == 'material': - r_int = 2 - else: - raise ValueError('Unknown return type: {}'.format(rtype)) - - # Call openmc_find - uid = c_int32() - instance = c_int32() - self._dll.openmc_find(_double3(*xyz), r_int, uid, instance) - return (uid.value if uid != 0 else None), instance.value - - def init(self, intracomm=None): - """Initialize OpenMC - - Parameters - ---------- - intracomm : mpi4py.MPI.Intracomm or None - MPI intracommunicator - - """ - if intracomm is not None: - # If an mpi4py communicator was passed, convert it to an integer to - # be passed to openmc_init - try: - intracomm = intracomm.py2f() - except AttributeError: - pass - self._dll.openmc_init(c_int(intracomm)) - else: - self._dll.openmc_init(None) - - def keff(self): - """Return the calculated k-eigenvalue and its standard deviation. - - Returns - ------- - tuple - Mean k-eigenvalue and standard deviation of the mean - - """ - k = (c_double*2)() - self._dll.openmc_get_keff(k) - return tuple(k) - - def load_nuclide(self, name): - - """Load cross section data for a nuclide. - - Parameters - ---------- - name : str - Name of nuclide, e.g. 'U235' - - """ - self._dll.openmc_load_nuclide(name.encode()) - - def material_add_nuclide(self, mat_id, name, density): - """Add a nuclide to a material. - - Parameters - ---------- - mat_id : int - ID of the material - name : str - Name of nuclide, e.g. 'U235' - density : float - Density in atom/b-cm - - """ - self._dll.openmc_material_add_nuclide(mat_id, name.encode(), density) - - def material_get_densities(self, mat_id): - """Get atom densities in a material. - - Parameters - ---------- - mat_id : int - ID of the material - - Returns - ------- - list of string - List of nuclide names - numpy.ndarray - Array of densities in atom/b-cm - - """ - # Allocate memory for arguments that are written to - nuclides = POINTER(c_int)() - densities = POINTER(c_double)() - n = c_int() - - # Get nuclide names and densities - self._dll.openmc_material_get_densities(mat_id, nuclides, densities, n) - - # Convert to appropriate types and return - nuclide_list = [self.nuclide_name(nuclides[i]) for i in range(n.value)] - density_array = as_array(densities, (n.value,)) - return nuclide_list, density_array - - def material_set_density(self, mat_id, density): - """Set density of a material. - - Parameters - ---------- - mat_id : int - ID of the material - density : float - Density in atom/b-cm - - """ - self._dll.openmc_material_set_density(mat_id, density) - - def material_set_densities(self, mat_id, nuclides, densities): - """Set the densities of a list of nuclides in a material - - Parameters - ---------- - mat_id : int - ID of the material - nuclides : iterable of str - Nuclide names - densities : iterable of float - Corresponding densities in atom/b-cm - - """ - # Convert strings to an array of char* - nucs = (c_char_p * len(nuclides))() - nucs[:] = [x.encode() for x in nuclides] - - # Get numpy array as a double* - d = np.asarray(densities) - dp = d.ctypes.data_as(POINTER(c_double)) - - self._dll.openmc_material_set_densities(mat_id, len(nuclides), nucs, dp) - - def nuclide_name(self, index): - """Name of nuclide with given index - - Parameter - --------- - index : int - Index in internal nuclides array - - Returns - ------- - str - Name of nuclide - - """ - name = c_char_p() - self._dll.openmc_nuclide_name(index, name) - - # Find blank in name - i = 0 - while name.value[i:i+1] != b' ': - i += 1 - return name.value[:i].decode() - - def plot_geometry(self): - """Plot geometry""" - self._dll.openmc_plot_geometry() - - def reset(self): - """Reset tallies""" - self._dll.openmc_reset() - - def run(self): - """Run simulation""" - self._dll.openmc_run() - - def tally_results(self, tally_id): - """Get tally results array - - Parameters - ---------- - tally_id : int - ID of tally - - Returns - ------- - numpy.ndarray - Array that exposes the internal tally results array - - """ - data = POINTER(c_double)() - shape = _int3() - self._dll.openmc_tally_results(tally_id, data, shape) - if data: - return as_array(data, tuple(shape[::-1])) - else: - return None - - def __getattr__(self, key): - # Fall-back for other functions that may be available from library - try: - return getattr(self._dll, 'openmc_{}'.format(key)) - except AttributeError: - raise AttributeError("OpenMC library doesn't have a '{}' function" - .format(key)) - -@contextmanager -def lib_context(intracomm=None): - """Provides context manager for calling OpenMC shared library functions. - - This function is intended to be used in a 'with' statement and ensures that - OpenMC is properly initialized/finalized. At the completion of the 'with' - block, all memory that was allocated during the block is freed. For - example:: - - with openmc.lib_context() as lib: - for i in range(n_iters): - lib.reset() - do_stuff() - lib.run() +def init(intracomm=None): + """Initialize OpenMC Parameters ---------- @@ -396,24 +143,276 @@ def lib_context(intracomm=None): MPI intracommunicator """ - lib.init(comm) - yield lib - lib.finalize() + if intracomm is not None: + # If an mpi4py communicator was passed, convert it to an integer to + # be passed to openmc_init + try: + intracomm = intracomm.py2f() + except AttributeError: + pass + _dll.openmc_init(c_int(intracomm)) + else: + _dll.openmc_init(None) + + +def keff(): + """Return the calculated k-eigenvalue and its standard deviation. + + Returns + ------- + tuple + Mean k-eigenvalue and standard deviation of the mean + + """ + k = (c_double*2)() + _dll.openmc_get_keff(k) + return tuple(k) + + +def load_nuclide(name): + """Load cross section data for a nuclide. + + Parameters + ---------- + name : str + Name of nuclide, e.g. 'U235' + + """ + _dll.openmc_load_nuclide(name.encode()) + + +def material_add_nuclide(mat_id, name, density): + """Add a nuclide to a material. + + Parameters + ---------- + mat_id : int + ID of the material + name : str + Name of nuclide, e.g. 'U235' + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_add_nuclide(mat_id, name.encode(), density) + + +def material_get_densities(mat_id): + """Get atom densities in a material. + + Parameters + ---------- + mat_id : int + ID of the material + + Returns + ------- + list of string + List of nuclide names + numpy.ndarray + Array of densities in atom/b-cm + + """ + # Allocate memory for arguments that are written to + nuclides = POINTER(c_int)() + densities = POINTER(c_double)() + n = c_int() + + # Get nuclide names and densities + _dll.openmc_material_get_densities(mat_id, nuclides, densities, n) + + # Convert to appropriate types and return + nuclide_list = [nuclide_name(nuclides[i]) for i in range(n.value)] + density_array = as_array(densities, (n.value,)) + return nuclide_list, density_array + + +def material_set_density(mat_id, density): + """Set density of a material. + + Parameters + ---------- + mat_id : int + ID of the material + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_set_density(mat_id, density) + + +def material_set_densities(mat_id, nuclides, densities): + """Set the densities of a list of nuclides in a material + + Parameters + ---------- + mat_id : int + ID of the material + nuclides : iterable of str + Nuclide names + densities : iterable of float + Corresponding densities in atom/b-cm + + """ + # Convert strings to an array of char* + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + + # Get numpy array as a double* + d = np.asarray(densities) + dp = d.ctypes.data_as(POINTER(c_double)) + + _dll.openmc_material_set_densities(mat_id, len(nuclides), nucs, dp) + + +def nuclide_name(index): + """Name of nuclide with given index + + Parameter + --------- + index : int + Index in internal nuclides array + + Returns + ------- + str + Name of nuclide + + """ + name = c_char_p() + _dll.openmc_nuclide_name(index, name) + + # Find blank in name + i = 0 + while name.value[i:i+1] != b' ': + i += 1 + return name.value[:i].decode() + + +def plot_geometry(): + """Plot geometry""" + _dll.openmc_plot_geometry() + + +def reset(): + """Reset tallies""" + _dll.openmc_reset() + + +def run(): + """Run simulation""" + _dll.openmc_run() + + +def tally_results(tally_id): + """Get tally results array + + Parameters + ---------- + tally_id : int + ID of tally + + Returns + ------- + numpy.ndarray + Array that exposes the internal tally results array + + """ + data = POINTER(c_double)() + shape = _int3() + _dll.openmc_tally_results(tally_id, data, shape) + return as_array(data, tuple(shape[::-1])) + + +@contextmanager +def run_in_memory(intracomm=None): + """Provides context manager for calling OpenMC shared library functions. + + This function is intended to be used in a 'with' statement and ensures that + OpenMC is properly initialized/finalized. At the completion of the 'with' + block, all memory that was allocated during the block is freed. For + example:: + + with openmc.capi.run_in_memory(): + for i in range(n_iters): + openmc.capi.reset() + do_stuff() + openmc.capi.run() + + Parameters + ---------- + intracomm : mpi4py.MPI.Intracomm or None + MPI intracommunicator + + """ + init(intracomm) + yield + finalize() # Determine shared-library suffix if sys.platform == 'darwin': - suffix = 'dylib' + _suffix = 'dylib' else: - suffix = 'so' + _suffix = 'so' # Open shared library -filename = pkg_resources.resource_filename( - __name__, '_libopenmc.{}'.format(suffix)) +_filename = pkg_resources.resource_filename( + __name__, '_libopenmc.{}'.format(_suffix)) try: - lib = OpenMCLibrary(filename) + _dll = CDLL(_filename) + _available = True except OSError: warn("OpenMC shared library is not available from the Python API. This " - "means you will not be able to use openmc.lib to make in-memory " + "means you will not be able to use openmc.capi to make in-memory " "calls to OpenMC.") - lib = None + _available = False + +if _available: + # Set argument/return types + _dll.openmc_calculate_volumes.restype = None + _dll.openmc_cell_set_temperature.argtypes = [ + c_int32, c_double, POINTER(c_int32)] + _dll.openmc_cell_set_temperature.restype = c_int + _dll.openmc_cell_set_temperature.errcheck = _error_handler + _dll.openmc_finalize.restype = None + _dll.openmc_find.argtypes = [ + POINTER(_double3), c_int, POINTER(c_int32), POINTER(c_int32)] + _dll.openmc_find.restype = c_int + _dll.openmc_find.errcheck = _error_handler + _dll.openmc_init.argtypes = [POINTER(c_int)] + _dll.openmc_init.restype = None + _dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] + _dll.openmc_get_keff.restype = c_int + _dll.openmc_get_keff.errcheck = _error_handler + _dll.openmc_load_nuclide.argtypes = [c_char_p] + _dll.openmc_load_nuclide.restype = c_int + _dll.openmc_load_nuclide.errcheck = _error_handler + + # Material interface + _dll.openmc_material_add_nuclide.argtypes = [ + c_int32, c_char_p, c_double] + _dll.openmc_material_add_nuclide.restype = c_int + _dll.openmc_material_add_nuclide.errcheck = _error_handler + _dll.openmc_material_get_densities.argtypes = [ + c_int32, _int_array, _double_array, POINTER(c_int)] + _dll.openmc_material_get_densities.restype = c_int + _dll.openmc_material_get_densities.errcheck = _error_handler + _dll.openmc_material_set_density.argtypes = [c_int32, c_double] + _dll.openmc_material_set_density.restype = c_int + _dll.openmc_material_set_density.errcheck = _error_handler + _dll.openmc_material_set_densities.argtypes = [ + c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] + _dll.openmc_material_set_densities.restype = c_int + _dll.openmc_material_set_densities.errcheck = _error_handler + + _dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] + _dll.openmc_nuclide_name.restype = c_int + _dll.openmc_nuclide_name.errcheck = _error_handler + _dll.openmc_plot_geometry.restype = None + _dll.openmc_run.restype = None + _dll.openmc_reset.restype = None + _dll.openmc_tally_results.argtypes = [ + c_int32, _double_array, POINTER(_int3)] + _dll.openmc_tally_results.restype = c_int + _dll.openmc_tally_results.errcheck = _error_handler From 21aa92e4ad92e153b60bf3b622adbab2e26aabb7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Jul 2017 08:23:46 -0500 Subject: [PATCH 100/123] Refactor C API bindings into Mapping and View classes --- openmc/capi.py | 310 +++++++++++++++++++++++++---------------- src/api.F90 | 364 +++++++++++++++++++++++++++---------------------- src/global.F90 | 9 +- 3 files changed, 403 insertions(+), 280 deletions(-) diff --git a/openmc/capi.py b/openmc/capi.py index 2e6b17d43..0706d4c77 100644 --- a/openmc/capi.py +++ b/openmc/capi.py @@ -10,10 +10,12 @@ automatically loaded. Calls to the OpenMC library can then be made, for example: """ +from collections import Mapping from contextlib import contextmanager from ctypes import CDLL, c_int, c_int32, c_double, c_char_p, POINTER import sys from warnings import warn +from weakref import WeakValueDictionary import numpy as np from numpy.ctypeslib import as_array @@ -52,6 +54,9 @@ def _error_handler(err, func, args): elif err == _error_code('e_nuclide_not_allocated'): raise MemoryError("Memory has not been allocated for nuclides.") + elif err == _error_code('e_nuclide_not_loaded'): + raise KeyError("No nuclide named '{}' has been loaded.") + elif err == _error_code('e_nuclide_not_in_library'): raise KeyError("Specified nuclide doesn't exist in the cross " "section library.") @@ -72,6 +77,172 @@ def _error_handler(err, func, args): raise Exception("Unknown error encountered (code {}).".format(err)) + + +class MaterialView(object): + __instances = WeakValueDictionary() + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + mat_id = c_int32() + _dll.openmc_material_id(self._index, mat_id) + return mat_id.value + + @property + def nuclides(self): + return self._get_densities()[0] + return nuclides + + @property + def densities(self): + return self._get_densities()[1] + + def _get_densities(self): + """Get atom densities in a material. + + Returns + ------- + list of string + List of nuclide names + numpy.ndarray + Array of densities in atom/b-cm + + """ + # Allocate memory for arguments that are written to + nuclides = POINTER(c_int)() + densities = POINTER(c_double)() + n = c_int() + + # Get nuclide names and densities + _dll.openmc_material_get_densities(self._index, nuclides, densities, n) + + # Convert to appropriate types and return + nuclide_list = [NuclideView(nuclides[i]).name for i in range(n.value)] + density_array = as_array(densities, (n.value,)) + return nuclide_list, density_array + + def add_nuclide(name, density): + """Add a nuclide to a material. + + Parameters + ---------- + name : str + Name of nuclide, e.g. 'U235' + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_add_nuclide(self._index, name.encode(), density) + + def set_density(self, density): + """Set density of a material. + + Parameters + ---------- + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_set_density(self._index, density) + + def set_densities(self, nuclides, densities): + """Set the densities of a list of nuclides in a material + + Parameters + ---------- + nuclides : iterable of str + Nuclide names + densities : iterable of float + Corresponding densities in atom/b-cm + + """ + # Convert strings to an array of char* + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + + # Get numpy array as a double* + d = np.asarray(densities) + dp = d.ctypes.data_as(POINTER(c_double)) + + _dll.openmc_material_set_densities(self._index, len(nuclides), nucs, dp) + + +class _MaterialMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_material(key, index) + return MaterialView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield MaterialView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_materials').value + +materials = _MaterialMapping() + + +class NuclideView(object): + __instances = WeakValueDictionary() + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def name(self): + """Name of nuclide with given index + + Parameter + --------- + index : int + Index in internal nuclides array + + Returns + ------- + str + Name of nuclide + + """ + name = c_char_p() + _dll.openmc_nuclide_name(self._index, name) + + # Find blank in name + i = 0 + while name.value[i:i+1] != b' ': + i += 1 + return name.value[:i].decode() + + +class _NuclideMapping(Mapping): + def __getitem__(self, key): + index = c_int() + _dll.openmc_get_nuclide(key.encode(), index) + return NuclideView(index) + + def __iter__(self): + for i in range(len(self)): + yield NuclideView(i + 1).name + + def __len__(self): + return c_int.in_dll(_dll, 'n_nuclides').value + +nuclides = _NuclideMapping() + + def calculate_volumes(): """Run stochastic volume calculation""" _dll.openmc_calculate_volumes() @@ -181,112 +352,6 @@ def load_nuclide(name): _dll.openmc_load_nuclide(name.encode()) -def material_add_nuclide(mat_id, name, density): - """Add a nuclide to a material. - - Parameters - ---------- - mat_id : int - ID of the material - name : str - Name of nuclide, e.g. 'U235' - density : float - Density in atom/b-cm - - """ - _dll.openmc_material_add_nuclide(mat_id, name.encode(), density) - - -def material_get_densities(mat_id): - """Get atom densities in a material. - - Parameters - ---------- - mat_id : int - ID of the material - - Returns - ------- - list of string - List of nuclide names - numpy.ndarray - Array of densities in atom/b-cm - - """ - # Allocate memory for arguments that are written to - nuclides = POINTER(c_int)() - densities = POINTER(c_double)() - n = c_int() - - # Get nuclide names and densities - _dll.openmc_material_get_densities(mat_id, nuclides, densities, n) - - # Convert to appropriate types and return - nuclide_list = [nuclide_name(nuclides[i]) for i in range(n.value)] - density_array = as_array(densities, (n.value,)) - return nuclide_list, density_array - - -def material_set_density(mat_id, density): - """Set density of a material. - - Parameters - ---------- - mat_id : int - ID of the material - density : float - Density in atom/b-cm - - """ - _dll.openmc_material_set_density(mat_id, density) - - -def material_set_densities(mat_id, nuclides, densities): - """Set the densities of a list of nuclides in a material - - Parameters - ---------- - mat_id : int - ID of the material - nuclides : iterable of str - Nuclide names - densities : iterable of float - Corresponding densities in atom/b-cm - - """ - # Convert strings to an array of char* - nucs = (c_char_p * len(nuclides))() - nucs[:] = [x.encode() for x in nuclides] - - # Get numpy array as a double* - d = np.asarray(densities) - dp = d.ctypes.data_as(POINTER(c_double)) - - _dll.openmc_material_set_densities(mat_id, len(nuclides), nucs, dp) - - -def nuclide_name(index): - """Name of nuclide with given index - - Parameter - --------- - index : int - Index in internal nuclides array - - Returns - ------- - str - Name of nuclide - - """ - name = c_char_p() - _dll.openmc_nuclide_name(index, name) - - # Find blank in name - i = 0 - while name.value[i:i+1] != b' ': - i += 1 - return name.value[:i].decode() def plot_geometry(): @@ -368,13 +433,9 @@ except OSError: "calls to OpenMC.") _available = False +# Set argument/return types if _available: - # Set argument/return types _dll.openmc_calculate_volumes.restype = None - _dll.openmc_cell_set_temperature.argtypes = [ - c_int32, c_double, POINTER(c_int32)] - _dll.openmc_cell_set_temperature.restype = c_int - _dll.openmc_cell_set_temperature.errcheck = _error_handler _dll.openmc_finalize.restype = None _dll.openmc_find.argtypes = [ POINTER(_double3), c_int, POINTER(c_int32), POINTER(c_int32)] @@ -385,15 +446,24 @@ if _available: _dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] _dll.openmc_get_keff.restype = c_int _dll.openmc_get_keff.errcheck = _error_handler - _dll.openmc_load_nuclide.argtypes = [c_char_p] - _dll.openmc_load_nuclide.restype = c_int - _dll.openmc_load_nuclide.errcheck = _error_handler - # Material interface + # Cell functions + _dll.openmc_cell_set_temperature.argtypes = [ + c_int32, c_double, POINTER(c_int32)] + _dll.openmc_cell_set_temperature.restype = c_int + _dll.openmc_cell_set_temperature.errcheck = _error_handler + + # Material functions + _dll.openmc_get_material.argtypes = [c_int32, POINTER(c_int32)] + _dll.openmc_get_material.restype = c_int + _dll.openmc_get_material.errcheck = _error_handler _dll.openmc_material_add_nuclide.argtypes = [ c_int32, c_char_p, c_double] _dll.openmc_material_add_nuclide.restype = c_int _dll.openmc_material_add_nuclide.errcheck = _error_handler + _dll.openmc_material_id.argtypes = [c_int32, POINTER(c_int32)] + _dll.openmc_material_id.restype = c_int + _dll.openmc_material_id.errcheck = _error_handler _dll.openmc_material_get_densities.argtypes = [ c_int32, _int_array, _double_array, POINTER(c_int)] _dll.openmc_material_get_densities.restype = c_int @@ -406,12 +476,22 @@ if _available: _dll.openmc_material_set_densities.restype = c_int _dll.openmc_material_set_densities.errcheck = _error_handler + # Nuclide functions + _dll.openmc_get_nuclide.argtypes = [c_char_p, POINTER(c_int)] + _dll.openmc_get_nuclide.restype = c_int + _dll.openmc_get_nuclide.errcheck = _error_handler + _dll.openmc_load_nuclide.argtypes = [c_char_p] + _dll.openmc_load_nuclide.restype = c_int + _dll.openmc_load_nuclide.errcheck = _error_handler _dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] _dll.openmc_nuclide_name.restype = c_int _dll.openmc_nuclide_name.errcheck = _error_handler + _dll.openmc_plot_geometry.restype = None _dll.openmc_run.restype = None _dll.openmc_reset.restype = None + + # Tally functions _dll.openmc_tally_results.argtypes = [ c_int32, _double_array, POINTER(_int3)] _dll.openmc_tally_results.restype = c_int diff --git a/src/api.F90 b/src/api.F90 index 6b71bf2fc..0d4c50f41 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -27,8 +27,11 @@ module openmc_api public :: openmc_finalize public :: openmc_find public :: openmc_get_keff + public :: openmc_get_material + public :: openmc_get_nuclide public :: openmc_init public :: openmc_load_nuclide + public :: openmc_material_id public :: openmc_material_add_nuclide public :: openmc_material_get_densities public :: openmc_material_set_density @@ -46,11 +49,12 @@ module openmc_api integer(C_INT), public, bind(C) :: E_CELL_INVALID_ID = -4 integer(C_INT), public, bind(C) :: E_CELL_NOT_FOUND = -5 integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_ALLOCATED = -6 - integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_IN_LIBRARY = -7 - integer(C_INT), public, bind(C) :: E_MATERIAL_NOT_ALLOCATED = -8 - integer(C_INT), public, bind(C) :: E_MATERIAL_INVALID_ID = -9 - integer(C_INT), public, bind(C) :: E_TALLY_NOT_ALLOCATED = -10 - integer(C_INT), public, bind(C) :: E_TALLY_INVALID_ID = -11 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_LOADED = -7 + integer(C_INT), public, bind(C) :: E_NUCLIDE_NOT_IN_LIBRARY = -8 + integer(C_INT), public, bind(C) :: E_MATERIAL_NOT_ALLOCATED = -9 + integer(C_INT), public, bind(C) :: E_MATERIAL_INVALID_ID = -10 + integer(C_INT), public, bind(C) :: E_TALLY_NOT_ALLOCATED = -11 + integer(C_INT), public, bind(C) :: E_TALLY_INVALID_ID = -12 contains @@ -223,11 +227,60 @@ contains end function openmc_find !=============================================================================== -! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library +! OPENMC_GET_MATERIAL returns the index in the materials array of a material +! with a given ID +!=============================================================================== + + function openmc_get_material(id, index) result(err) bind(C) + integer(C_INT32_T), value :: id + integer(C_INT32_T), intent(out) :: index + integer(C_INT) :: err + + if (allocated(materials)) then + if (material_dict % has_key(id)) then + index = material_dict % get_key(id) + err = 0 + else + err = E_MATERIAL_INVALID_ID + end if + else + err = E_MATERIAL_NOT_ALLOCATED + end if + end function openmc_get_material + +!=============================================================================== +! OPENMC_GET_NUCLIDE returns the index in the nuclides array of a nuclide +! with a given name +!=============================================================================== + + function openmc_get_nuclide(name, index) result(err) bind(C) + character(kind=C_CHAR), intent(in) :: name(*) + integer(C_INT), intent(out) :: index + integer(C_INT) :: err + + character(:), allocatable :: name_ + + ! Copy array of C_CHARs to normal Fortran string + name_ = to_f_string(name) + + if (allocated(nuclides)) then + if (nuclide_dict % has_key(to_lower(name_))) then + index = nuclide_dict % get_key(to_lower(name_)) + err = 0 + else + err = E_NUCLIDE_NOT_LOADED + end if + else + err = E_NUCLIDE_NOT_ALLOCATED + end if + end function openmc_get_nuclide + +!=============================================================================== +! OPENMC_LOAD_LOAD loads a nuclide from the cross section library !=============================================================================== function openmc_load_nuclide(name) result(err) bind(C) - character(kind=C_CHAR) :: name(*) + character(kind=C_CHAR), intent(in) :: name(*) integer(C_INT) :: err integer :: i_library @@ -287,13 +340,13 @@ contains ! OPENMC_MATERIAL_ADD_NUCLIDE !=============================================================================== - function openmc_material_add_nuclide(id, name, density) result(err) bind(C) - integer(C_INT32_T), value, intent(in) :: id + function openmc_material_add_nuclide(index, name, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index character(kind=C_CHAR) :: name(*) real(C_DOUBLE), value, intent(in) :: density integer(C_INT) :: err - integer :: i, j, k, n + integer :: j, k, n real(8) :: awr integer, allocatable :: new_nuclide(:) real(8), allocatable :: new_density(:) @@ -302,55 +355,50 @@ contains name_ = to_f_string(name) err = E_UNASSIGNED - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - ! Check if nuclide is already in material - do j = 1, size(m % nuclide) - k = m % nuclide(j) - if (nuclides(k) % name == name_) then - awr = nuclides(k) % awr - m % density = m % density + density - m % atom_density(j) - m % density_gpcc = m % density_gpcc + (density - & - m % atom_density(j)) * awr * MASS_NEUTRON / N_AVOGADRO - m % atom_density(j) = density - err = 0 - end if - end do - - ! If nuclide wasn't found, extend nuclide/density arrays - if (err /= 0) then - ! If nuclide hasn't been loaded, load it now - err = openmc_load_nuclide(name) - - if (err == 0) then - ! Extend arrays - n = size(m % nuclide) - allocate(new_nuclide(n + 1)) - new_nuclide(1:n) = m % nuclide - call move_alloc(FROM=new_nuclide, TO=m % nuclide) - - allocate(new_density(n + 1)) - new_density(1:n) = m % atom_density - call move_alloc(FROM=new_density, TO=m % atom_density) - - ! Append new nuclide/density - k = nuclide_dict % get_key(to_lower(name_)) - m % nuclide(n + 1) = k - m % atom_density(n + 1) = density - m % density = m % density + density - m % density_gpcc = m % density_gpcc + & - density * nuclides(k) % awr * MASS_NEUTRON / N_AVOGADRO - m % n_nuclides = n + 1 - end if + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + ! Check if nuclide is already in material + do j = 1, size(m % nuclide) + k = m % nuclide(j) + if (nuclides(k) % name == name_) then + awr = nuclides(k) % awr + m % density = m % density + density - m % atom_density(j) + m % density_gpcc = m % density_gpcc + (density - & + m % atom_density(j)) * awr * MASS_NEUTRON / N_AVOGADRO + m % atom_density(j) = density + err = 0 end if - end associate - else - err = E_MATERIAL_INVALID_ID - end if + end do + + ! If nuclide wasn't found, extend nuclide/density arrays + if (err /= 0) then + ! If nuclide hasn't been loaded, load it now + err = openmc_load_nuclide(name) + + if (err == 0) then + ! Extend arrays + n = size(m % nuclide) + allocate(new_nuclide(n + 1)) + new_nuclide(1:n) = m % nuclide + call move_alloc(FROM=new_nuclide, TO=m % nuclide) + + allocate(new_density(n + 1)) + new_density(1:n) = m % atom_density + call move_alloc(FROM=new_density, TO=m % atom_density) + + ! Append new nuclide/density + k = nuclide_dict % get_key(to_lower(name_)) + m % nuclide(n + 1) = k + m % atom_density(n + 1) = density + m % density = m % density + density + m % density_gpcc = m % density_gpcc + & + density * nuclides(k) % awr * MASS_NEUTRON / N_AVOGADRO + m % n_nuclides = n + 1 + end if + end if + end associate else - err = E_MATERIAL_NOT_ALLOCATED + err = E_OUT_OF_BOUNDS end if end function openmc_material_add_nuclide @@ -360,39 +408,115 @@ contains ! material !=============================================================================== - function openmc_material_get_densities(id, nuclides, densities, n) & + function openmc_material_get_densities(index, nuclides, densities, n) & result(err) bind(C) - integer(C_INT32_T), intent(in), value :: id + integer(C_INT32_T), value :: index type(C_PTR), intent(out) :: nuclides type(C_PTR), intent(out) :: densities integer(C_INT), intent(out) :: n integer(C_INT) :: err - integer :: i - - nuclides = C_NULL_PTR - densities = C_NULL_PTR - n = -1 err = E_UNASSIGNED - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - if (allocated(m % atom_density)) then - nuclides = C_LOC(m % nuclide(1)) - densities = C_LOC(m % atom_density(1)) - n = size(m % atom_density) - err = 0 - end if - end associate - else - err = E_MATERIAL_INVALID_ID - end if + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + if (allocated(m % atom_density)) then + nuclides = C_LOC(m % nuclide(1)) + densities = C_LOC(m % atom_density(1)) + n = size(m % atom_density) + err = 0 + end if + end associate else - err = E_MATERIAL_NOT_ALLOCATED + err = E_OUT_OF_BOUNDS end if end function openmc_material_get_densities +!=============================================================================== +! OPENMC_MATERIAL_ID returns the ID of a material +!=============================================================================== + + function openmc_material_id(index, id) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT32_T), intent(out) :: id + integer(C_INT) :: err + + if (index >= 1 .and. index <= size(materials)) then + id = materials(index) % id + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_material_id + +!=============================================================================== +! OPENMC_MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm +!=============================================================================== + + function openmc_material_set_density(index, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index + real(C_DOUBLE), value, intent(in) :: density + integer(C_INT) :: err + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + err = m % set_density(density, nuclides) + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_material_set_density + +!=============================================================================== +! OPENMC_MATERIAL_SET_DENSITIES sets the densities for a list of nuclides in a +! material. If the nuclides don't already exist in the material, they will be +! added +!=============================================================================== + + function openmc_material_set_densities(index, n, name, density) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index + integer(C_INT), value, intent(in) :: n + type(C_PTR), intent(in) :: name(n) + real(C_DOUBLE), intent(in) :: density(n) + integer(C_INT) :: err + + integer :: i, j, k + character(C_CHAR), pointer :: string(:) + character(len=:, kind=C_CHAR), allocatable :: name_ + + if (index >= 1 .and. index <= size(materials)) then + associate (m => materials(index)) + do i = 1, n + ! Convert C string to Fortran string + call c_f_pointer(name(i), string, [10]) + name_ = to_f_string(string) + + ! Find corresponding nuclide and set density + err = E_UNASSIGNED + do j = 1, size(m % nuclide) + k = m % nuclide(j) + if (nuclides(k) % name == name_) then + m % atom_density(j) = density(i) + err = 0 + end if + end do + + ! If nuclide wasn't found, try to load it + if (err /= 0) then + err = openmc_material_add_nuclide(index, string, density(i)) + if (err /= 0) return + end if + end do + + ! Set total density to the sum of the vector + err = m % set_density(sum(m % atom_density), nuclides) + end associate + else + err = E_OUT_OF_BOUNDS + end if + + end function openmc_material_set_densities + !=============================================================================== ! OPENMC_NUCLIDE_NAME returns the name of a nuclide with a given index !=============================================================================== @@ -405,7 +529,6 @@ contains character(C_CHAR), pointer :: name_ err = E_UNASSIGNED - name = C_NULL_PTR if (allocated(nuclides)) then if (index >= 1 .and. index <= size(nuclides)) then name_ => nuclides(index) % name(1:1) @@ -419,87 +542,6 @@ contains end if end function openmc_nuclide_name -!=============================================================================== -! OPENMC_MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm -!=============================================================================== - - function openmc_material_set_density(id, density) result(err) bind(C) - integer(C_INT32_T), value, intent(in) :: id - real(C_DOUBLE), value, intent(in) :: density - integer(C_INT) :: err - - integer :: i - - err = -1 - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - err = m % set_density(density, nuclides) - end associate - else - err = E_MATERIAL_INVALID_ID - end if - else - err = E_MATERIAL_NOT_ALLOCATED - end if - end function openmc_material_set_density - -!=============================================================================== -! OPENMC_MATERIAL_SET_DENSITIES sets the densities for a list of nuclides in a -! material. If the nuclides don't already exist in the material, they will be -! added -!=============================================================================== - - function openmc_material_set_densities(id, n, name, density) result(err) bind(C) - integer(C_INT32_T), value, intent(in) :: id - integer(C_INT), value, intent(in) :: n - type(C_PTR), intent(in) :: name(n) - real(C_DOUBLE), intent(in) :: density(n) - integer(C_INT) :: err - - integer :: i, j, k - character(C_CHAR), pointer :: string(:) - character(len=:, kind=C_CHAR), allocatable :: name_ - - err = E_UNASSIGNED - if (allocated(materials)) then - if (material_dict % has_key(id)) then - i = material_dict % get_key(id) - associate (m => materials(i)) - do i = 1, n - ! Convert C string to Fortran string - call c_f_pointer(name(i), string, [10]) - name_ = to_f_string(string) - - ! Find corresponding nuclide and set density - do j = 1, size(m % nuclide) - k = m % nuclide(j) - if (nuclides(k) % name == name_) then - m % atom_density(j) = density(i) - err = 0 - end if - end do - - ! If nuclide wasn't found, try to load it - if (err /= 0) then - err = openmc_material_add_nuclide(id, string, density(i)) - if (err /= 0) return - end if - end do - - ! Set total density to the sum of the vector - err = m % set_density(sum(m % atom_density), nuclides) - end associate - else - err = E_MATERIAL_INVALID_ID - end if - else - err = E_MATERIAL_NOT_ALLOCATED - end if - - end function openmc_material_set_densities - !=============================================================================== ! OPENMC_RESET resets all tallies !=============================================================================== diff --git a/src/global.F90 b/src/global.F90 index 9d9002e9c..5661cf2af 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -43,11 +43,11 @@ module global type(VolumeCalculation), allocatable :: volume_calcs(:) ! Size of main arrays - integer :: n_cells ! # of cells + integer(C_INT32_T), bind(C) :: n_cells ! # of cells integer :: n_universes ! # of universes integer :: n_lattices ! # of lattices integer :: n_surfaces ! # of surfaces - integer :: n_materials ! # of materials + integer(C_INT32_T), bind(C) :: n_materials ! # of materials integer :: n_plots ! # of plots ! These dictionaries provide a fast lookup mechanism -- the key is the @@ -73,7 +73,8 @@ module global ! ============================================================================ ! CROSS SECTION RELATED VARIABLES NEEDED REGARDLESS OF CE OR MG - integer :: n_nuclides_total ! Number of nuclide cross section tables + ! Number of nuclide cross section tables + integer(C_INT), bind(C, name='n_nuclides') :: n_nuclides_total ! Cross section caches type(NuclideMicroXS), allocatable :: micro_xs(:) ! Cache for each nuclide @@ -192,7 +193,7 @@ module global integer :: n_user_meshes = 0 ! # of structured user meshes integer :: n_filters = 0 ! # of filters integer :: n_user_filters = 0 ! # of user filters - integer :: n_tallies = 0 ! # of tallies + integer(C_INT32_T), bind(C) :: n_tallies = 0 ! # of tallies integer :: n_user_tallies = 0 ! # of user tallies ! Tally derivatives From d9e1d0d4f6725623cde361f51b083a5cad9fa118 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Jul 2017 08:29:56 -0500 Subject: [PATCH 101/123] Move Python bindins to C API into subpackage --- CMakeLists.txt | 2 +- openmc/{capi.py => capi/__init__.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename openmc/{capi.py => capi/__init__.py} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 386c07100..c21b44cc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -412,7 +412,7 @@ target_link_libraries(${program} ${ldflags} libopenmc) add_custom_command(TARGET libopenmc POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ - ${CMAKE_CURRENT_SOURCE_DIR}/openmc/_$ + ${CMAKE_CURRENT_SOURCE_DIR}/openmc/capi/_$ COMMENT "Copying libopenmc to Python module directory") #=============================================================================== diff --git a/openmc/capi.py b/openmc/capi/__init__.py similarity index 100% rename from openmc/capi.py rename to openmc/capi/__init__.py From 692765ef4ac641276a16a4db153a33e6e9240423 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Jul 2017 08:43:48 -0500 Subject: [PATCH 102/123] Move material/nuclide related C API bindings into separate files --- openmc/capi/__init__.py | 261 ++++------------------------------------ openmc/capi/material.py | 147 ++++++++++++++++++++++ openmc/capi/nuclide.py | 86 +++++++++++++ 3 files changed, 256 insertions(+), 238 deletions(-) create mode 100644 openmc/capi/material.py create mode 100644 openmc/capi/nuclide.py diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index 0706d4c77..f8beb2fd7 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -10,21 +10,36 @@ automatically loaded. Calls to the OpenMC library can then be made, for example: """ -from collections import Mapping from contextlib import contextmanager from ctypes import CDLL, c_int, c_int32, c_double, c_char_p, POINTER import sys from warnings import warn -from weakref import WeakValueDictionary -import numpy as np from numpy.ctypeslib import as_array import pkg_resources + +# Determine shared-library suffix +if sys.platform == 'darwin': + _suffix = 'dylib' +else: + _suffix = 'so' + +# Open shared library +_filename = pkg_resources.resource_filename( + __name__, '_libopenmc.{}'.format(_suffix)) +try: + _dll = CDLL(_filename) + _available = True +except OSError: + warn("OpenMC shared library is not available from the Python API. This " + "means you will not be able to use openmc.capi to make in-memory " + "calls to OpenMC.") + _available = False + + _int3 = c_int*3 _double3 = c_double*3 -_int_array = POINTER(POINTER(c_int)) -_double_array = POINTER(POINTER(c_double)) class GeometryError(Exception): @@ -77,172 +92,6 @@ def _error_handler(err, func, args): raise Exception("Unknown error encountered (code {}).".format(err)) - - -class MaterialView(object): - __instances = WeakValueDictionary() - def __new__(cls, *args): - if args not in cls.__instances: - instance = super().__new__(cls) - cls.__instances[args] = instance - return cls.__instances[args] - - def __init__(self, index): - self._index = index - - @property - def id(self): - mat_id = c_int32() - _dll.openmc_material_id(self._index, mat_id) - return mat_id.value - - @property - def nuclides(self): - return self._get_densities()[0] - return nuclides - - @property - def densities(self): - return self._get_densities()[1] - - def _get_densities(self): - """Get atom densities in a material. - - Returns - ------- - list of string - List of nuclide names - numpy.ndarray - Array of densities in atom/b-cm - - """ - # Allocate memory for arguments that are written to - nuclides = POINTER(c_int)() - densities = POINTER(c_double)() - n = c_int() - - # Get nuclide names and densities - _dll.openmc_material_get_densities(self._index, nuclides, densities, n) - - # Convert to appropriate types and return - nuclide_list = [NuclideView(nuclides[i]).name for i in range(n.value)] - density_array = as_array(densities, (n.value,)) - return nuclide_list, density_array - - def add_nuclide(name, density): - """Add a nuclide to a material. - - Parameters - ---------- - name : str - Name of nuclide, e.g. 'U235' - density : float - Density in atom/b-cm - - """ - _dll.openmc_material_add_nuclide(self._index, name.encode(), density) - - def set_density(self, density): - """Set density of a material. - - Parameters - ---------- - density : float - Density in atom/b-cm - - """ - _dll.openmc_material_set_density(self._index, density) - - def set_densities(self, nuclides, densities): - """Set the densities of a list of nuclides in a material - - Parameters - ---------- - nuclides : iterable of str - Nuclide names - densities : iterable of float - Corresponding densities in atom/b-cm - - """ - # Convert strings to an array of char* - nucs = (c_char_p * len(nuclides))() - nucs[:] = [x.encode() for x in nuclides] - - # Get numpy array as a double* - d = np.asarray(densities) - dp = d.ctypes.data_as(POINTER(c_double)) - - _dll.openmc_material_set_densities(self._index, len(nuclides), nucs, dp) - - -class _MaterialMapping(Mapping): - def __getitem__(self, key): - index = c_int32() - _dll.openmc_get_material(key, index) - return MaterialView(index.value) - - def __iter__(self): - for i in range(len(self)): - yield MaterialView(i + 1).id - - def __len__(self): - return c_int32.in_dll(_dll, 'n_materials').value - -materials = _MaterialMapping() - - -class NuclideView(object): - __instances = WeakValueDictionary() - def __new__(cls, *args): - if args not in cls.__instances: - instance = super().__new__(cls) - cls.__instances[args] = instance - return cls.__instances[args] - - def __init__(self, index): - self._index = index - - @property - def name(self): - """Name of nuclide with given index - - Parameter - --------- - index : int - Index in internal nuclides array - - Returns - ------- - str - Name of nuclide - - """ - name = c_char_p() - _dll.openmc_nuclide_name(self._index, name) - - # Find blank in name - i = 0 - while name.value[i:i+1] != b' ': - i += 1 - return name.value[:i].decode() - - -class _NuclideMapping(Mapping): - def __getitem__(self, key): - index = c_int() - _dll.openmc_get_nuclide(key.encode(), index) - return NuclideView(index) - - def __iter__(self): - for i in range(len(self)): - yield NuclideView(i + 1).name - - def __len__(self): - return c_int.in_dll(_dll, 'n_nuclides').value - -nuclides = _NuclideMapping() - - def calculate_volumes(): """Run stochastic volume calculation""" _dll.openmc_calculate_volumes() @@ -264,7 +113,6 @@ def cell_set_temperature(cell_id, T, instance=None): _dll.openmc_cell_set_temperature(cell_id, T, instance) - def finalize(): """Finalize simulation and free memory""" _dll.openmc_finalize() @@ -340,20 +188,6 @@ def keff(): return tuple(k) -def load_nuclide(name): - """Load cross section data for a nuclide. - - Parameters - ---------- - name : str - Name of nuclide, e.g. 'U235' - - """ - _dll.openmc_load_nuclide(name.encode()) - - - - def plot_geometry(): """Plot geometry""" _dll.openmc_plot_geometry() @@ -415,24 +249,6 @@ def run_in_memory(intracomm=None): finalize() -# Determine shared-library suffix -if sys.platform == 'darwin': - _suffix = 'dylib' -else: - _suffix = 'so' - -# Open shared library -_filename = pkg_resources.resource_filename( - __name__, '_libopenmc.{}'.format(_suffix)) -try: - _dll = CDLL(_filename) - _available = True -except OSError: - warn("OpenMC shared library is not available from the Python API. This " - "means you will not be able to use openmc.capi to make in-memory " - "calls to OpenMC.") - _available = False - # Set argument/return types if _available: _dll.openmc_calculate_volumes.restype = None @@ -453,40 +269,6 @@ if _available: _dll.openmc_cell_set_temperature.restype = c_int _dll.openmc_cell_set_temperature.errcheck = _error_handler - # Material functions - _dll.openmc_get_material.argtypes = [c_int32, POINTER(c_int32)] - _dll.openmc_get_material.restype = c_int - _dll.openmc_get_material.errcheck = _error_handler - _dll.openmc_material_add_nuclide.argtypes = [ - c_int32, c_char_p, c_double] - _dll.openmc_material_add_nuclide.restype = c_int - _dll.openmc_material_add_nuclide.errcheck = _error_handler - _dll.openmc_material_id.argtypes = [c_int32, POINTER(c_int32)] - _dll.openmc_material_id.restype = c_int - _dll.openmc_material_id.errcheck = _error_handler - _dll.openmc_material_get_densities.argtypes = [ - c_int32, _int_array, _double_array, POINTER(c_int)] - _dll.openmc_material_get_densities.restype = c_int - _dll.openmc_material_get_densities.errcheck = _error_handler - _dll.openmc_material_set_density.argtypes = [c_int32, c_double] - _dll.openmc_material_set_density.restype = c_int - _dll.openmc_material_set_density.errcheck = _error_handler - _dll.openmc_material_set_densities.argtypes = [ - c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] - _dll.openmc_material_set_densities.restype = c_int - _dll.openmc_material_set_densities.errcheck = _error_handler - - # Nuclide functions - _dll.openmc_get_nuclide.argtypes = [c_char_p, POINTER(c_int)] - _dll.openmc_get_nuclide.restype = c_int - _dll.openmc_get_nuclide.errcheck = _error_handler - _dll.openmc_load_nuclide.argtypes = [c_char_p] - _dll.openmc_load_nuclide.restype = c_int - _dll.openmc_load_nuclide.errcheck = _error_handler - _dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] - _dll.openmc_nuclide_name.restype = c_int - _dll.openmc_nuclide_name.errcheck = _error_handler - _dll.openmc_plot_geometry.restype = None _dll.openmc_run.restype = None _dll.openmc_reset.restype = None @@ -496,3 +278,6 @@ if _available: c_int32, _double_array, POINTER(_int3)] _dll.openmc_tally_results.restype = c_int _dll.openmc_tally_results.errcheck = _error_handler + + from .nuclide import * + from .material import * diff --git a/openmc/capi/material.py b/openmc/capi/material.py new file mode 100644 index 000000000..186395788 --- /dev/null +++ b/openmc/capi/material.py @@ -0,0 +1,147 @@ +from collections import Mapping +from ctypes import c_int, c_int32, c_double, c_char_p, POINTER +from weakref import WeakValueDictionary + +import numpy as np +from numpy.ctypeslib import as_array + +from openmc.capi import _dll, _error_handler, NuclideView + +__all__ = ['MaterialView', 'materials'] + + +# Material functions +_dll.openmc_get_material.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_get_material.restype = c_int +_dll.openmc_get_material.errcheck = _error_handler +_dll.openmc_material_add_nuclide.argtypes = [ + c_int32, c_char_p, c_double] +_dll.openmc_material_add_nuclide.restype = c_int +_dll.openmc_material_add_nuclide.errcheck = _error_handler +_dll.openmc_material_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_material_id.restype = c_int +_dll.openmc_material_id.errcheck = _error_handler +_dll.openmc_material_get_densities.argtypes = [ + c_int32, POINTER(POINTER(c_int)), POINTER(POINTER(c_double)), + POINTER(c_int)] +_dll.openmc_material_get_densities.restype = c_int +_dll.openmc_material_get_densities.errcheck = _error_handler +_dll.openmc_material_set_density.argtypes = [c_int32, c_double] +_dll.openmc_material_set_density.restype = c_int +_dll.openmc_material_set_density.errcheck = _error_handler +_dll.openmc_material_set_densities.argtypes = [ + c_int32, c_int, POINTER(c_char_p), POINTER(c_double)] +_dll.openmc_material_set_densities.restype = c_int +_dll.openmc_material_set_densities.errcheck = _error_handler + + +class MaterialView(object): + __instances = WeakValueDictionary() + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + mat_id = c_int32() + _dll.openmc_material_id(self._index, mat_id) + return mat_id.value + + @property + def nuclides(self): + return self._get_densities()[0] + return nuclides + + @property + def densities(self): + return self._get_densities()[1] + + def _get_densities(self): + """Get atom densities in a material. + + Returns + ------- + list of string + List of nuclide names + numpy.ndarray + Array of densities in atom/b-cm + + """ + # Allocate memory for arguments that are written to + nuclides = POINTER(c_int)() + densities = POINTER(c_double)() + n = c_int() + + # Get nuclide names and densities + _dll.openmc_material_get_densities(self._index, nuclides, densities, n) + + # Convert to appropriate types and return + nuclide_list = [NuclideView(nuclides[i]).name for i in range(n.value)] + density_array = as_array(densities, (n.value,)) + return nuclide_list, density_array + + def add_nuclide(name, density): + """Add a nuclide to a material. + + Parameters + ---------- + name : str + Name of nuclide, e.g. 'U235' + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_add_nuclide(self._index, name.encode(), density) + + def set_density(self, density): + """Set density of a material. + + Parameters + ---------- + density : float + Density in atom/b-cm + + """ + _dll.openmc_material_set_density(self._index, density) + + def set_densities(self, nuclides, densities): + """Set the densities of a list of nuclides in a material + + Parameters + ---------- + nuclides : iterable of str + Nuclide names + densities : iterable of float + Corresponding densities in atom/b-cm + + """ + # Convert strings to an array of char* + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + + # Get numpy array as a double* + d = np.asarray(densities) + dp = d.ctypes.data_as(POINTER(c_double)) + + _dll.openmc_material_set_densities(self._index, len(nuclides), nucs, dp) + + +class _MaterialMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_material(key, index) + return MaterialView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield MaterialView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_materials').value + +materials = _MaterialMapping() diff --git a/openmc/capi/nuclide.py b/openmc/capi/nuclide.py new file mode 100644 index 000000000..7a2f7a37b --- /dev/null +++ b/openmc/capi/nuclide.py @@ -0,0 +1,86 @@ +from collections import Mapping +from ctypes import c_int, c_char_p, POINTER +from weakref import WeakValueDictionary + +import numpy as np +from numpy.ctypeslib import as_array + +from openmc.capi import _dll, _error_handler + + +__all__ = ['NuclideView', 'nuclides', 'load_nuclide'] + +# Nuclide functions +_dll.openmc_get_nuclide.argtypes = [c_char_p, POINTER(c_int)] +_dll.openmc_get_nuclide.restype = c_int +_dll.openmc_get_nuclide.errcheck = _error_handler +_dll.openmc_load_nuclide.argtypes = [c_char_p] +_dll.openmc_load_nuclide.restype = c_int +_dll.openmc_load_nuclide.errcheck = _error_handler +_dll.openmc_nuclide_name.argtypes = [c_int, POINTER(c_char_p)] +_dll.openmc_nuclide_name.restype = c_int +_dll.openmc_nuclide_name.errcheck = _error_handler + + +def load_nuclide(name): + """Load cross section data for a nuclide. + + Parameters + ---------- + name : str + Name of nuclide, e.g. 'U235' + + """ + _dll.openmc_load_nuclide(name.encode()) + + +class NuclideView(object): + __instances = WeakValueDictionary() + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def name(self): + """Name of nuclide with given index + + Parameter + --------- + index : int + Index in internal nuclides array + + Returns + ------- + str + Name of nuclide + + """ + name = c_char_p() + _dll.openmc_nuclide_name(self._index, name) + + # Find blank in name + i = 0 + while name.value[i:i+1] != b' ': + i += 1 + return name.value[:i].decode() + + +class _NuclideMapping(Mapping): + def __getitem__(self, key): + index = c_int() + _dll.openmc_get_nuclide(key.encode(), index) + return NuclideView(index) + + def __iter__(self): + for i in range(len(self)): + yield NuclideView(i + 1).name + + def __len__(self): + return c_int.in_dll(_dll, 'n_nuclides').value + +nuclides = _NuclideMapping() From 050cb6e016ff6ddb29db07170a2d19a9eac9a259 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Jul 2017 09:04:41 -0500 Subject: [PATCH 103/123] Move cell/tally functionality into View/Mapping classes --- openmc/capi/__init__.py | 56 ++-------------- openmc/capi/cell.py | 68 +++++++++++++++++++ openmc/capi/tally.py | 71 ++++++++++++++++++++ src/api.F90 | 140 +++++++++++++++++++++++++++++----------- 4 files changed, 247 insertions(+), 88 deletions(-) create mode 100644 openmc/capi/cell.py create mode 100644 openmc/capi/tally.py diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index f8beb2fd7..b3b5731c1 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -38,8 +38,6 @@ except OSError: _available = False -_int3 = c_int*3 -_double3 = c_double*3 class GeometryError(Exception): @@ -97,22 +95,6 @@ def calculate_volumes(): _dll.openmc_calculate_volumes() -def cell_set_temperature(cell_id, T, instance=None): - """Set the temperature of a cell - - Parameters - ---------- - cell_id : int - ID of the cell - T : float - Temperature in K - instance : int or None - Which instance of the cell - - """ - _dll.openmc_cell_set_temperature(cell_id, T, instance) - - def finalize(): """Finalize simulation and free memory""" _dll.openmc_finalize() @@ -149,7 +131,7 @@ def find(xyz, rtype='cell'): # Call openmc_find uid = c_int32() instance = c_int32() - _dll.openmc_find(_double3(*xyz), r_int, uid, instance) + _dll.openmc_find((c_double*3)(*xyz), r_int, uid, instance) return (uid.value if uid != 0 else None), instance.value @@ -203,25 +185,6 @@ def run(): _dll.openmc_run() -def tally_results(tally_id): - """Get tally results array - - Parameters - ---------- - tally_id : int - ID of tally - - Returns - ------- - numpy.ndarray - Array that exposes the internal tally results array - - """ - data = POINTER(c_double)() - shape = _int3() - _dll.openmc_tally_results(tally_id, data, shape) - return as_array(data, tuple(shape[::-1])) - @contextmanager def run_in_memory(intracomm=None): @@ -254,7 +217,7 @@ if _available: _dll.openmc_calculate_volumes.restype = None _dll.openmc_finalize.restype = None _dll.openmc_find.argtypes = [ - POINTER(_double3), c_int, POINTER(c_int32), POINTER(c_int32)] + POINTER(c_double*3), c_int, POINTER(c_int32), POINTER(c_int32)] _dll.openmc_find.restype = c_int _dll.openmc_find.errcheck = _error_handler _dll.openmc_init.argtypes = [POINTER(c_int)] @@ -262,22 +225,11 @@ if _available: _dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] _dll.openmc_get_keff.restype = c_int _dll.openmc_get_keff.errcheck = _error_handler - - # Cell functions - _dll.openmc_cell_set_temperature.argtypes = [ - c_int32, c_double, POINTER(c_int32)] - _dll.openmc_cell_set_temperature.restype = c_int - _dll.openmc_cell_set_temperature.errcheck = _error_handler - _dll.openmc_plot_geometry.restype = None _dll.openmc_run.restype = None _dll.openmc_reset.restype = None - # Tally functions - _dll.openmc_tally_results.argtypes = [ - c_int32, _double_array, POINTER(_int3)] - _dll.openmc_tally_results.restype = c_int - _dll.openmc_tally_results.errcheck = _error_handler - from .nuclide import * from .material import * + from .cell import * + from .tally import * diff --git a/openmc/capi/cell.py b/openmc/capi/cell.py new file mode 100644 index 000000000..fba34db85 --- /dev/null +++ b/openmc/capi/cell.py @@ -0,0 +1,68 @@ +from collections import Mapping +from ctypes import c_int, c_int32, c_double, c_char_p, POINTER +from weakref import WeakValueDictionary + +import numpy as np + +from openmc.capi import _dll, _error_handler + +__all__ = ['CellView', 'cells'] + +# Cell functions +_dll.openmc_cell_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_cell_id.restype = c_int +_dll.openmc_cell_id.errcheck = _error_handler +_dll.openmc_cell_set_temperature.argtypes = [ + c_int32, c_double, POINTER(c_int32)] +_dll.openmc_cell_set_temperature.restype = c_int +_dll.openmc_cell_set_temperature.errcheck = _error_handler +_dll.openmc_get_cell.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_get_cell.restype = c_int +_dll.openmc_get_cell.errcheck = _error_handler + + +class CellView(object): + __instances = WeakValueDictionary() + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + cell_id = c_int32() + _dll.openmc_cell_id(self._index, cell_id) + return cell_id.value + + def set_temperature(self, T, instance=None): + """Set the temperature of a cell + + Parameters + ---------- + T : float + Temperature in K + instance : int or None + Which instance of the cell + + """ + _dll.openmc_cell_set_temperature(self._index, T, instance) + + +class _CellMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_cell(key, index) + return CellView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield CellView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_cells').value + +cells = _CellMapping() diff --git a/openmc/capi/tally.py b/openmc/capi/tally.py new file mode 100644 index 000000000..f60d94e92 --- /dev/null +++ b/openmc/capi/tally.py @@ -0,0 +1,71 @@ +from collections import Mapping +from ctypes import c_int, c_int32, c_double, c_char_p, POINTER +from weakref import WeakValueDictionary + +from numpy.ctypeslib import as_array + +from openmc.capi import _dll, _error_handler, NuclideView + + +__all__ = ['TallyView', 'tallies'] + +# Tally functions +_dll.openmc_get_tally.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_get_tally.restype = c_int +_dll.openmc_get_tally.errcheck = _error_handler +_dll.openmc_tally_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_tally_id.restype = c_int +_dll.openmc_tally_id.errcheck = _error_handler +_dll.openmc_tally_results.argtypes = [ + c_int32, POINTER(POINTER(c_double)), POINTER(c_int*3)] +_dll.openmc_tally_results.restype = c_int +_dll.openmc_tally_results.errcheck = _error_handler + + +class TallyView(object): + __instances = WeakValueDictionary() + def __new__(cls, *args): + if args not in cls.__instances: + instance = super().__new__(cls) + cls.__instances[args] = instance + return cls.__instances[args] + + def __init__(self, index): + self._index = index + + @property + def id(self): + tally_id = c_int32() + _dll.openmc_tally_id(self._index, tally_id) + return tally_id.value + + @property + def results(self): + """Get tally results array + + Returns + ------- + numpy.ndarray + Array that exposes the internal tally results array + + """ + data = POINTER(c_double)() + shape = (c_int*3)() + _dll.openmc_tally_results(self._index, data, shape) + return as_array(data, tuple(shape[::-1])) + + +class _TallyMapping(Mapping): + def __getitem__(self, key): + index = c_int32() + _dll.openmc_get_tally(key, index) + return TallyView(index.value) + + def __iter__(self): + for i in range(len(self)): + yield TallyView(i + 1).id + + def __len__(self): + return c_int32.in_dll(_dll, 'n_tallies').value + +tallies = _TallyMapping() diff --git a/src/api.F90 b/src/api.F90 index 0d4c50f41..6d50ca51e 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -23,12 +23,15 @@ module openmc_api private public :: openmc_calculate_volumes + public :: openmc_cell_id public :: openmc_cell_set_temperature public :: openmc_finalize public :: openmc_find + public :: openmc_get_cell public :: openmc_get_keff public :: openmc_get_material public :: openmc_get_nuclide + public :: openmc_get_tally public :: openmc_init public :: openmc_load_nuclide public :: openmc_material_id @@ -40,6 +43,7 @@ module openmc_api public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run + public :: openmc_tally_id public :: openmc_tally_results ! Error codes @@ -58,12 +62,29 @@ module openmc_api contains +!=============================================================================== +! OPENMC_CELL_ID returns the ID of a cell +!=============================================================================== + + function openmc_cell_id(index, id) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT32_T), intent(out) :: id + integer(C_INT) :: err + + if (index >= 1 .and. index <= size(cells)) then + id = cells(index) % id + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_cell_id + !=============================================================================== ! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell !=============================================================================== - function openmc_cell_set_temperature(id, T, instance) result(err) bind(C) - integer(C_INT32_T), value, intent(in) :: id ! id of cell + function openmc_cell_set_temperature(index, T, instance) result(err) bind(C) + integer(C_INT32_T), value, intent(in) :: index real(C_DOUBLE), value, intent(in) :: T integer(C_INT32_T), optional, intent(in) :: instance integer(C_INT) :: err @@ -71,28 +92,23 @@ contains integer :: i, n err = E_UNASSIGNED - if (allocated(cells)) then - if (cell_dict % has_key(id)) then - i = cell_dict % get_key(id) - associate (c => cells(i)) - if (allocated(c % sqrtkT)) then - n = size(c % sqrtkT) - if (present(instance) .and. n > 1) then - if (instance >= 0 .and. instance < n) then - c % sqrtkT(instance + 1) = sqrt(K_BOLTZMANN * T) - err = 0 - end if - else - c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) + if (index >= 1 .and. index <= size(cells)) then + associate (c => cells(i)) + if (allocated(c % sqrtkT)) then + n = size(c % sqrtkT) + if (present(instance) .and. n > 1) then + if (instance >= 0 .and. instance < n) then + c % sqrtkT(instance + 1) = sqrt(K_BOLTZMANN * T) err = 0 end if + else + c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) + err = 0 end if - end associate - else - err = E_CELL_INVALID_ID - end if + end if + end associate else - err = E_CELL_NOT_ALLOCATED + err = E_OUT_OF_BOUNDS end if end function openmc_cell_set_temperature @@ -226,6 +242,27 @@ contains end function openmc_find +!=============================================================================== +! OPENMC_GET_CELL returns the index in the cells array of a cell with a given ID +!=============================================================================== + + function openmc_get_cell(id, index) result(err) bind(C) + integer(C_INT32_T), value :: id + integer(C_INT32_T), intent(out) :: index + integer(C_INT) :: err + + if (allocated(cells)) then + if (cell_dict % has_key(id)) then + index = cell_dict % get_key(id) + err = 0 + else + err = E_CELL_INVALID_ID + end if + else + err = E_CELL_NOT_ALLOCATED + end if + end function openmc_get_cell + !=============================================================================== ! OPENMC_GET_MATERIAL returns the index in the materials array of a material ! with a given ID @@ -275,6 +312,28 @@ contains end if end function openmc_get_nuclide +!=============================================================================== +! OPENMC_GET_TALLY returns the index in the tallies array of a tally +! with a given ID +!=============================================================================== + + function openmc_get_tally(id, index) result(err) bind(C) + integer(C_INT32_T), value :: id + integer(C_INT32_T), intent(out) :: index + integer(C_INT) :: err + + if (allocated(tallies)) then + if (tally_dict % has_key(id)) then + index = tally_dict % get_key(id) + err = 0 + else + err = E_TALLY_INVALID_ID + end if + else + err = E_TALLY_NOT_ALLOCATED + end if + end function openmc_get_tally + !=============================================================================== ! OPENMC_LOAD_LOAD loads a nuclide from the cross section library !=============================================================================== @@ -581,35 +640,44 @@ contains end subroutine openmc_reset +!=============================================================================== +! OPENMC_TALLY_ID returns the ID of a tally +!=============================================================================== + + function openmc_tally_id(index, id) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT32_T), intent(out) :: id + integer(C_INT) :: err + + if (index >= 1 .and. index <= size(tallies)) then + id = tallies(index) % id + err = 0 + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_id + !=============================================================================== ! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its ! shape. This allows a user to obtain in-memory tally results from Python ! directly. !=============================================================================== - function openmc_tally_results(id, ptr, shape_) result(err) bind(C) - integer(C_INT32_T), intent(in), value :: id + function openmc_tally_results(index, ptr, shape_) result(err) bind(C) + integer(C_INT32_T), intent(in), value :: index type(C_PTR), intent(out) :: ptr integer(C_INT), intent(out) :: shape_(3) integer(C_INT) :: err - integer :: i - - ptr = C_NULL_PTR err = E_UNASSIGNED - if (allocated(tallies)) then - if (tally_dict % has_key(id)) then - i = tally_dict % get_key(id) - if (allocated(tallies(i) % results)) then - ptr = C_LOC(tallies(i) % results(1,1,1)) - shape_(:) = shape(tallies(i) % results) - err = 0 - end if - else - err = E_TALLY_INVALID_ID + if (index >= 1 .and. index <= size(tallies)) then + if (allocated(tallies(index) % results)) then + ptr = C_LOC(tallies(index) % results(1,1,1)) + shape_(:) = shape(tallies(index) % results) + err = 0 end if else - err = E_TALLY_NOT_ALLOCATED + err = E_OUT_OF_BOUNDS end if end function openmc_tally_results From 20331519beb2e940fff582f46423e4635bc61684 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Jul 2017 15:15:39 -0500 Subject: [PATCH 104/123] Add TallyView.nuclides --- openmc/capi/tally.py | 12 ++++++++++++ src/api.F90 | 27 ++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/openmc/capi/tally.py b/openmc/capi/tally.py index f60d94e92..b7139bcb6 100644 --- a/openmc/capi/tally.py +++ b/openmc/capi/tally.py @@ -16,6 +16,10 @@ _dll.openmc_get_tally.errcheck = _error_handler _dll.openmc_tally_id.argtypes = [c_int32, POINTER(c_int32)] _dll.openmc_tally_id.restype = c_int _dll.openmc_tally_id.errcheck = _error_handler +_dll.openmc_tally_nuclides.argtypes = [ + c_int32, POINTER(POINTER(c_int)), POINTER(c_int)] +_dll.openmc_tally_nuclides.restype = c_int +_dll.openmc_tally_nuclides.errcheck = _error_handler _dll.openmc_tally_results.argtypes = [ c_int32, POINTER(POINTER(c_double)), POINTER(c_int*3)] _dll.openmc_tally_results.restype = c_int @@ -39,6 +43,14 @@ class TallyView(object): _dll.openmc_tally_id(self._index, tally_id) return tally_id.value + @property + def nuclides(self): + nucs = POINTER(c_int)() + n = c_int() + _dll.openmc_tally_nuclides(self._index, nucs, n) + return [NuclideView(nucs[i]).name if nucs[i] > 0 else 'total' + for i in range(n.value)] + @property def results(self): """Get tally results array diff --git a/src/api.F90 b/src/api.F90 index 6d50ca51e..cd8a8a064 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -44,6 +44,7 @@ module openmc_api public :: openmc_reset public :: openmc_run public :: openmc_tally_id + public :: openmc_tally_nuclides public :: openmc_tally_results ! Error codes @@ -335,7 +336,7 @@ contains end function openmc_get_tally !=============================================================================== -! OPENMC_LOAD_LOAD loads a nuclide from the cross section library +! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library !=============================================================================== function openmc_load_nuclide(name) result(err) bind(C) @@ -657,6 +658,30 @@ contains end if end function openmc_tally_id +!=============================================================================== +! OPENMC_TALLY_NUCLIDES returns the list of nuclides assigned to a tally +!=============================================================================== + + function openmc_tally_nuclides(index, ptr, n) result(err) bind(C) + integer(C_INT32_T), value :: index + type(C_PTR), intent(out) :: ptr + integer(C_INT), intent(out) :: n + integer(C_INT) :: err + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(tallies)) then + associate (t => tallies(index)) + if (allocated(t % nuclide_bins)) then + ptr = C_LOC(t % nuclide_bins(1)) + n = size(t % nuclide_bins) + err = 0 + end if + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_nuclides + !=============================================================================== ! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its ! shape. This allows a user to obtain in-memory tally results from Python From a1a29aeb02911fa12b10823615d0e73c79c9e2c1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Jul 2017 15:49:36 -0500 Subject: [PATCH 105/123] Add TallyView.nuclides setter --- openmc/capi/cell.py | 8 ++--- openmc/capi/material.py | 8 ++--- openmc/capi/tally.py | 25 ++++++++----- src/api.F90 | 79 +++++++++++++++++++++++++++++++++-------- 4 files changed, 90 insertions(+), 30 deletions(-) diff --git a/openmc/capi/cell.py b/openmc/capi/cell.py index fba34db85..1dbe50d51 100644 --- a/openmc/capi/cell.py +++ b/openmc/capi/cell.py @@ -9,9 +9,9 @@ from openmc.capi import _dll, _error_handler __all__ = ['CellView', 'cells'] # Cell functions -_dll.openmc_cell_id.argtypes = [c_int32, POINTER(c_int32)] -_dll.openmc_cell_id.restype = c_int -_dll.openmc_cell_id.errcheck = _error_handler +_dll.openmc_cell_get_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_cell_get_id.restype = c_int +_dll.openmc_cell_get_id.errcheck = _error_handler _dll.openmc_cell_set_temperature.argtypes = [ c_int32, c_double, POINTER(c_int32)] _dll.openmc_cell_set_temperature.restype = c_int @@ -35,7 +35,7 @@ class CellView(object): @property def id(self): cell_id = c_int32() - _dll.openmc_cell_id(self._index, cell_id) + _dll.openmc_cell_get_id(self._index, cell_id) return cell_id.value def set_temperature(self, T, instance=None): diff --git a/openmc/capi/material.py b/openmc/capi/material.py index 186395788..c917d3331 100644 --- a/openmc/capi/material.py +++ b/openmc/capi/material.py @@ -18,9 +18,9 @@ _dll.openmc_material_add_nuclide.argtypes = [ c_int32, c_char_p, c_double] _dll.openmc_material_add_nuclide.restype = c_int _dll.openmc_material_add_nuclide.errcheck = _error_handler -_dll.openmc_material_id.argtypes = [c_int32, POINTER(c_int32)] -_dll.openmc_material_id.restype = c_int -_dll.openmc_material_id.errcheck = _error_handler +_dll.openmc_material_get_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_material_get_id.restype = c_int +_dll.openmc_material_get_id.errcheck = _error_handler _dll.openmc_material_get_densities.argtypes = [ c_int32, POINTER(POINTER(c_int)), POINTER(POINTER(c_double)), POINTER(c_int)] @@ -49,7 +49,7 @@ class MaterialView(object): @property def id(self): mat_id = c_int32() - _dll.openmc_material_id(self._index, mat_id) + _dll.openmc_material_get_id(self._index, mat_id) return mat_id.value @property diff --git a/openmc/capi/tally.py b/openmc/capi/tally.py index b7139bcb6..b1fc49d04 100644 --- a/openmc/capi/tally.py +++ b/openmc/capi/tally.py @@ -13,17 +13,20 @@ __all__ = ['TallyView', 'tallies'] _dll.openmc_get_tally.argtypes = [c_int32, POINTER(c_int32)] _dll.openmc_get_tally.restype = c_int _dll.openmc_get_tally.errcheck = _error_handler -_dll.openmc_tally_id.argtypes = [c_int32, POINTER(c_int32)] -_dll.openmc_tally_id.restype = c_int -_dll.openmc_tally_id.errcheck = _error_handler -_dll.openmc_tally_nuclides.argtypes = [ +_dll.openmc_tally_get_id.argtypes = [c_int32, POINTER(c_int32)] +_dll.openmc_tally_get_id.restype = c_int +_dll.openmc_tally_get_id.errcheck = _error_handler +_dll.openmc_tally_get_nuclides.argtypes = [ c_int32, POINTER(POINTER(c_int)), POINTER(c_int)] -_dll.openmc_tally_nuclides.restype = c_int -_dll.openmc_tally_nuclides.errcheck = _error_handler +_dll.openmc_tally_get_nuclides.restype = c_int +_dll.openmc_tally_get_nuclides.errcheck = _error_handler _dll.openmc_tally_results.argtypes = [ c_int32, POINTER(POINTER(c_double)), POINTER(c_int*3)] _dll.openmc_tally_results.restype = c_int _dll.openmc_tally_results.errcheck = _error_handler +_dll.openmc_tally_set_nuclides.argtypes = [c_int32, c_int, POINTER(c_char_p)] +_dll.openmc_tally_set_nuclides.restype = c_int +_dll.openmc_tally_set_nuclides.errcheck = _error_handler class TallyView(object): @@ -40,14 +43,14 @@ class TallyView(object): @property def id(self): tally_id = c_int32() - _dll.openmc_tally_id(self._index, tally_id) + _dll.openmc_tally_get_id(self._index, tally_id) return tally_id.value @property def nuclides(self): nucs = POINTER(c_int)() n = c_int() - _dll.openmc_tally_nuclides(self._index, nucs, n) + _dll.openmc_tally_get_nuclides(self._index, nucs, n) return [NuclideView(nucs[i]).name if nucs[i] > 0 else 'total' for i in range(n.value)] @@ -66,6 +69,12 @@ class TallyView(object): _dll.openmc_tally_results(self._index, data, shape) return as_array(data, tuple(shape[::-1])) + @nuclides.setter + def nuclides(self, nuclides): + nucs = (c_char_p * len(nuclides))() + nucs[:] = [x.encode() for x in nuclides] + _dll.openmc_tally_set_nuclides(self._index, len(nuclides), nucs) + class _TallyMapping(Mapping): def __getitem__(self, key): diff --git a/src/api.F90 b/src/api.F90 index cd8a8a064..a06866425 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -23,7 +23,7 @@ module openmc_api private public :: openmc_calculate_volumes - public :: openmc_cell_id + public :: openmc_cell_get_id public :: openmc_cell_set_temperature public :: openmc_finalize public :: openmc_find @@ -34,8 +34,8 @@ module openmc_api public :: openmc_get_tally public :: openmc_init public :: openmc_load_nuclide - public :: openmc_material_id public :: openmc_material_add_nuclide + public :: openmc_material_get_id public :: openmc_material_get_densities public :: openmc_material_set_density public :: openmc_material_set_densities @@ -43,9 +43,10 @@ module openmc_api public :: openmc_plot_geometry public :: openmc_reset public :: openmc_run - public :: openmc_tally_id - public :: openmc_tally_nuclides + public :: openmc_tally_get_id + public :: openmc_tally_get_nuclides public :: openmc_tally_results + public :: openmc_tally_set_nuclides ! Error codes integer(C_INT), public, bind(C) :: E_UNASSIGNED = -1 @@ -67,7 +68,7 @@ contains ! OPENMC_CELL_ID returns the ID of a cell !=============================================================================== - function openmc_cell_id(index, id) result(err) bind(C) + function openmc_cell_get_id(index, id) result(err) bind(C) integer(C_INT32_T), value :: index integer(C_INT32_T), intent(out) :: id integer(C_INT) :: err @@ -78,7 +79,7 @@ contains else err = E_OUT_OF_BOUNDS end if - end function openmc_cell_id + end function openmc_cell_get_id !=============================================================================== ! OPENMC_CELL_SET_TEMPERATURE sets the temperature of a cell @@ -492,10 +493,10 @@ contains end function openmc_material_get_densities !=============================================================================== -! OPENMC_MATERIAL_ID returns the ID of a material +! OPENMC_MATERIAL_GET_ID returns the ID of a material !=============================================================================== - function openmc_material_id(index, id) result(err) bind(C) + function openmc_material_get_id(index, id) result(err) bind(C) integer(C_INT32_T), value :: index integer(C_INT32_T), intent(out) :: id integer(C_INT) :: err @@ -506,7 +507,7 @@ contains else err = E_OUT_OF_BOUNDS end if - end function openmc_material_id + end function openmc_material_get_id !=============================================================================== ! OPENMC_MATERIAL_SET_DENSITY sets the total density of a material in atom/b-cm @@ -642,10 +643,10 @@ contains end subroutine openmc_reset !=============================================================================== -! OPENMC_TALLY_ID returns the ID of a tally +! OPENMC_TALLY_GET_ID returns the ID of a tally !=============================================================================== - function openmc_tally_id(index, id) result(err) bind(C) + function openmc_tally_get_id(index, id) result(err) bind(C) integer(C_INT32_T), value :: index integer(C_INT32_T), intent(out) :: id integer(C_INT) :: err @@ -656,13 +657,13 @@ contains else err = E_OUT_OF_BOUNDS end if - end function openmc_tally_id + end function openmc_tally_get_id !=============================================================================== ! OPENMC_TALLY_NUCLIDES returns the list of nuclides assigned to a tally !=============================================================================== - function openmc_tally_nuclides(index, ptr, n) result(err) bind(C) + function openmc_tally_get_nuclides(index, ptr, n) result(err) bind(C) integer(C_INT32_T), value :: index type(C_PTR), intent(out) :: ptr integer(C_INT), intent(out) :: n @@ -680,7 +681,7 @@ contains else err = E_OUT_OF_BOUNDS end if - end function openmc_tally_nuclides + end function openmc_tally_get_nuclides !=============================================================================== ! OPENMC_TALLY_RESULTS returns a pointer to a tally results array along with its @@ -706,6 +707,56 @@ contains end if end function openmc_tally_results + function openmc_tally_set_nuclides(index, n, nuclides) result(err) bind(C) + integer(C_INT32_T), value :: index + integer(C_INT), value :: n + type(C_PTR), intent(in) :: nuclides(n) + integer(C_INT) :: err + + integer :: i + character(C_CHAR), pointer :: string(:) + character(len=:, kind=C_CHAR), allocatable :: nuclide_ + + err = E_UNASSIGNED + if (index >= 1 .and. index <= size(tallies)) then + associate (t => tallies(index)) + if (allocated(t % nuclide_bins)) deallocate(t % nuclide_bins) + allocate(t % nuclide_bins(n)) + t % n_nuclide_bins = n + + do i = 1, n + ! Convert C string to Fortran string + call c_f_pointer(nuclides(i), string, [10]) + nuclide_ = to_lower(to_f_string(string)) + + select case (nuclide_) + case ('total') + t % nuclide_bins(i) = -1 + case default + if (nuclide_dict % has_key(nuclide_)) then + t % nuclide_bins(i) = nuclide_dict % get_key(nuclide_) + else + err = E_NUCLIDE_NOT_LOADED + return + end if + end select + end do + + ! Recalculate total number of scoring bins + t % total_score_bins = t % n_score_bins * t % n_nuclide_bins + + ! (Re)allocate results array + if (allocated(t % results)) deallocate(t % results) + allocate(t % results(3, t % total_score_bins, t % total_filter_bins)) + t % results(:,:,:) = ZERO + + err = 0 + end associate + else + err = E_OUT_OF_BOUNDS + end if + end function openmc_tally_set_nuclides + function to_f_string(c_string) result(f_string) character(kind=C_CHAR), intent(in) :: c_string(*) character(:), allocatable :: f_string From 894e95d9018678a453bd1164daeb764633ce29c9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 30 Jul 2017 08:13:45 -0500 Subject: [PATCH 106/123] Reset timers in openmc_reset --- src/api.F90 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/api.F90 b/src/api.F90 index a06866425..b31bf387a 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -640,6 +640,21 @@ contains call active_collision_tallies % clear() call active_tallies % clear() + ! Reset timers + call time_total % reset() + call time_total % reset() + call time_initialize % reset() + call time_read_xs % reset() + call time_unionize % reset() + call time_bank % reset() + call time_bank_sample % reset() + call time_bank_sendrecv % reset() + call time_tallies % reset() + call time_inactive % reset() + call time_active % reset() + call time_transport % reset() + call time_finalize % reset() + end subroutine openmc_reset !=============================================================================== From 1066489c66221bd6f100995d5275edd602f55d53 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 30 Jul 2017 08:28:05 -0500 Subject: [PATCH 107/123] Get rid of defaults for current_batch and current_gen --- src/api.F90 | 8 +++----- src/global.F90 | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/api.F90 b/src/api.F90 index b31bf387a..77b3dd576 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -131,8 +131,6 @@ contains check_overlaps = .false. confidence_intervals = .false. create_fission_neutrons = .true. - current_batch = 0 - current_gen = 0 energy_cutoff = ZERO energy_max_neutron = INFINITY energy_min_neutron = ZERO @@ -144,12 +142,12 @@ contains legendre_to_tabular = .true. legendre_to_tabular_points = 33 n_batch_interval = 1 - n_filters = 0 - n_meshes = 0 + n_filters = 0 + n_meshes = 0 n_particles = 0 n_source_points = 0 n_state_points = 0 - n_tallies = 0 + n_tallies = 0 n_user_filters = 0 n_user_meshes = 0 n_user_tallies = 0 diff --git a/src/global.F90 b/src/global.F90 index 5661cf2af..2f47a9dce 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -222,8 +222,8 @@ module global integer :: n_inactive ! # of inactive batches integer :: n_active ! # of active batches integer :: gen_per_batch = 1 ! # of generations per batch - integer :: current_batch = 0 ! current batch - integer :: current_gen = 0 ! current generation within a batch + integer :: current_batch ! current batch + integer :: current_gen ! current generation within a batch integer :: total_gen = 0 ! total number of generations simulated ! ============================================================================ From 9edad4876f7c2c2dd6f1961aa437ccf69b0004da Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 30 Jul 2017 14:07:06 -0500 Subject: [PATCH 108/123] Add hard reset function --- openmc/capi/__init__.py | 14 +++++++++----- src/api.F90 | 23 +++++++++++++++++++++-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index b3b5731c1..6ae49c4ff 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -1,17 +1,19 @@ """Provides bindings to C functions defined by OpenMC shared library. When the :mod:`openmc` package is imported, the OpenMC shared library is -automatically loaded. Calls to the OpenMC library can then be made, for example: +automatically loaded. Calls to the OpenMC library can then be via functions or +objects in the :mod:`openmc.capi` subpackage, for example: .. code-block:: python openmc.capi.init() openmc.capi.run() + openmc.capi.finalize() """ from contextlib import contextmanager -from ctypes import CDLL, c_int, c_int32, c_double, c_char_p, POINTER +from ctypes import CDLL, c_int, c_int32, c_double, POINTER import sys from warnings import warn @@ -38,8 +40,6 @@ except OSError: _available = False - - class GeometryError(Exception): pass @@ -135,6 +135,10 @@ def find(xyz, rtype='cell'): return (uid.value if uid != 0 else None), instance.value +def hard_reset(): + _dll.openmc_hard_reset() + + def init(intracomm=None): """Initialize OpenMC @@ -185,7 +189,6 @@ def run(): _dll.openmc_run() - @contextmanager def run_in_memory(intracomm=None): """Provides context manager for calling OpenMC shared library functions. @@ -220,6 +223,7 @@ if _available: POINTER(c_double*3), c_int, POINTER(c_int32), POINTER(c_int32)] _dll.openmc_find.restype = c_int _dll.openmc_find.errcheck = _error_handler + _dll.openmc_hard_reset.restype = None _dll.openmc_init.argtypes = [POINTER(c_int)] _dll.openmc_init.restype = None _dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] diff --git a/src/api.F90 b/src/api.F90 index 77b3dd576..2c1fc968b 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -15,7 +15,7 @@ module openmc_api use input_xml, only: assign_0K_elastic_scattering, check_data_version use particle_header, only: Particle use plot, only: openmc_plot_geometry - use random_lcg, only: seed + use random_lcg, only: seed, initialize_prng use simulation, only: openmc_run use volume_calc, only: openmc_calculate_volumes @@ -32,6 +32,7 @@ module openmc_api public :: openmc_get_material public :: openmc_get_nuclide public :: openmc_get_tally + public :: openmc_hard_reset public :: openmc_init public :: openmc_load_nuclide public :: openmc_material_add_nuclide @@ -334,6 +335,24 @@ contains end if end function openmc_get_tally +!=============================================================================== +! OPENMC_HARD_RESET reset tallies and timers as well as the pseudorandom +! generator state +!=============================================================================== + + subroutine openmc_hard_reset() bind(C) + ! Reset all tallies and timers + call openmc_reset() + + ! Reset total generations and keff guess + keff = ONE + total_gen = 0 + + ! Reset the random number generator state + seed = 1_8 + call initialize_prng() + end subroutine openmc_hard_reset + !=============================================================================== ! OPENMC_LOAD_NUCLIDE loads a nuclide from the cross section library !=============================================================================== @@ -602,7 +621,7 @@ contains end function openmc_nuclide_name !=============================================================================== -! OPENMC_RESET resets all tallies +! OPENMC_RESET resets tallies and timers !=============================================================================== subroutine openmc_reset() bind(C) From dae2a169e6daa1b6d58e513b15f6831983eaefe5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 31 Jul 2017 06:57:09 -0500 Subject: [PATCH 109/123] Get rid of mpi_err global variable --- src/api.F90 | 12 +++++------ src/cmfd_execute.F90 | 6 ++++++ src/eigenvalue.F90 | 5 +++++ src/initialize.F90 | 1 + src/main.F90 | 4 ++++ src/mesh.F90 | 3 +++ src/message_passing.F90 | 1 - src/simulation.F90 | 47 +++++++++++++++++++---------------------- src/state_point.F90 | 4 +++- src/tally.F90 | 7 +++--- src/volume_calc.F90 | 1 + 11 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/api.F90 b/src/api.F90 index 2c1fc968b..b767d1ab4 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -92,11 +92,11 @@ contains integer(C_INT32_T), optional, intent(in) :: instance integer(C_INT) :: err - integer :: i, n + integer :: n err = E_UNASSIGNED if (index >= 1 .and. index <= size(cells)) then - associate (c => cells(i)) + associate (c => cells(index)) if (allocated(c % sqrtkT)) then n = size(c % sqrtkT) if (present(instance) .and. n > 1) then @@ -122,7 +122,7 @@ contains subroutine openmc_finalize() bind(C) - integer :: hdf5_err + integer :: err ! Clear results call openmc_reset() @@ -190,14 +190,14 @@ contains call free_memory() ! Release compound datatypes - call h5tclose_f(hdf5_bank_t, hdf5_err) + call h5tclose_f(hdf5_bank_t, err) ! Close FORTRAN interface. - call h5close_f(hdf5_err) + call h5close_f(err) #ifdef MPI ! Free all MPI types - call MPI_TYPE_FREE(MPI_BANK, mpi_err) + call MPI_TYPE_FREE(MPI_BANK, err) #endif end subroutine openmc_finalize diff --git a/src/cmfd_execute.F90 b/src/cmfd_execute.F90 index 0d4a9f4d3..e87bff930 100644 --- a/src/cmfd_execute.F90 +++ b/src/cmfd_execute.F90 @@ -108,6 +108,9 @@ contains real(8) :: hxyz(3) ! cell dimensions of current ijk cell real(8) :: vol ! volume of cell real(8),allocatable :: source(:,:,:,:) ! tmp source array for entropy +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif ! Get maximum of spatial and group indices nx = cmfd % indices(1) @@ -232,6 +235,9 @@ contains logical :: outside ! any source sites outside mesh logical :: in_mesh ! source site is inside mesh type(RegularMesh), pointer :: m ! point to mesh +#ifdef MPI + integer :: mpi_err +#endif ! Associate pointer m => meshes(n_user_meshes + 1) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 9f4da7c82..accf80b31 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -40,6 +40,7 @@ contains & temp_sites(:) ! local array of extra sites on each node #ifdef MPI + integer :: mpi_err ! MPI error code integer(8) :: n ! number of sites to send/recv integer :: neighbor ! processor to send/recv data from #ifdef MPIF08 @@ -372,6 +373,9 @@ contains subroutine calculate_generation_keff() integer :: i ! overall generation +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif ! Get keff for this generation by subtracting off the starting value keff_generation = global_tallies(RESULT_VALUE, K_TRACKLENGTH) - keff_generation @@ -614,6 +618,7 @@ contains logical :: sites_outside ! were there sites outside the ufs mesh? #ifdef MPI integer :: n ! total number of ufs mesh cells + integer :: mpi_err ! MPI error code #endif if (current_batch == 1 .and. current_gen == 1) then diff --git a/src/initialize.F90 b/src/initialize.F90 index 69479907e..1e29c638c 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -172,6 +172,7 @@ contains integer, intent(in) :: intracomm ! MPI intracommunicator #endif + integer :: mpi_err ! MPI error code integer :: bank_blocks(5) ! Count for each datatype #ifdef MPIF08 type(MPI_Datatype) :: bank_types(5) diff --git a/src/main.F90 b/src/main.F90 index b8c96927e..fadf9f3bb 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -9,6 +9,10 @@ program main implicit none +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif + ! Initialize run -- when run with MPI, pass communicator #ifdef MPI #ifdef MPIF08 diff --git a/src/mesh.F90 b/src/mesh.F90 index 427710790..c25e3f7a6 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -144,6 +144,9 @@ contains integer :: ijk(3) ! indices on mesh integer :: n ! number of energy groups / size integer :: e_bin ! energy_bin +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif logical :: in_mesh ! was single site outside mesh? logical :: outside ! was any site outside mesh? diff --git a/src/message_passing.F90 b/src/message_passing.F90 index 6c13b00e8..0f2b94d1a 100644 --- a/src/message_passing.F90 +++ b/src/message_passing.F90 @@ -16,7 +16,6 @@ module message_passing integer :: rank = 0 ! rank of process logical :: master = .true. ! master process? logical :: mpi_enabled = .false. ! is MPI in use and initialized? - integer :: mpi_err ! MPI error code #ifdef MPIF08 type(MPI_Datatype) :: MPI_BANK ! MPI datatype for fission bank type(MPI_Comm) :: mpi_intracomm ! MPI intra-communicator diff --git a/src/simulation.F90 b/src/simulation.F90 index 8a32493ca..b406679ce 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -285,6 +285,10 @@ contains subroutine finalize_batch() +#ifdef MPI + integer :: mpi_err ! MPI error code +#endif + ! Reduce tallies onto master process and accumulate call time_tallies % start() call accumulate_tallies() @@ -392,7 +396,11 @@ contains integer :: i ! loop index for tallies integer :: n ! size of arrays - real(8) :: temp(3) ! temporary array for communication +#ifdef MPI + integer :: mpi_err ! MPI error code + integer(8) :: temp + real(8) :: tempr(3) ! temporary array for communication +#endif !$omp parallel deallocate(micro_xs) @@ -420,18 +428,23 @@ contains ! These guys are needed so that non-master processes can calculate the ! combined estimate of k-effective - temp(1) = k_col_abs - temp(2) = k_col_tra - temp(3) = k_abs_tra - call MPI_BCAST(temp, 3, MPI_REAL8, 0, mpi_intracomm, mpi_err) - k_col_abs = temp(1) - k_col_tra = temp(2) - k_abs_tra = temp(3) + tempr(1) = k_col_abs + tempr(2) = k_col_tra + tempr(3) = k_abs_tra + call MPI_BCAST(tempr, 3, MPI_REAL8, 0, mpi_intracomm, mpi_err) + k_col_abs = tempr(1) + k_col_tra = tempr(2) + k_abs_tra = tempr(3) + + if (check_overlaps) then + call MPI_REDUCE(overlap_check_cnt, temp, n_cells, MPI_INTEGER8, & + MPI_SUM, 0, mpi_intracomm, mpi_err) + overlap_check_cnt = temp + end if #endif ! Write tally results to tallies.out if (output_tallies .and. master) call write_tallies() - if (check_overlaps) call reduce_overlap_count() ! Stop timers and show timing statistics call time_finalize%stop() @@ -444,20 +457,4 @@ contains end subroutine finalize_simulation -!=============================================================================== -! REDUCE_OVERLAP_COUNT accumulates cell overlap check counts to master -!=============================================================================== - - subroutine reduce_overlap_count() - - integer(8) :: temp - -#ifdef MPI - call MPI_REDUCE(overlap_check_cnt, temp, n_cells, MPI_INTEGER8, & - MPI_SUM, 0, mpi_intracomm, mpi_err) - overlap_check_cnt = temp -#endif - - end subroutine reduce_overlap_count - end module simulation diff --git a/src/state_point.F90 b/src/state_point.F90 index 301a4efdd..e2a476e7e 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -522,7 +522,8 @@ contains real(8), allocatable :: tally_temp(:,:,:) ! contiguous array of results real(8), target :: global_temp(3,N_GLOBAL_TALLIES) #ifdef MPI - real(8) :: dummy ! temporary receive buffer for non-root reduces + integer :: mpi_err ! MPI error code + real(8) :: dummy ! temporary receive buffer for non-root reduces #endif type(TallyObject) :: dummy_tally @@ -841,6 +842,7 @@ contains #else integer :: i #ifdef MPI + integer :: mpi_err ! MPI error code type(Bank), allocatable, target :: temp_source(:) #endif #endif diff --git a/src/tally.F90 b/src/tally.F90 index 8b52ad032..cf62412f0 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -4246,9 +4246,10 @@ contains subroutine reduce_tally_results() integer :: i - integer :: n ! number of filter bins - integer :: m ! number of score bins - integer :: n_bins ! total number of bins + integer :: n ! number of filter bins + integer :: m ! number of score bins + integer :: n_bins ! total number of bins + integer :: mpi_err ! MPI error code real(C_DOUBLE), allocatable :: tally_temp(:,:) ! contiguous array of results real(C_DOUBLE), allocatable :: tally_temp2(:,:) ! reduced contiguous results real(C_DOUBLE) :: temp(N_GLOBAL_TALLIES), temp2(N_GLOBAL_TALLIES) diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index 3659293b3..f8cf4085a 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -132,6 +132,7 @@ contains integer :: min_samples ! minimum number of samples per process integer :: remainder ! leftover samples from uneven divide #ifdef MPI + integer :: mpi_err ! MPI error code integer :: m ! index over materials integer :: n ! number of materials integer, allocatable :: data(:) ! array used to send number of hits From d0faebe11d00239bc012c16dc09f8b2a03aa55fc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 31 Jul 2017 08:18:55 -0500 Subject: [PATCH 110/123] Update documentation --- docs/source/capi/index.rst | 190 +++++++++++++++++++++++++++++---- docs/source/pythonapi/capi.rst | 25 ++++- openmc/capi/__init__.py | 7 +- openmc/capi/cell.py | 17 +++ openmc/capi/material.py | 23 +++- openmc/capi/nuclide.py | 33 +++--- openmc/capi/tally.py | 29 +++-- openmc/nuclide.py | 4 +- src/api.F90 | 13 ++- 9 files changed, 284 insertions(+), 57 deletions(-) diff --git a/docs/source/capi/index.rst b/docs/source/capi/index.rst index 9bb1b2c66..1e30eacf1 100644 --- a/docs/source/capi/index.rst +++ b/docs/source/capi/index.rst @@ -8,17 +8,28 @@ C API Run a stochastic volume calculation -.. c:function:: int openmc_cell_set_temperature(int id, double T, int* instance) +.. c:function:: int openmc_cell_get_id(int32_t index, int32_t* id) + + Get the ID of a cell + + :param index: Index in the cells array + :type index: int32_t + :param id: ID of the cell + :type id: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_cell_set_temperature(index index, double T, int32_t* instance) Set the temperature of a cell. - :param id: ID of the cell - :type id: int + :param index: Index in the cells array + :type index: int32_t :param T: Temperature in Kelvin :type T: double :param instance: Which instance of the cell. To set the temperature for all instances, pass a null pointer. - :type instance: int* + :type instance: int32_t* :return: Return status (negative if an error occurred) :rtype: int @@ -26,7 +37,7 @@ C API Finalize a simulation -.. c:function:: void openmc_find(double* xyz, int rtype, int* id, int* instance) +.. c:function:: void openmc_find(double* xyz, int rtype, int32_t* id, int32_t* instance) Determine the ID of the cell/material containing a given point @@ -36,10 +47,65 @@ C API :type rtype: int :param id: ID of the cell/material found. If a material is requested and the point is in a void, the ID is 0. If an error occurs, the ID is -1. - :type id: int + :type id: int32_t* :param instance: If a cell is repetaed in the geometry, the instance of the cell that was found and zero otherwise. - :type instance: int + :type instance: int32_t* + +.. c:function:: int openmc_get_cell(int32_t id, int32_t* index) + + Get the index in the cells array for a cell with a given ID + + :param id: ID of the cell + :type id: int32_t + :param index: Index in the cells array + :type index: int32_t* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_keff(double k_combined[]) + + :param k_combined: Combined estimate of k-effective + :type k_combined: double[2] + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_nuclide(char name[], int* index) + + Get the index in the nuclides array for a nuclide with a given name + + :param name: Name of the nuclide + :type name: char[] + :param index: Index in the nuclides array + :type index: int* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_tally(int32_t id, int32_t* index) + + Get the index in the tallies array for a tally with a given ID + + :param id: ID of the tally + :type id: int32_t + :param index: Index in the tallies array + :type index: int32_t* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_get_material(int32_t id, int32_t* index) + + Get the index in the materials array for a material with a given ID + + :param id: ID of the material + :type id: int32_t + :param index: Index in the materials array + :type index: int32_t* + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: void openmc_hard_reset() + + Reset tallies, timers, and pseudo-random number generator state .. c:function:: void openmc_init(int intracomm) @@ -57,13 +123,13 @@ C API :return: Return status (negative if an error occurs) :rtype: int -.. c:function:: int openmc_material_add_nuclide(int id, char name[], double density) +.. c:function:: int openmc_material_add_nuclide(int32_t index, char name[], double density) Add a nuclide to an existing material. If the nuclide already exists, the density is overwritten. - :param id: ID of the material - :type id: int + :param index: Index in the materials array + :type index: int32_t :param name: Name of the nuclide :type name: char[] :param density: Density in atom/b-cm @@ -71,28 +137,67 @@ C API :return: Return status (negative if an error occurs) :rtype: int -.. c:function:: int openmc_material_get_densities(int id, double* ptr) +.. c:function:: int openmc_material_get_densities(int32_t index, int* nuclides[], double* densities[]) - Get an array of nuclide densities for a material. + Get density for each nuclide in a material. - :param id: ID of the material - :type id: int - :param ptr: Pointer to the array of densities - :type ptr: double* - :return: Length of the array + :param index: Index in the materials array + :type index: int32_t + :param nuclides: Pointer to array of nuclide indices + :type nuclides: int** + :param densities: Pointer to the array of densities + :type densities: double** + :param n: Length of the array + :type n: int + :return: Return status (negative if an error occurs) :rtype: int -.. c:function:: int openmc_material_set_density(int id, double density) +.. c:function:: int openmc_material_get_id(int32_t index, int32_t* id) + + Get the ID of a material + + :param index: Index in the materials array + :type index: int32_t + :param id: ID of the material + :type id: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_material_set_density(int32_t index, double density) Set the density of a material. - :param id: ID of the material - :type id: int + :param index: Index in the materials array + :type index: int32_t :param density: Density of the material in atom/b-cm :type density: double :return: Return status (negative if an error occurs) :rtype: int +.. c:function:: int openmc_material_set_densities(int32_t, n, char* name[], double density[]) + + :param index: Index in the materials array + :type index: int32_t + :param n: Length of name/density + :type n: int + :param name: Array of nuclide names + :type name: char** + :param density: Array of densities + :type density: double[] + :return: Return status (negative if an error occurs) + :rtype: int + +.. c:function:: int openmc_nuclide_name(int index, char* name[]) + + Get name of a nuclide + + :param index: Index in the nuclides array + :type index: int + :param name: Name of the nuclide + :type name: char** + :return: Return status (negative if an error occurs) + :rtype: int + .. c:function:: void openmc_plot_geometry() Run plotting mode. @@ -105,13 +210,52 @@ C API Run a simulation -.. c:function:: void openmc_tally_results(int id, double** ptr, int shape_[3]) +.. c:function:: int openmc_tally_get_id(int32_t index, int32_t* id) + + Get the ID of a tally + + :param index: Index in the tallies array + :type index: int32_t + :param id: ID of the tally + :type id: int32_t* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_tally_get_nuclides(int32_t index, int* nuclides[], int* n) + + Get nuclides specified in a tally + + :param index: Index in the tallies array + :type index: int32_t + :param nuclides: Array of nuclide indices + :type nuclides: int** + :param n: Number of nuclides + :type n: int* + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_tally_results(int32_t index, double** ptr, int shape_[3]) Get a pointer to tally results array. - :param id: ID of the tally - :type id: int + :param index: Index in the tallies array + :type index: int32_t :param ptr: Pointer to the results array :type ptr: double** :param shape_: Shape of the results array :type shape_: int[3] + :return: Return status (negative if an error occurred) + :rtype: int + +.. c:function:: int openmc_tally_set_nuclides(int32_t index, int n, char* nuclides[]) + + Set the nuclides for a tally + + :param index: Index in the tallies array + :type index: int32_t + :param n: Number of nuclides + :type n: int + :param nuclides: Array of nuclide names + :type nuclides: char** + :return: Return status (negative if an error occurred) + :rtype: int diff --git a/docs/source/pythonapi/capi.rst b/docs/source/pythonapi/capi.rst index af00363cc..a586cb4ad 100644 --- a/docs/source/pythonapi/capi.rst +++ b/docs/source/pythonapi/capi.rst @@ -2,16 +2,37 @@ :data:`openmc.capi` -- Python bindings to the C API --------------------------------------------------- +.. automodule:: openmc.capi + +Functions +--------- + .. autosummary:: :toctree: generated :nosignatures: :template: myfunction.rst - openmc.capi.lib_context + openmc.capi.calculate_volumes + openmc.capi.finalize + openmc.capi.find + openmc.capi.hard_reset + openmc.capi.init + openmc.capi.keff + openmc.capi.load_nuclide + openmc.capi.plot_geometry + openmc.capi.reset + openmc.capi.run + openmc.capi.run_in_memory + +Classes +------- .. autosummary:: :toctree: generated :nosignatures: :template: myclass.rst - openmc.capi.OpenMCLibrary + openmc.capi.CellView + openmc.capi.MaterialView + openmc.capi.NuclideView + openmc.capi.TallyView diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index 6ae49c4ff..a4f16ab71 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -1,5 +1,5 @@ -"""Provides bindings to C functions defined by OpenMC shared library. - +""" +This module provides bindings to C functions defined by OpenMC shared library. When the :mod:`openmc` package is imported, the OpenMC shared library is automatically loaded. Calls to the OpenMC library can then be via functions or objects in the :mod:`openmc.capi` subpackage, for example: @@ -136,6 +136,7 @@ def find(xyz, rtype='cell'): def hard_reset(): + """Reset tallies, timers, and pseudo-random number generator state.""" _dll.openmc_hard_reset() @@ -180,7 +181,7 @@ def plot_geometry(): def reset(): - """Reset tallies""" + """Reset tallies and timers.""" _dll.openmc_reset() diff --git a/openmc/capi/cell.py b/openmc/capi/cell.py index 1dbe50d51..9abada00c 100644 --- a/openmc/capi/cell.py +++ b/openmc/capi/cell.py @@ -22,6 +22,23 @@ _dll.openmc_get_cell.errcheck = _error_handler class CellView(object): + """View of a cell. + + This class exposes a cell that is stored internally in the OpenMC solver. To + obtain a view of a cell with a given ID, use the + :data:`openmc.capi.nuclides` mapping. + + Parameters + ---------- + index : int + Index in the `cells` array. + + Attributes + ---------- + id : int + ID of the cell + + """ __instances = WeakValueDictionary() def __new__(cls, *args): if args not in cls.__instances: diff --git a/openmc/capi/material.py b/openmc/capi/material.py index c917d3331..564ecaa05 100644 --- a/openmc/capi/material.py +++ b/openmc/capi/material.py @@ -7,8 +7,8 @@ from numpy.ctypeslib import as_array from openmc.capi import _dll, _error_handler, NuclideView -__all__ = ['MaterialView', 'materials'] +__all__ = ['MaterialView', 'materials'] # Material functions _dll.openmc_get_material.argtypes = [c_int32, POINTER(c_int32)] @@ -36,6 +36,27 @@ _dll.openmc_material_set_densities.errcheck = _error_handler class MaterialView(object): + """View of a material. + + This class exposes a material that is stored internally in the OpenMC + solver. To obtain a view of a material with a given ID, use the + :data:`openmc.capi.materials` mapping. + + Parameters + ---------- + index : int + Index in the `materials` array. + + Attributes + ---------- + id : int + ID of the material + nuclides : list of str + List of nuclides in the material + densities : numpy.ndarray + Array of densities in atom/b-cm + + """ __instances = WeakValueDictionary() def __new__(cls, *args): if args not in cls.__instances: diff --git a/openmc/capi/nuclide.py b/openmc/capi/nuclide.py index 7a2f7a37b..384d0ae91 100644 --- a/openmc/capi/nuclide.py +++ b/openmc/capi/nuclide.py @@ -28,13 +28,30 @@ def load_nuclide(name): Parameters ---------- name : str - Name of nuclide, e.g. 'U235' + Name of the nuclide, e.g. 'U235' """ _dll.openmc_load_nuclide(name.encode()) class NuclideView(object): + """View of a nuclide. + + This class exposes a nuclide that is stored internally in the OpenMC + solver. To obtain a view of a nuclide with a given name, use the + :data:`openmc.capi.nuclides` mapping. + + Parameters + ---------- + index : int + Index in the `nuclides` array. + + Attributes + ---------- + name : str + Name of the nuclide, e.g. 'U235' + + """ __instances = WeakValueDictionary() def __new__(cls, *args): if args not in cls.__instances: @@ -47,19 +64,6 @@ class NuclideView(object): @property def name(self): - """Name of nuclide with given index - - Parameter - --------- - index : int - Index in internal nuclides array - - Returns - ------- - str - Name of nuclide - - """ name = c_char_p() _dll.openmc_nuclide_name(self._index, name) @@ -71,6 +75,7 @@ class NuclideView(object): class _NuclideMapping(Mapping): + """Provide mapping from nuclide name to index in nuclides array.""" def __getitem__(self, key): index = c_int() _dll.openmc_get_nuclide(key.encode(), index) diff --git a/openmc/capi/tally.py b/openmc/capi/tally.py index b1fc49d04..cc8c13a5a 100644 --- a/openmc/capi/tally.py +++ b/openmc/capi/tally.py @@ -30,6 +30,27 @@ _dll.openmc_tally_set_nuclides.errcheck = _error_handler class TallyView(object): + """View of a tally. + + This class exposes a tally that is stored internally in the OpenMC + solver. To obtain a view of a tally with a given ID, use the + :data:`openmc.capi.tallies` mapping. + + Parameters + ---------- + index : int + Index in the `tallys` array. + + Attributes + ---------- + id : int + ID of the tally + nuclides : list of str + List of nuclides to score results for + results : numpy.ndarray + Array of tally results + + """ __instances = WeakValueDictionary() def __new__(cls, *args): if args not in cls.__instances: @@ -56,14 +77,6 @@ class TallyView(object): @property def results(self): - """Get tally results array - - Returns - ------- - numpy.ndarray - Array that exposes the internal tally results array - - """ data = POINTER(c_double)() shape = (c_int*3)() _dll.openmc_tally_results(self._index, data, shape) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 03062ee0e..fc0d7ef07 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -11,12 +11,12 @@ class Nuclide(object): Parameters ---------- name : str - Name of the nuclide, e.g. U235 + Name of the nuclide, e.g. 'U235' Attributes ---------- name : str - Name of the nuclide, e.g. U235 + Name of the nuclide, e.g. 'U235' scattering : 'data' or 'iso-in-lab' or None The type of angular scattering distribution to use diff --git a/src/api.F90 b/src/api.F90 index b767d1ab4..40ac0f01f 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -66,7 +66,7 @@ module openmc_api contains !=============================================================================== -! OPENMC_CELL_ID returns the ID of a cell +! OPENMC_CELL_GET_ID returns the ID of a cell !=============================================================================== function openmc_cell_get_id(index, id) result(err) bind(C) @@ -695,9 +695,9 @@ contains ! OPENMC_TALLY_NUCLIDES returns the list of nuclides assigned to a tally !=============================================================================== - function openmc_tally_get_nuclides(index, ptr, n) result(err) bind(C) + function openmc_tally_get_nuclides(index, nuclides, n) result(err) bind(C) integer(C_INT32_T), value :: index - type(C_PTR), intent(out) :: ptr + type(C_PTR), intent(out) :: nuclides integer(C_INT), intent(out) :: n integer(C_INT) :: err @@ -705,7 +705,7 @@ contains if (index >= 1 .and. index <= size(tallies)) then associate (t => tallies(index)) if (allocated(t % nuclide_bins)) then - ptr = C_LOC(t % nuclide_bins(1)) + nuclides = C_LOC(t % nuclide_bins(1)) n = size(t % nuclide_bins) err = 0 end if @@ -739,6 +739,11 @@ contains end if end function openmc_tally_results +!=============================================================================== +! OPENMC_TALLY_SET_NUCLIDES sets the nuclides in the tally which results should +! be scored for +!=============================================================================== + function openmc_tally_set_nuclides(index, n, nuclides) result(err) bind(C) integer(C_INT32_T), value :: index integer(C_INT), value :: n From 7337d59e775ed5fcf1313ed3421e67eedb60799c Mon Sep 17 00:00:00 2001 From: tjlaboss Date: Mon, 31 Jul 2017 08:39:47 -0600 Subject: [PATCH 111/123] Addressed suggestions by @paulromano --- openmc/data/neutron.py | 2 +- scripts/openmc-update-inputs | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 07b1f7686..64634f2af 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -34,7 +34,7 @@ from openmc.mixin import EqualityMixin _RESONANCE_ENERGY_GRID = np.logspace(-3, 3, 61) -def get_metadata(zaid, metastable_scheme='nndc'): +def _get_metadata(zaid, metastable_scheme='nndc'): """Return basic identifying data for a nuclide with a given ZAID. Parameters diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index ea6506942..3eb850207 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -11,7 +11,6 @@ from itertools import chain from random import randint from shutil import move import xml.etree.ElementTree as ET -import re import openmc.data @@ -239,12 +238,6 @@ def update_geometry(geometry_root): return was_updated -def replace_zaid(name): - """Replace a nuclide name in the ZAID notation with the correct name.""" - zaid = int(name.strip()) - name = openmc.data.neutron.get_metadata(zaid)[0] - return name - def update_materials(root): """Update the given XML materials tree. Return True if changes were made.""" was_updated = False @@ -254,9 +247,11 @@ def update_materials(root): if 'name' in nuclide.attrib: nucname = nuclide.attrib['name'] nucname = nucname.replace('-', '') - s = re.search("\s*(? Date: Mon, 31 Jul 2017 08:58:26 -0600 Subject: [PATCH 112/123] Reverted get_metadata() to _get_metadata() (I need coffee) --- openmc/data/neutron.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 64634f2af..1d3a0176d 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -677,7 +677,7 @@ class IncidentNeutron(EqualityMixin): # If mass number hasn't been specified, make an educated guess zaid, xs = ace.name.split('.') name, element, Z, mass_number, metastable = \ - get_metadata(int(zaid), metastable_scheme) + _get_metadata(int(zaid), metastable_scheme) # Assign temperature to the running list kTs = [ace.temperature*EV_PER_MEV] From 8bb990b65a70d249ec0766ef8db9849822c6fbd5 Mon Sep 17 00:00:00 2001 From: liangjg Date: Mon, 31 Jul 2017 17:52:55 -0400 Subject: [PATCH 113/123] remove the argument "error" out of "from_njoy" function --- openmc/data/neutron.py | 6 ++---- openmc/data/njoy.py | 16 ++++++++-------- openmc/data/thermal.py | 7 ++----- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 8accabfc7..ed2f4f8b7 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -824,7 +824,7 @@ class IncidentNeutron(EqualityMixin): return data @classmethod - def from_njoy(cls, filename, temperatures=None, error=0.001, **kwargs): + def from_njoy(cls, filename, temperatures=None, **kwargs): """Generate incident neutron data by running NJOY. Parameters @@ -834,8 +834,6 @@ class IncidentNeutron(EqualityMixin): temperatures : iterable of float Temperatures in Kelvin to produce data at. If omitted, data is produced at room temperature (293.6 K) - error : float, optional - Fractional error tolerance for NJOY processing. **kwargs Keyword arguments passed to :func:`openmc.data.njoy.make_ace` @@ -853,7 +851,7 @@ class IncidentNeutron(EqualityMixin): ace_file = os.path.join(tmpdir, 'ace') xsdir_file = os.path.join(tmpdir, 'xsdir') pendf_file = os.path.join(tmpdir, 'pendf') - make_ace(filename, temperatures, error, ace_file, xsdir_file, + make_ace(filename, temperatures, ace_file, xsdir_file, pendf_file, **kwargs) # Create instance from ACE tables within library diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index 5365d9740..cf5c4b6c7 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -228,8 +228,8 @@ def make_pendf(filename, pendf='pendf', error=0.001, stdout=False): return run(commands, tapein, tapeout, stdout) -def make_ace(filename, temperatures=None, error=0.001, ace='ace', xsdir='xsdir', - pendf=None, **kwargs): +def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', + pendf=None, error=0.001, **kwargs): """Generate incident neutron ACE file from an ENDF file Parameters @@ -239,14 +239,14 @@ def make_ace(filename, temperatures=None, error=0.001, ace='ace', xsdir='xsdir', temperatures : iterable of float, optional Temperatures in Kelvin to produce ACE files at. If omitted, data is produced at room temperature (293.6 K). - error : float, optional - Fractional error tolerance for NJOY processing. ace : str, optional Path of ACE file to write xsdir : str, optional Path of xsdir file to write pendf : str, optional Path of pendf file to write. If omitted, the pendf file is not saved. + error : float, optional + Fractional error tolerance for NJOY processing. **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` @@ -315,8 +315,8 @@ def make_ace(filename, temperatures=None, error=0.001, ace='ace', xsdir='xsdir', return retcode -def make_ace_thermal(filename, filename_thermal, temperatures=None, error=0.001, - ace='ace', xsdir='xsdir', **kwargs): +def make_ace_thermal(filename, filename_thermal, temperatures=None, + ace='ace', xsdir='xsdir', error=0.001, **kwargs): """Generate thermal scattering ACE file from ENDF files Parameters @@ -328,12 +328,12 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, error=0.001, temperatures : iterable of float, optional Temperatures in Kelvin to produce data at. If omitted, data is produced at all temperatures given in the ENDF thermal scattering sublibrary. - error : float, optional - Fractional error tolerance for NJOY processing. ace : str, optional Path of ACE file to write xsdir : str, optional Path of xsdir file to write + error : float, optional + Fractional error tolerance for NJOY processing. **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 1d63c1ade..6e7b0fe02 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -588,8 +588,7 @@ class ThermalScattering(EqualityMixin): return table @classmethod - def from_njoy(cls, filename, filename_thermal, temperatures=None, - error=0.001, **kwargs): + def from_njoy(cls, filename, filename_thermal, temperatures=None, **kwargs): """Generate incident neutron data by running NJOY. Parameters @@ -602,8 +601,6 @@ class ThermalScattering(EqualityMixin): Temperatures in Kelvin to produce data at. If omitted, data is produced at all temperatures in the ENDF thermal scattering sublibrary. - error : float, optional - Fractional error tolerance for NJOY processing. **kwargs Keyword arguments passed to :func:`openmc.data.njoy.make_ace_thermal` @@ -620,7 +617,7 @@ class ThermalScattering(EqualityMixin): # Run NJOY to create an ACE library ace_file = os.path.join(tmpdir, 'ace') xsdir_file = os.path.join(tmpdir, 'xsdir') - make_ace_thermal(filename, filename_thermal, temperatures, error, + make_ace_thermal(filename, filename_thermal, temperatures, ace_file, xsdir_file, **kwargs) # Create instance from ACE tables within library From ac4b8d752a71e9a0f24c15b2a3a10107cfa05cb0 Mon Sep 17 00:00:00 2001 From: liangjg Date: Mon, 31 Jul 2017 17:55:04 -0400 Subject: [PATCH 114/123] allow to omit specific modules in generating data from njoy added several arguments for the modules --- openmc/data/njoy.py | 185 +++++++++++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 71 deletions(-) diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index cf5c4b6c7..85597562a 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -50,40 +50,36 @@ _THERMAL_DATA = { 75: ThermalTuple('ouo2', [8016, 8017, 8018], 1), } - -_PENDF_TEMPLATE = """ +_ACE_TEMPLATE_RECONR = """ reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% -20 22 -'{library} PENDF for {zsymam}'/ -{mat} 2/ -0.001 0.0 0.003/ err tempr errmax -'{library}: {zsymam}'/ -'Processed by NJOY'/ -0/ -stop -""" - -_ACE_TEMPLATE = """ -reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% -20 21 +{nendf} {npendf} '{library} PENDF for {zsymam}'/ {mat} 2/ {error}/ err '{library}: {zsymam}'/ 'Processed by NJOY'/ 0/ +""" + +_ACE_TEMPLATE_BROADR = """ broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% -20 21 22 +{nendf} {npendf} {nbroadr} {mat} {num_temp} 0 0 0. / {error}/ errthn {temps} 0/ +""" + +_ACE_TEMPLATE_HEATR = """ heatr / %%%%%%%%%%%%%%%%%%%%%%%%% Add heating kerma %%%%%%%%%%%%%%%%%%%%%%%%%%%% -20 22 23 / +{nendf} {nheatr_in} {nheatr} / {mat} 3 / 302 318 402 / +""" + +_ACE_TEMPLATE_PURR = """ purr / %%%%%%%%%%%%%%%%%%%%%%%% Add probability tables %%%%%%%%%%%%%%%%%%%%%%%%% -20 23 24 +{nendf} {npurr_in} {npurr} / {mat} {num_temp} 1 20 64 / {temps} 1.e10 @@ -91,7 +87,7 @@ purr / %%%%%%%%%%%%%%%%%%%%%%%% Add probability tables %%%%%%%%%%%%%%%%%%%%%%%%% """ _ACE_TEMPLATE_ACER = """acer / -20 24 0 {nace} {ndir} +{nendf} {nacer_in} 0 {nace} {ndir} 1 0 1 .{ext} / '{library}: {zsymam} at {temperature}'/ {mat} {temperature} @@ -99,35 +95,21 @@ _ACE_TEMPLATE_ACER = """acer / / """ -_ACE_THERMAL_TEMPLATE = """ -reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% -20 22 -'{library} PENDF for {zsymam}'/ -{mat} 2/ -{error}/ err -'{library}: PENDF for {zsymam}'/ -'Processed by NJOY'/ -0/ -broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% -20 22 23 -{mat} {num_temp} 0 0 0./ -{error}/ errthn -{temps} -0/ +_ACE_TEMPLATE_THERMR = """ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (free gas) %%%%%%%%%%%%%%% -0 23 62 +0 {nthermr1_in} {nthermr1} 0 {mat} 12 {num_temp} 1 0 {iform} 1 221 1/ {temps} {error} {energy_max} thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (bound) %%%%%%%%%%%%%%%%%% -60 62 27 +{nthermal_endf} {nthermr2_in} {nthermr2} {mat_thermal} {mat} 16 {num_temp} {inelastic} {elastic} {iform} {natom} 222 1/ {temps} {error} {energy_max} """ _ACE_THERMAL_TEMPLATE_ACER = """acer / -20 27 0 {nace} {ndir} +{nendf} {nthermal_acer_in} 0 {nace} {ndir} 2 0 1 .{ext}/ '{library}: {zsymam_thermal} processed by NJOY'/ {mat} {temperature} '{data.name}' / @@ -205,7 +187,7 @@ def make_pendf(filename, pendf='pendf', error=0.001, stdout=False): pendf : str, optional Path of pointwise ENDF file to write error : float, optional - Fractional error tolerance for NJOY processing. + Fractional error tolerance for NJOY processing stdout : bool Whether to display NJOY standard output @@ -215,21 +197,14 @@ def make_pendf(filename, pendf='pendf', error=0.001, stdout=False): Return code of NJOY process """ - ev = endf.Evaluation(filename) - mat = ev.material - zsymam = ev.target['zsymam'] - # Determine name of library - library = '{}-{}.{}'.format(*ev.info['library']) - - commands = _PENDF_TEMPLATE.format(**locals()) - tapein = {20: filename} - tapeout = {22: pendf} - return run(commands, tapein, tapeout, stdout) + return make_ace(filename, pendf=pendf, error=error, broadr=False, + heatr=False, purr=False, acer=False, stdout=stdout) -def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', - pendf=None, error=0.001, **kwargs): +def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, + error=0.001, broadr=True, heatr=True, purr=True, acer=True, + **kwargs): """Generate incident neutron ACE file from an ENDF file Parameters @@ -246,7 +221,15 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf : str, optional Path of pendf file to write. If omitted, the pendf file is not saved. error : float, optional - Fractional error tolerance for NJOY processing. + Fractional error tolerance for NJOY processing + broadr : bool, optional + Indicating whether to Doppler broaden XS in running NJOY + heatr : bool, optional + Indicating whether to add heating kerma in running NJOY + purr : bool, optional + Indicating whether to add probability table in running NJOY + acer : bool, optional + Indicating whether to generate ACE file in running NJOY **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` @@ -268,26 +251,60 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', num_temp = len(temperatures) temps = ' '.join(str(i) for i in temperatures) - commands = _ACE_TEMPLATE.format(**locals()) - tapein = {20: filename} + # Create njoy commands by modules + commands = "" + + nendf, npendf = 20, 21 + tapein = {nendf: filename} tapeout = {} if pendf is not None: - tapeout[21] = pendf - fname = '{}_{:.1f}' - for i, temperature in enumerate(temperatures): - # Extend input with an ACER run for each temperature - nace = 25 + 2*i - ndir = 25 + 2*i + 1 - ext = '{:02}'.format(i + 1) - commands += _ACE_TEMPLATE_ACER.format(**locals()) + tapeout[npendf] = pendf + + # reconr + commands += _ACE_TEMPLATE_RECONR + nlast = npendf + + # broadr + if broadr: + nbroadr = nlast + 1 + commands += _ACE_TEMPLATE_BROADR + nlast = nbroadr + + # heatr + if heatr: + nheatr_in = nlast + 1 + nheatr = nheatr_in + 1 + commands += _ACE_TEMPLATE_HEATR + nlast = nheatr + + # purr + if purr: + npurr_in = nlast + 1 + npurr = npurr_in + 1 + commands += _ACE_TEMPLATE_PURR + nlast = npurr + + commands = commands.format(**locals()) + + # acer + if acer: + nacer_in = nlast + fname = '{}_{:.1f}' + for i, temperature in enumerate(temperatures): + # Extend input with an ACER run for each temperature + nace = nacer_in + 1 + 2*i + ndir = nace + 1 + ext = '{:02}'.format(i + 1) + commands += _ACE_TEMPLATE_ACER.format(**locals()) + + # Indicate tapes to save for each ACER run + tapeout[nace] = fname.format(ace, temperature) + tapeout[ndir] = fname.format(xsdir, temperature) - # Indicate tapes to save for each ACER run - tapeout[nace] = fname.format(ace, temperature) - tapeout[ndir] = fname.format(xsdir, temperature) commands += 'stop\n' retcode = run(commands, tapein, tapeout, **kwargs) - if retcode == 0: + if acer and retcode == 0: with open(ace, 'w') as ace_file, open(xsdir, 'w') as xsdir_file: for temperature in temperatures: # Get contents of ACE file @@ -315,7 +332,7 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', return retcode -def make_ace_thermal(filename, filename_thermal, temperatures=None, +def make_ace_thermal(filename, filename_thermal, temperatures=None, ace='ace', xsdir='xsdir', error=0.001, **kwargs): """Generate thermal scattering ACE file from ENDF files @@ -333,7 +350,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, xsdir : str, optional Path of xsdir file to write error : float, optional - Fractional error tolerance for NJOY processing. + Fractional error tolerance for NJOY processing **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` @@ -396,20 +413,46 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, num_temp = len(temperatures) temps = ' '.join(str(i) for i in temperatures) - commands = _ACE_THERMAL_TEMPLATE.format(**locals()) - tapein = {20: filename, 60: filename_thermal} + # Create njoy commands by modules + commands = "" + + nendf, nthermal_endf, npendf = 20, 21, 22 + tapein = {nendf: filename, nthermal_endf:filename_thermal} tapeout = {} + + # reconr + commands += _ACE_TEMPLATE_RECONR + nlast = npendf + + # broadr + nbroadr = nlast + 1 + commands += _ACE_TEMPLATE_BROADR + nlast = nbroadr + + # thermr + nthermr1_in = nlast + nthermr1 = nthermr_in + 1 + nthermr2_in = nthermr1 + nthermr2 = nthermr2_in + 1 + commands += _ACE_TEMPLATE_THERMR + nlast = nthermr2 + + commands = commands.format(**locals()) + + # acer + nthermal_acer_in = nlast fname = '{}_{:.1f}' for i, temperature in enumerate(temperatures): # Extend input with an ACER run for each temperature - nace = 28 + 2*i - ndir = 28 + 2*i + 1 + nace = nthermal_acer_in + 1 + 2*i + ndir = nace + 1 ext = '{:02}'.format(i + 1) commands += _ACE_THERMAL_TEMPLATE_ACER.format(**locals()) # Indicate tapes to save for each ACER run tapeout[nace] = fname.format(ace, temperature) tapeout[ndir] = fname.format(xsdir, temperature) + commands += 'stop\n' retcode = run(commands, tapein, tapeout, **kwargs) From 3f1416a17c0fe593898138606e3ebfb2b0348856 Mon Sep 17 00:00:00 2001 From: liangjg Date: Tue, 1 Aug 2017 09:46:49 -0400 Subject: [PATCH 115/123] add argument to support printing NJOY input commands --- openmc/data/njoy.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index 85597562a..d229ea91c 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -95,7 +95,7 @@ _ACE_TEMPLATE_ACER = """acer / / """ -_ACE_TEMPLATE_THERMR = """ +_ACE_THERMAL_TEMPLATE_THERMR = """ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (free gas) %%%%%%%%%%%%%%% 0 {nthermr1_in} {nthermr1} 0 {mat} 12 {num_temp} 1 0 {iform} 1 221 1/ @@ -118,7 +118,8 @@ _ACE_THERMAL_TEMPLATE_ACER = """acer / """ -def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): +def run(commands, tapein, tapeout, print_commands=False, stdout=False, + njoy_exec='njoy'): """Run NJOY with given commands Parameters @@ -129,6 +130,8 @@ def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): Dictionary mapping tape numbers to paths for any input files tapeout : dict Dictionary mapping tape numbers to paths for any output files + print_commands : bool, optional + Whether to display input commands when running NJOY stdout : bool, optional Whether to display output when running NJOY njoy_exec : str, optional @@ -141,6 +144,11 @@ def run(commands, tapein, tapeout, stdout=False, njoy_exec='njoy'): """ + if print_commands: + # If user requested showing commands, print to screen + print("NJOY INPUTS:") + print(commands) + # Create temporary directory -- it would be preferable to use # TemporaryDirectory(), but it is only available in Python 3.2 tmpdir = tempfile.mkdtemp() @@ -223,13 +231,13 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, error : float, optional Fractional error tolerance for NJOY processing broadr : bool, optional - Indicating whether to Doppler broaden XS in running NJOY + Indicating whether to Doppler broaden XS when running NJOY heatr : bool, optional - Indicating whether to add heating kerma in running NJOY + Indicating whether to add heating kerma when running NJOY purr : bool, optional - Indicating whether to add probability table in running NJOY + Indicating whether to add probability table when running NJOY acer : bool, optional - Indicating whether to generate ACE file in running NJOY + Indicating whether to generate ACE file when running NJOY **kwargs Keyword arguments passed to :func:`openmc.data.njoy.run` @@ -272,14 +280,14 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, # heatr if heatr: - nheatr_in = nlast + 1 + nheatr_in = nlast nheatr = nheatr_in + 1 commands += _ACE_TEMPLATE_HEATR nlast = nheatr # purr if purr: - npurr_in = nlast + 1 + npurr_in = nlast npurr = npurr_in + 1 commands += _ACE_TEMPLATE_PURR nlast = npurr @@ -300,7 +308,6 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, # Indicate tapes to save for each ACER run tapeout[nace] = fname.format(ace, temperature) tapeout[ndir] = fname.format(xsdir, temperature) - commands += 'stop\n' retcode = run(commands, tapein, tapeout, **kwargs) @@ -431,10 +438,10 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, # thermr nthermr1_in = nlast - nthermr1 = nthermr_in + 1 + nthermr1 = nthermr1_in + 1 nthermr2_in = nthermr1 nthermr2 = nthermr2_in + 1 - commands += _ACE_TEMPLATE_THERMR + commands += _ACE_THERMAL_TEMPLATE_THERMR nlast = nthermr2 commands = commands.format(**locals()) @@ -452,7 +459,6 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, # Indicate tapes to save for each ACER run tapeout[nace] = fname.format(ace, temperature) tapeout[ndir] = fname.format(xsdir, temperature) - commands += 'stop\n' retcode = run(commands, tapein, tapeout, **kwargs) From 18f7ae3a46d116bf9ae46ccd1c1327bd965259a9 Mon Sep 17 00:00:00 2001 From: liangjg Date: Wed, 2 Aug 2017 11:08:33 -0400 Subject: [PATCH 116/123] address @Paul's comments write NJOY input into file rather than printing on screen _ACE_TEMPLATE -> _TEMPLATE --- openmc/data/njoy.py | 47 +++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/openmc/data/njoy.py b/openmc/data/njoy.py index d229ea91c..ac98af7fb 100644 --- a/openmc/data/njoy.py +++ b/openmc/data/njoy.py @@ -50,7 +50,7 @@ _THERMAL_DATA = { 75: ThermalTuple('ouo2', [8016, 8017, 8018], 1), } -_ACE_TEMPLATE_RECONR = """ +_TEMPLATE_RECONR = """ reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% {nendf} {npendf} '{library} PENDF for {zsymam}'/ @@ -61,7 +61,7 @@ reconr / %%%%%%%%%%%%%%%%%%% Reconstruct XS for neutrons %%%%%%%%%%%%%%%%%%%%%%% 0/ """ -_ACE_TEMPLATE_BROADR = """ +_TEMPLATE_BROADR = """ broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% {nendf} {npendf} {nbroadr} {mat} {num_temp} 0 0 0. / @@ -70,14 +70,14 @@ broadr / %%%%%%%%%%%%%%%%%%%%%%% Doppler broaden XS %%%%%%%%%%%%%%%%%%%%%%%%%%%% 0/ """ -_ACE_TEMPLATE_HEATR = """ +_TEMPLATE_HEATR = """ heatr / %%%%%%%%%%%%%%%%%%%%%%%%% Add heating kerma %%%%%%%%%%%%%%%%%%%%%%%%%%%% {nendf} {nheatr_in} {nheatr} / {mat} 3 / 302 318 402 / """ -_ACE_TEMPLATE_PURR = """ +_TEMPLATE_PURR = """ purr / %%%%%%%%%%%%%%%%%%%%%%%% Add probability tables %%%%%%%%%%%%%%%%%%%%%%%%% {nendf} {npurr_in} {npurr} / {mat} {num_temp} 1 20 64 / @@ -86,7 +86,8 @@ purr / %%%%%%%%%%%%%%%%%%%%%%%% Add probability tables %%%%%%%%%%%%%%%%%%%%%%%%% 0/ """ -_ACE_TEMPLATE_ACER = """acer / +_TEMPLATE_ACER = """ +acer / %%%%%%%%%%%%%%%%%%%%%%%% Write out in ACE format %%%%%%%%%%%%%%%%%%%%%%%% {nendf} {nacer_in} 0 {nace} {ndir} 1 0 1 .{ext} / '{library}: {zsymam} at {temperature}'/ @@ -95,7 +96,7 @@ _ACE_TEMPLATE_ACER = """acer / / """ -_ACE_THERMAL_TEMPLATE_THERMR = """ +_THERMAL_TEMPLATE_THERMR = """ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (free gas) %%%%%%%%%%%%%%% 0 {nthermr1_in} {nthermr1} 0 {mat} 12 {num_temp} 1 0 {iform} 1 221 1/ @@ -108,7 +109,8 @@ thermr / %%%%%%%%%%%%%%%% Add thermal scattering data (bound) %%%%%%%%%%%%%%%%%% {error} {energy_max} """ -_ACE_THERMAL_TEMPLATE_ACER = """acer / +_THERMAL_TEMPLATE_ACER = """ +acer / %%%%%%%%%%%%%%%%%%%%%%%% Write out in ACE format %%%%%%%%%%%%%%%%%%%%%%%% {nendf} {nthermal_acer_in} 0 {nace} {ndir} 2 0 1 .{ext}/ '{library}: {zsymam_thermal} processed by NJOY'/ @@ -118,7 +120,7 @@ _ACE_THERMAL_TEMPLATE_ACER = """acer / """ -def run(commands, tapein, tapeout, print_commands=False, stdout=False, +def run(commands, tapein, tapeout, input_filename=None, stdout=False, njoy_exec='njoy'): """Run NJOY with given commands @@ -130,8 +132,8 @@ def run(commands, tapein, tapeout, print_commands=False, stdout=False, Dictionary mapping tape numbers to paths for any input files tapeout : dict Dictionary mapping tape numbers to paths for any output files - print_commands : bool, optional - Whether to display input commands when running NJOY + input_filename : str, optional + File name to write out NJOY input commands stdout : bool, optional Whether to display output when running NJOY njoy_exec : str, optional @@ -144,10 +146,9 @@ def run(commands, tapein, tapeout, print_commands=False, stdout=False, """ - if print_commands: - # If user requested showing commands, print to screen - print("NJOY INPUTS:") - print(commands) + if input_filename is not None: + with open(input_filename, 'w') as f: + f.write(commands) # Create temporary directory -- it would be preferable to use # TemporaryDirectory(), but it is only available in Python 3.2 @@ -269,27 +270,27 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, tapeout[npendf] = pendf # reconr - commands += _ACE_TEMPLATE_RECONR + commands += _TEMPLATE_RECONR nlast = npendf # broadr if broadr: nbroadr = nlast + 1 - commands += _ACE_TEMPLATE_BROADR + commands += _TEMPLATE_BROADR nlast = nbroadr # heatr if heatr: nheatr_in = nlast nheatr = nheatr_in + 1 - commands += _ACE_TEMPLATE_HEATR + commands += _TEMPLATE_HEATR nlast = nheatr # purr if purr: npurr_in = nlast npurr = npurr_in + 1 - commands += _ACE_TEMPLATE_PURR + commands += _TEMPLATE_PURR nlast = npurr commands = commands.format(**locals()) @@ -303,7 +304,7 @@ def make_ace(filename, temperatures=None, ace='ace', xsdir='xsdir', pendf=None, nace = nacer_in + 1 + 2*i ndir = nace + 1 ext = '{:02}'.format(i + 1) - commands += _ACE_TEMPLATE_ACER.format(**locals()) + commands += _TEMPLATE_ACER.format(**locals()) # Indicate tapes to save for each ACER run tapeout[nace] = fname.format(ace, temperature) @@ -428,12 +429,12 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, tapeout = {} # reconr - commands += _ACE_TEMPLATE_RECONR + commands += _TEMPLATE_RECONR nlast = npendf # broadr nbroadr = nlast + 1 - commands += _ACE_TEMPLATE_BROADR + commands += _TEMPLATE_BROADR nlast = nbroadr # thermr @@ -441,7 +442,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, nthermr1 = nthermr1_in + 1 nthermr2_in = nthermr1 nthermr2 = nthermr2_in + 1 - commands += _ACE_THERMAL_TEMPLATE_THERMR + commands += _THERMAL_TEMPLATE_THERMR nlast = nthermr2 commands = commands.format(**locals()) @@ -454,7 +455,7 @@ def make_ace_thermal(filename, filename_thermal, temperatures=None, nace = nthermal_acer_in + 1 + 2*i ndir = nace + 1 ext = '{:02}'.format(i + 1) - commands += _ACE_THERMAL_TEMPLATE_ACER.format(**locals()) + commands += _THERMAL_TEMPLATE_ACER.format(**locals()) # Indicate tapes to save for each ACER run tapeout[nace] = fname.format(ace, temperature) From f155dfad29e40eb2a99482909923bca391e80c2d Mon Sep 17 00:00:00 2001 From: April Novak Date: Mon, 31 Jul 2017 16:13:12 -0500 Subject: [PATCH 117/123] added check to make sure that temperature is not set to a value outside data bounds and that cell cannot be filled with a universe. Added several more error codes. Refs #7 --- src/api.F90 | 99 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 15 deletions(-) diff --git a/src/api.F90 b/src/api.F90 index 40ac0f01f..d17d57ef9 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -62,6 +62,12 @@ module openmc_api integer(C_INT), public, bind(C) :: E_MATERIAL_INVALID_ID = -10 integer(C_INT), public, bind(C) :: E_TALLY_NOT_ALLOCATED = -11 integer(C_INT), public, bind(C) :: E_TALLY_INVALID_ID = -12 + integer(C_INT), public, bind(C) :: E_INVALID_SIZE = -13 + integer(C_INT), public, bind(C) :: E_CELL_NO_MATERIAL = -14 + + ! Warning codes + integer(C_INT), public, bind(C) :: W_BELOW_MIN_BOUND = 1 + integer(C_INT), public, bind(C) :: W_ABOVE_MAX_BOUND = 2 contains @@ -87,29 +93,92 @@ contains !=============================================================================== function openmc_cell_set_temperature(index, T, instance) result(err) bind(C) - integer(C_INT32_T), value, intent(in) :: index - real(C_DOUBLE), value, intent(in) :: T - integer(C_INT32_T), optional, intent(in) :: instance - integer(C_INT) :: err + integer(C_INT32_T), value, intent(in) :: index ! cell index in cells + real(C_DOUBLE), value, intent(in) :: T ! temperature + integer(C_INT32_T), optional, intent(in) :: instance ! cell instance - integer :: n + integer(C_INT) :: err ! error code + integer :: j ! looping variable + integer :: n ! number of cell instances + integer :: material_ID ! material associated with cell + integer :: material_index ! material index in materials array + integer :: num_nuclides ! num nuclides in material + integer :: nuclide_index ! index of nuclide in nuclides array + real(8) :: min_temp ! min common-denominator avail temp + real(8) :: max_temp ! max common-denominator avail temp + real(8) :: temp ! actual temp we'll assign + logical :: outside_low ! lower than available data + logical :: outside_high ! higher than available data + + outside_low = .false. + outside_high = .false. err = E_UNASSIGNED + if (index >= 1 .and. index <= size(cells)) then - associate (c => cells(index)) - if (allocated(c % sqrtkT)) then - n = size(c % sqrtkT) - if (present(instance) .and. n > 1) then - if (instance >= 0 .and. instance < n) then - c % sqrtkT(instance + 1) = sqrt(K_BOLTZMANN * T) + + ! error if the cell is filled with another universe + if (cells(index) % fill /= NONE) then + err = E_CELL_NO_MATERIAL + else + ! find which material is associated with this cell + if (present(instance)) then + material_ID = cells(index) % material(instance) + else + material_ID = cells(index) % material(1) + end if + + ! index of that material into the materials array + material_index = material_dict % get_key(material_ID) + + ! number of nuclides associated with this material + num_nuclides = size(materials(material_index) % nuclide) + + min_temp = ZERO + max_temp = INFINITY + + do j = 1, num_nuclides + nuclide_index = materials(material_index) % nuclide(j) + min_temp = max(min_temp, minval(nuclides(nuclide_index) % kTs)) + max_temp = min(max_temp, maxval(nuclides(nuclide_index) % kTs)) + end do + + ! adjust the temperature to be within bounds if necessary + if (K_BOLTZMANN * T < min_temp) then + outside_low = .true. + temp = min_temp / K_BOLTZMANN + else if (K_BOLTZMANN * T > max_temp) then + outside_high = .true. + temp = max_temp / K_BOLTZMANN + else + temp = T + end if + + associate (c => cells(index)) + if (allocated(c % sqrtkT)) then + n = size(c % sqrtkT) + if (present(instance) .and. n > 1) then + if (instance >= 0 .and. instance < n) then + c % sqrtkT(instance + 1) = sqrt(K_BOLTZMANN * temp) + err = 0 + end if + else + c % sqrtkT(:) = sqrt(K_BOLTZMANN * temp) err = 0 end if - else - c % sqrtkT(:) = sqrt(K_BOLTZMANN * T) - err = 0 end if + end associate + + ! assign error codes for outside of temperature bounds provided the + ! temperature was changed correctly. This needs to be done after + ! changing the temperature based on the logical structure above. + if (err == 0) then + if (outside_low) err = W_BELOW_MIN_BOUND + if (outside_high) err = W_ABOVE_MAX_BOUND end if - end associate + + end if + else err = E_OUT_OF_BOUNDS end if From 064e1aef596ebd0e780d433d192ae0cc8224e252 Mon Sep 17 00:00:00 2001 From: April Novak Date: Mon, 31 Jul 2017 17:29:35 -0500 Subject: [PATCH 118/123] added error and warning code handling in Python API for new codes. Refs #7 --- openmc/capi/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index a4f16ab71..fabeac947 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -86,6 +86,19 @@ def _error_handler(err, func, args): elif err == _error_code('e_tally_invalid_id'): raise KeyError("No tally exists with ID={}.".format(args[0])) + elif err == _error_code('e_invalid_size'): + raise MemoryError("Array size mismatch with memory allocated.") + + elif err == _error_code('e_cell_no_material'): + raise GeometryError("Operation on cell requires that it be filled" + " with a material.") + + elif err == _error_code('w_below_min_bound'): + warn("Data has not been loaded beyond lower bound of {}.".format(args[0])) + + elif err == _error_code('w_above_max_bound'): + warn("Data has not been loaded beyond upper bound of {}.".format(args[0])) + elif err < 0: raise Exception("Unknown error encountered (code {}).".format(err)) From a49b4246f455c9ce270469b2a325c6c220c00155 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 31 Jul 2017 23:00:37 -0500 Subject: [PATCH 119/123] Reimplement openmc_material_set_densities. Move assign_sab_tables to material_header. --- src/api.F90 | 37 ++++++------ src/input_xml.F90 | 123 +--------------------------------------- src/material_header.F90 | 120 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 136 deletions(-) diff --git a/src/api.F90 b/src/api.F90 index d17d57ef9..0941e60fe 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -633,30 +633,35 @@ contains if (index >= 1 .and. index <= size(materials)) then associate (m => materials(index)) + ! If nuclide/density arrays are not correct size, reallocate + if (n /= size(m % nuclide)) then + deallocate(m % nuclide, m % atom_density, m % p0) + allocate(m % nuclide(n), m % atom_density(n), m % p0(n)) + end if + do i = 1, n ! Convert C string to Fortran string call c_f_pointer(name(i), string, [10]) - name_ = to_f_string(string) + name_ = to_lower(to_f_string(string)) - ! Find corresponding nuclide and set density - err = E_UNASSIGNED - do j = 1, size(m % nuclide) - k = m % nuclide(j) - if (nuclides(k) % name == name_) then - m % atom_density(j) = density(i) - err = 0 - end if - end do - - ! If nuclide wasn't found, try to load it - if (err /= 0) then - err = openmc_material_add_nuclide(index, string, density(i)) - if (err /= 0) return + if (.not. nuclide_dict % has_key(name_)) then + err = openmc_load_nuclide(string) + if (err < 0) return end if + + m % nuclide(i) = nuclide_dict % get_key(name_) + m % atom_density(i) = density(i) end do + m % n_nuclides = n + + ! Set isotropic flags to flags + m % p0(:) = .false. ! Set total density to the sum of the vector - err = m % set_density(sum(m % atom_density), nuclides) + err = m % set_density(sum(density), nuclides) + + ! Assign S(a,b) tables + call m % assign_sab_tables(nuclides, sab_tables) end associate else err = E_OUT_OF_BOUNDS diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 322ca8a76..2fc6ef918 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5146,123 +5146,6 @@ contains end subroutine normalize_ao -!=============================================================================== -! ASSIGN_SAB_TABLES assigns S(alpha,beta) tables to specific nuclides within -! materials so the code knows when to apply bound thermal scattering data -!=============================================================================== - - subroutine assign_sab_tables() - integer :: i ! index in materials array - integer :: j ! index over nuclides in material - integer :: k ! index over S(a,b) tables in material - integer :: m ! position for sorting - integer :: temp_nuclide ! temporary value for sorting - integer :: temp_table ! temporary value for sorting - real(8) :: temp_frac ! temporary value for sorting - logical :: found - type(VectorInt) :: i_sab_tables - type(VectorInt) :: i_sab_nuclides - type(VectorReal) :: sab_fracs - - do i = 1, size(materials) - ! Skip materials with no S(a,b) tables - if (.not. allocated(materials(i) % i_sab_tables)) cycle - - associate (mat => materials(i)) - - ASSIGN_SAB: do k = 1, size(mat % i_sab_tables) - ! In order to know which nuclide the S(a,b) table applies to, we need - ! to search through the list of nuclides for one which has a matching - ! name - found = .false. - associate (sab => sab_tables(mat % i_sab_tables(k))) - FIND_NUCLIDE: do j = 1, size(mat % nuclide) - if (any(sab % nuclides == nuclides(mat % nuclide(j)) % name)) then - call i_sab_tables % push_back(mat % i_sab_tables(k)) - call i_sab_nuclides % push_back(j) - call sab_fracs % push_back(mat % sab_fracs(k)) - found = .true. - end if - end do FIND_NUCLIDE - end associate - - ! Check to make sure S(a,b) table matched a nuclide - if (.not. found) then - call fatal_error("S(a,b) table " // trim(mat % & - sab_names(k)) // " did not match any nuclide on material " & - // trim(to_str(mat % id))) - end if - end do ASSIGN_SAB - - ! Make sure each nuclide only appears in one table. - do j = 1, i_sab_nuclides % size() - do k = j+1, i_sab_nuclides % size() - if (i_sab_nuclides % data(j) == i_sab_nuclides % data(k)) then - call fatal_error(trim( & - nuclides(mat % nuclide(i_sab_nuclides % data(j))) % name) & - // " in material " // trim(to_str(mat % id)) // " was found & - &in multiple S(a,b) tables. Each nuclide can only appear in & - &one S(a,b) table per material.") - end if - end do - end do - - ! Update i_sab_tables and i_sab_nuclides - deallocate(mat % i_sab_tables) - deallocate(mat % sab_fracs) - m = i_sab_tables % size() - allocate(mat % i_sab_tables(m)) - allocate(mat % i_sab_nuclides(m)) - allocate(mat % sab_fracs(m)) - mat % i_sab_tables(:) = i_sab_tables % data(1:m) - mat % i_sab_nuclides(:) = i_sab_nuclides % data(1:m) - mat % sab_fracs(:) = sab_fracs % data(1:m) - - ! Clear entries in vectors for next material - call i_sab_tables % clear() - call i_sab_nuclides % clear() - call sab_fracs % clear() - - ! If there are multiple S(a,b) tables, we need to make sure that the - ! entries in i_sab_nuclides are sorted or else they won't be applied - ! correctly in the cross_section module. The algorithm here is a simple - ! insertion sort -- don't need anything fancy! - - if (size(mat % i_sab_tables) > 1) then - SORT_SAB: do k = 2, size(mat % i_sab_tables) - ! Save value to move - m = k - temp_nuclide = mat % i_sab_nuclides(k) - temp_table = mat % i_sab_tables(k) - temp_frac = mat % i_sab_tables(k) - - MOVE_OVER: do - ! Check if insertion value is greater than (m-1)th value - if (temp_nuclide >= mat % i_sab_nuclides(m-1)) exit - - ! Move values over until hitting one that's not larger - mat % i_sab_nuclides(m) = mat % i_sab_nuclides(m-1) - mat % i_sab_tables(m) = mat % i_sab_tables(m-1) - mat % sab_fracs(m) = mat % sab_fracs(m-1) - m = m - 1 - - ! Exit if we've reached the beginning of the list - if (m == 1) exit - end do MOVE_OVER - - ! Put the original value into its new position - mat % i_sab_nuclides(m) = temp_nuclide - mat % i_sab_tables(m) = temp_table - mat % sab_fracs(m) = temp_frac - end do SORT_SAB - end if - - ! Deallocate temporary arrays for names of nuclides and S(a,b) tables - if (allocated(mat % names)) deallocate(mat % names) - end associate - end do - end subroutine assign_sab_tables - subroutine read_ce_cross_sections(nuc_temps, sab_temps) type(VectorReal), intent(in) :: nuc_temps(:) type(VectorReal), intent(in) :: sab_temps(:) @@ -5367,10 +5250,10 @@ contains call already_read % add(name) end if end do - end do - ! Associate S(a,b) tables with specific nuclides - call assign_sab_tables() + ! Associate S(a,b) tables with specific nuclides + call materials(i) % assign_sab_tables(nuclides, sab_tables) + end do ! Show which nuclide results in lowest energy for neutron transport do i = 1, size(nuclides) diff --git a/src/material_header.F90 b/src/material_header.F90 index 4415ad086..5d45c40d6 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -1,7 +1,11 @@ module material_header use constants + use error, only: fatal_error use nuclide_header, only: Nuclide + use sab_header, only: SAlphaBeta + use stl_vector, only: VectorReal, VectorInt + use string, only: to_str implicit none @@ -44,6 +48,7 @@ module material_header contains procedure :: set_density => material_set_density + procedure :: assign_sab_tables => material_assign_sab_tables end type Material contains @@ -85,4 +90,119 @@ contains end if end function material_set_density +!=============================================================================== +! ASSIGN_SAB_TABLES assigns S(alpha,beta) tables to specific nuclides within +! materials so the code knows when to apply bound thermal scattering data +!=============================================================================== + + subroutine material_assign_sab_tables(this, nuclides, sab_tables) + class(Material), intent(inout) :: this + type(Nuclide), intent(in) :: nuclides(:) + type(SAlphaBeta), intent(in) :: sab_tables(:) + + integer :: j ! index over nuclides in material + integer :: k ! index over S(a,b) tables in material + integer :: m ! position for sorting + integer :: temp_nuclide ! temporary value for sorting + integer :: temp_table ! temporary value for sorting + real(8) :: temp_frac ! temporary value for sorting + logical :: found + type(VectorInt) :: i_sab_tables + type(VectorInt) :: i_sab_nuclides + type(VectorReal) :: sab_fracs + + if (.not. allocated(this % i_sab_tables)) return + + ASSIGN_SAB: do k = 1, size(this % i_sab_tables) + ! In order to know which nuclide the S(a,b) table applies to, we need + ! to search through the list of nuclides for one which has a matching + ! name + found = .false. + associate (sab => sab_tables(this % i_sab_tables(k))) + FIND_NUCLIDE: do j = 1, size(this % nuclide) + if (any(sab % nuclides == nuclides(this % nuclide(j)) % name)) then + call i_sab_tables % push_back(this % i_sab_tables(k)) + call i_sab_nuclides % push_back(j) + call sab_fracs % push_back(this % sab_fracs(k)) + found = .true. + end if + end do FIND_NUCLIDE + end associate + + ! Check to make sure S(a,b) table matched a nuclide + if (.not. found) then + call fatal_error("S(a,b) table " // trim(this % & + sab_names(k)) // " did not match any nuclide on material " & + // trim(to_str(this % id))) + end if + end do ASSIGN_SAB + + ! Make sure each nuclide only appears in one table. + do j = 1, i_sab_nuclides % size() + do k = j+1, i_sab_nuclides % size() + if (i_sab_nuclides % data(j) == i_sab_nuclides % data(k)) then + call fatal_error(trim( & + nuclides(this % nuclide(i_sab_nuclides % data(j))) % name) & + // " in material " // trim(to_str(this % id)) // " was found & + &in multiple S(a,b) tables. Each nuclide can only appear in & + &one S(a,b) table per material.") + end if + end do + end do + + ! Update i_sab_tables and i_sab_nuclides + deallocate(this % i_sab_tables) + deallocate(this % sab_fracs) + if (allocated(this % i_sab_nuclides)) deallocate(this % i_sab_nuclides) + m = i_sab_tables % size() + allocate(this % i_sab_tables(m)) + allocate(this % i_sab_nuclides(m)) + allocate(this % sab_fracs(m)) + this % i_sab_tables(:) = i_sab_tables % data(1:m) + this % i_sab_nuclides(:) = i_sab_nuclides % data(1:m) + this % sab_fracs(:) = sab_fracs % data(1:m) + + ! Clear entries in vectors for next material + call i_sab_tables % clear() + call i_sab_nuclides % clear() + call sab_fracs % clear() + + ! If there are multiple S(a,b) tables, we need to make sure that the + ! entries in i_sab_nuclides are sorted or else they won't be applied + ! correctly in the cross_section module. The algorithm here is a simple + ! insertion sort -- don't need anything fancy! + + if (size(this % i_sab_tables) > 1) then + SORT_SAB: do k = 2, size(this % i_sab_tables) + ! Save value to move + m = k + temp_nuclide = this % i_sab_nuclides(k) + temp_table = this % i_sab_tables(k) + temp_frac = this % i_sab_tables(k) + + MOVE_OVER: do + ! Check if insertion value is greater than (m-1)th value + if (temp_nuclide >= this % i_sab_nuclides(m-1)) exit + + ! Move values over until hitting one that's not larger + this % i_sab_nuclides(m) = this % i_sab_nuclides(m-1) + this % i_sab_tables(m) = this % i_sab_tables(m-1) + this % sab_fracs(m) = this % sab_fracs(m-1) + m = m - 1 + + ! Exit if we've reached the beginning of the list + if (m == 1) exit + end do MOVE_OVER + + ! Put the original value into its new position + this % i_sab_nuclides(m) = temp_nuclide + this % i_sab_tables(m) = temp_table + this % sab_fracs(m) = temp_frac + end do SORT_SAB + end if + + ! Deallocate temporary arrays for names of nuclides and S(a,b) tables + if (allocated(this % names)) deallocate(this % names) + end subroutine material_assign_sab_tables + end module material_header From d0676c7a857488028a9a912d8ceae90b7dd55b9d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Aug 2017 06:31:09 -0500 Subject: [PATCH 120/123] Break up capi/__init__ into __init__, core, and error --- openmc/__init__.py | 1 - openmc/capi/__init__.py | 218 +--------------------------------------- openmc/capi/cell.py | 4 +- openmc/capi/core.py | 149 +++++++++++++++++++++++++++ openmc/capi/error.py | 66 ++++++++++++ openmc/capi/material.py | 4 +- openmc/capi/nuclide.py | 4 +- openmc/capi/tally.py | 4 +- 8 files changed, 231 insertions(+), 219 deletions(-) create mode 100644 openmc/capi/core.py create mode 100644 openmc/capi/error.py diff --git a/openmc/__init__.py b/openmc/__init__.py index 571b5a93a..d692ebbae 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -27,6 +27,5 @@ from openmc.particle_restart import * from openmc.mixin import * from openmc.plotter import * from openmc.search import * -import openmc.capi __version__ = '0.9.0' diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index fabeac947..2452da7b1 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -12,12 +12,10 @@ objects in the :mod:`openmc.capi` subpackage, for example: """ -from contextlib import contextmanager -from ctypes import CDLL, c_int, c_int32, c_double, POINTER +from ctypes import CDLL import sys from warnings import warn -from numpy.ctypeslib import as_array import pkg_resources @@ -32,221 +30,13 @@ _filename = pkg_resources.resource_filename( __name__, '_libopenmc.{}'.format(_suffix)) try: _dll = CDLL(_filename) - _available = True except OSError: warn("OpenMC shared library is not available from the Python API. This " "means you will not be able to use openmc.capi to make in-memory " "calls to OpenMC.") - _available = False - - -class GeometryError(Exception): - pass - - -def _error_code(s): - """Get error code corresponding to global constant.""" - return c_int.in_dll(_dll, s).value - - -def _error_handler(err, func, args): - """Raise exception according to error code.""" - if err == _error_code('e_out_of_bounds'): - raise IndexError('Array index out of bounds.') - - elif err == _error_code('e_cell_not_allocated'): - raise MemoryError("Memory has not been allocated for cells.") - - elif err == _error_code('e_cell_invalid_id'): - raise KeyError("No cell exists with ID={}.".format(args[0])) - - elif err == _error_code('e_cell_not_found'): - raise GeometryError("Could not find cell at position ({}, {}, {})" - .format(*args[0])) - - elif err == _error_code('e_nuclide_not_allocated'): - raise MemoryError("Memory has not been allocated for nuclides.") - - elif err == _error_code('e_nuclide_not_loaded'): - raise KeyError("No nuclide named '{}' has been loaded.") - - elif err == _error_code('e_nuclide_not_in_library'): - raise KeyError("Specified nuclide doesn't exist in the cross " - "section library.") - - elif err == _error_code('e_material_not_allocated'): - raise MemoryError("Memory has not been allocated for materials.") - - elif err == _error_code('e_material_invalid_id'): - raise KeyError("No material exists with ID={}.".format(args[0])) - - elif err == _error_code('e_tally_not_allocated'): - raise MemoryError("Memory has not been allocated for tallies.") - - elif err == _error_code('e_tally_invalid_id'): - raise KeyError("No tally exists with ID={}.".format(args[0])) - - elif err == _error_code('e_invalid_size'): - raise MemoryError("Array size mismatch with memory allocated.") - - elif err == _error_code('e_cell_no_material'): - raise GeometryError("Operation on cell requires that it be filled" - " with a material.") - - elif err == _error_code('w_below_min_bound'): - warn("Data has not been loaded beyond lower bound of {}.".format(args[0])) - - elif err == _error_code('w_above_max_bound'): - warn("Data has not been loaded beyond upper bound of {}.".format(args[0])) - - elif err < 0: - raise Exception("Unknown error encountered (code {}).".format(err)) - - -def calculate_volumes(): - """Run stochastic volume calculation""" - _dll.openmc_calculate_volumes() - - -def finalize(): - """Finalize simulation and free memory""" - _dll.openmc_finalize() - - -def find(xyz, rtype='cell'): - """Find the cell or material at a given point - - Parameters - ---------- - xyz : iterable of float - Cartesian coordinates of position - rtype : {'cell', 'material'} - Whether to return the cell or material ID - - Returns - ------- - int or None - ID of the cell or material. If 'material' is requested and no - material exists at the given coordinate, None is returned. - int - If the cell at the given point is repeated in the geometry, this - indicates which instance it is, i.e., 0 would be the first instance. - - """ - # Set second argument to openmc_find - if rtype == 'cell': - r_int = 1 - elif rtype == 'material': - r_int = 2 - else: - raise ValueError('Unknown return type: {}'.format(rtype)) - - # Call openmc_find - uid = c_int32() - instance = c_int32() - _dll.openmc_find((c_double*3)(*xyz), r_int, uid, instance) - return (uid.value if uid != 0 else None), instance.value - - -def hard_reset(): - """Reset tallies, timers, and pseudo-random number generator state.""" - _dll.openmc_hard_reset() - - -def init(intracomm=None): - """Initialize OpenMC - - Parameters - ---------- - intracomm : mpi4py.MPI.Intracomm or None - MPI intracommunicator - - """ - if intracomm is not None: - # If an mpi4py communicator was passed, convert it to an integer to - # be passed to openmc_init - try: - intracomm = intracomm.py2f() - except AttributeError: - pass - _dll.openmc_init(c_int(intracomm)) - else: - _dll.openmc_init(None) - - -def keff(): - """Return the calculated k-eigenvalue and its standard deviation. - - Returns - ------- - tuple - Mean k-eigenvalue and standard deviation of the mean - - """ - k = (c_double*2)() - _dll.openmc_get_keff(k) - return tuple(k) - - -def plot_geometry(): - """Plot geometry""" - _dll.openmc_plot_geometry() - - -def reset(): - """Reset tallies and timers.""" - _dll.openmc_reset() - - -def run(): - """Run simulation""" - _dll.openmc_run() - - -@contextmanager -def run_in_memory(intracomm=None): - """Provides context manager for calling OpenMC shared library functions. - - This function is intended to be used in a 'with' statement and ensures that - OpenMC is properly initialized/finalized. At the completion of the 'with' - block, all memory that was allocated during the block is freed. For - example:: - - with openmc.capi.run_in_memory(): - for i in range(n_iters): - openmc.capi.reset() - do_stuff() - openmc.capi.run() - - Parameters - ---------- - intracomm : mpi4py.MPI.Intracomm or None - MPI intracommunicator - - """ - init(intracomm) - yield - finalize() - - -# Set argument/return types -if _available: - _dll.openmc_calculate_volumes.restype = None - _dll.openmc_finalize.restype = None - _dll.openmc_find.argtypes = [ - POINTER(c_double*3), c_int, POINTER(c_int32), POINTER(c_int32)] - _dll.openmc_find.restype = c_int - _dll.openmc_find.errcheck = _error_handler - _dll.openmc_hard_reset.restype = None - _dll.openmc_init.argtypes = [POINTER(c_int)] - _dll.openmc_init.restype = None - _dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] - _dll.openmc_get_keff.restype = c_int - _dll.openmc_get_keff.errcheck = _error_handler - _dll.openmc_plot_geometry.restype = None - _dll.openmc_run.restype = None - _dll.openmc_reset.restype = None - +else: + from .error import * + from .core import * from .nuclide import * from .material import * from .cell import * diff --git a/openmc/capi/cell.py b/openmc/capi/cell.py index 9abada00c..f519d2f6d 100644 --- a/openmc/capi/cell.py +++ b/openmc/capi/cell.py @@ -4,7 +4,8 @@ from weakref import WeakValueDictionary import numpy as np -from openmc.capi import _dll, _error_handler +from . import _dll +from .error import _error_handler __all__ = ['CellView', 'cells'] @@ -40,6 +41,7 @@ class CellView(object): """ __instances = WeakValueDictionary() + def __new__(cls, *args): if args not in cls.__instances: instance = super().__new__(cls) diff --git a/openmc/capi/core.py b/openmc/capi/core.py new file mode 100644 index 000000000..74669540b --- /dev/null +++ b/openmc/capi/core.py @@ -0,0 +1,149 @@ +from contextlib import contextmanager +from ctypes import CDLL, c_int, c_int32, c_double, POINTER +from warnings import warn + +from . import _dll +from .error import _error_handler + + +_dll.openmc_calculate_volumes.restype = None +_dll.openmc_finalize.restype = None +_dll.openmc_find.argtypes = [POINTER(c_double*3), c_int, POINTER(c_int32), + POINTER(c_int32)] +_dll.openmc_find.restype = c_int +_dll.openmc_find.errcheck = _error_handler +_dll.openmc_hard_reset.restype = None +_dll.openmc_init.argtypes = [POINTER(c_int)] +_dll.openmc_init.restype = None +_dll.openmc_get_keff.argtypes = [POINTER(c_double*2)] +_dll.openmc_get_keff.restype = c_int +_dll.openmc_get_keff.errcheck = _error_handler +_dll.openmc_plot_geometry.restype = None +_dll.openmc_run.restype = None +_dll.openmc_reset.restype = None + + +def calculate_volumes(): + """Run stochastic volume calculation""" + _dll.openmc_calculate_volumes() + + +def finalize(): + """Finalize simulation and free memory""" + _dll.openmc_finalize() + + +def find(xyz, rtype='cell'): + """Find the cell or material at a given point + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates of position + rtype : {'cell', 'material'} + Whether to return the cell or material ID + + Returns + ------- + int or None + ID of the cell or material. If 'material' is requested and no + material exists at the given coordinate, None is returned. + int + If the cell at the given point is repeated in the geometry, this + indicates which instance it is, i.e., 0 would be the first instance. + + """ + # Set second argument to openmc_find + if rtype == 'cell': + r_int = 1 + elif rtype == 'material': + r_int = 2 + else: + raise ValueError('Unknown return type: {}'.format(rtype)) + + # Call openmc_find + uid = c_int32() + instance = c_int32() + _dll.openmc_find((c_double*3)(*xyz), r_int, uid, instance) + return (uid.value if uid != 0 else None), instance.value + + +def hard_reset(): + """Reset tallies, timers, and pseudo-random number generator state.""" + _dll.openmc_hard_reset() + + +def init(intracomm=None): + """Initialize OpenMC + + Parameters + ---------- + intracomm : mpi4py.MPI.Intracomm or None + MPI intracommunicator + + """ + if intracomm is not None: + # If an mpi4py communicator was passed, convert it to an integer to + # be passed to openmc_init + try: + intracomm = intracomm.py2f() + except AttributeError: + pass + _dll.openmc_init(c_int(intracomm)) + else: + _dll.openmc_init(None) + + +def keff(): + """Return the calculated k-eigenvalue and its standard deviation. + + Returns + ------- + tuple + Mean k-eigenvalue and standard deviation of the mean + + """ + k = (c_double*2)() + _dll.openmc_get_keff(k) + return tuple(k) + + +def plot_geometry(): + """Plot geometry""" + _dll.openmc_plot_geometry() + + +def reset(): + """Reset tallies and timers.""" + _dll.openmc_reset() + + +def run(): + """Run simulation""" + _dll.openmc_run() + + +@contextmanager +def run_in_memory(intracomm=None): + """Provides context manager for calling OpenMC shared library functions. + + This function is intended to be used in a 'with' statement and ensures that + OpenMC is properly initialized/finalized. At the completion of the 'with' + block, all memory that was allocated during the block is freed. For + example:: + + with openmc.capi.run_in_memory(): + for i in range(n_iters): + openmc.capi.reset() + do_stuff() + openmc.capi.run() + + Parameters + ---------- + intracomm : mpi4py.MPI.Intracomm or None + MPI intracommunicator + + """ + init(intracomm) + yield + finalize() diff --git a/openmc/capi/error.py b/openmc/capi/error.py new file mode 100644 index 000000000..2058ceb20 --- /dev/null +++ b/openmc/capi/error.py @@ -0,0 +1,66 @@ +from ctypes import c_int + +from . import _dll + + +class GeometryError(Exception): + pass + + +def _error_handler(err, func, args): + """Raise exception according to error code.""" + + # Get error code corresponding to global constant. + def errcode(s): + return c_int.in_dll(_dll, s).value + + if err == errcode('e_out_of_bounds'): + raise IndexError('Array index out of bounds.') + + elif err == errcode('e_cell_not_allocated'): + raise MemoryError("Memory has not been allocated for cells.") + + elif err == errcode('e_cell_invalid_id'): + raise KeyError("No cell exists with ID={}.".format(args[0])) + + elif err == errcode('e_cell_not_found'): + raise GeometryError("Could not find cell at position ({}, {}, {})" + .format(*args[0])) + + elif err == errcode('e_nuclide_not_allocated'): + raise MemoryError("Memory has not been allocated for nuclides.") + + elif err == errcode('e_nuclide_not_loaded'): + raise KeyError("No nuclide named '{}' has been loaded.") + + elif err == errcode('e_nuclide_not_in_library'): + raise KeyError("Specified nuclide doesn't exist in the cross " + "section library.") + + elif err == errcode('e_material_not_allocated'): + raise MemoryError("Memory has not been allocated for materials.") + + elif err == errcode('e_material_invalid_id'): + raise KeyError("No material exists with ID={}.".format(args[0])) + + elif err == errcode('e_tally_not_allocated'): + raise MemoryError("Memory has not been allocated for tallies.") + + elif err == errcode('e_tally_invalid_id'): + raise KeyError("No tally exists with ID={}.".format(args[0])) + + elif err == errcode('e_invalid_size'): + raise MemoryError("Array size mismatch with memory allocated.") + + elif err == errcode('e_cell_no_material'): + raise GeometryError("Operation on cell requires that it be filled" + " with a material.") + + elif err == errcode('w_below_min_bound'): + warn("Data has not been loaded beyond lower bound of {}.".format(args[0])) + + elif err == errcode('w_above_max_bound'): + warn("Data has not been loaded beyond upper bound of {}.".format(args[0])) + + elif err < 0: + raise Exception("Unknown error encountered (code {}).".format(err)) diff --git a/openmc/capi/material.py b/openmc/capi/material.py index 564ecaa05..d07d7aa8a 100644 --- a/openmc/capi/material.py +++ b/openmc/capi/material.py @@ -5,7 +5,8 @@ from weakref import WeakValueDictionary import numpy as np from numpy.ctypeslib import as_array -from openmc.capi import _dll, _error_handler, NuclideView +from . import _dll, NuclideView +from .error import _error_handler __all__ = ['MaterialView', 'materials'] @@ -58,6 +59,7 @@ class MaterialView(object): """ __instances = WeakValueDictionary() + def __new__(cls, *args): if args not in cls.__instances: instance = super().__new__(cls) diff --git a/openmc/capi/nuclide.py b/openmc/capi/nuclide.py index 384d0ae91..4c6248d6b 100644 --- a/openmc/capi/nuclide.py +++ b/openmc/capi/nuclide.py @@ -5,7 +5,8 @@ from weakref import WeakValueDictionary import numpy as np from numpy.ctypeslib import as_array -from openmc.capi import _dll, _error_handler +from . import _dll +from .error import _error_handler __all__ = ['NuclideView', 'nuclides', 'load_nuclide'] @@ -53,6 +54,7 @@ class NuclideView(object): """ __instances = WeakValueDictionary() + def __new__(cls, *args): if args not in cls.__instances: instance = super().__new__(cls) diff --git a/openmc/capi/tally.py b/openmc/capi/tally.py index cc8c13a5a..611f1ce87 100644 --- a/openmc/capi/tally.py +++ b/openmc/capi/tally.py @@ -4,7 +4,8 @@ from weakref import WeakValueDictionary from numpy.ctypeslib import as_array -from openmc.capi import _dll, _error_handler, NuclideView +from . import _dll, NuclideView +from .error import _error_handler __all__ = ['TallyView', 'tallies'] @@ -52,6 +53,7 @@ class TallyView(object): """ __instances = WeakValueDictionary() + def __new__(cls, *args): if args not in cls.__instances: instance = super().__new__(cls) From 745b0b2d83cdbd28fcb4f565b77b31ef6f888350 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Aug 2017 06:33:46 -0500 Subject: [PATCH 121/123] Remove try/except block around CDLL --- openmc/capi/__init__.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/openmc/capi/__init__.py b/openmc/capi/__init__.py index 2452da7b1..355304a31 100644 --- a/openmc/capi/__init__.py +++ b/openmc/capi/__init__.py @@ -28,16 +28,11 @@ else: # Open shared library _filename = pkg_resources.resource_filename( __name__, '_libopenmc.{}'.format(_suffix)) -try: - _dll = CDLL(_filename) -except OSError: - warn("OpenMC shared library is not available from the Python API. This " - "means you will not be able to use openmc.capi to make in-memory " - "calls to OpenMC.") -else: - from .error import * - from .core import * - from .nuclide import * - from .material import * - from .cell import * - from .tally import * +_dll = CDLL(_filename) + +from .error import * +from .core import * +from .nuclide import * +from .material import * +from .cell import * +from .tally import * From cd8a297353c37cfeb4fdf4ef5600baa592b5e7d9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Aug 2017 07:12:37 -0500 Subject: [PATCH 122/123] Break up capi.find into find_cell and find_material --- docs/source/pythonapi/capi.rst | 3 ++- openmc/capi/core.py | 44 ++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/docs/source/pythonapi/capi.rst b/docs/source/pythonapi/capi.rst index a586cb4ad..6e4e860fa 100644 --- a/docs/source/pythonapi/capi.rst +++ b/docs/source/pythonapi/capi.rst @@ -14,7 +14,8 @@ Functions openmc.capi.calculate_volumes openmc.capi.finalize - openmc.capi.find + openmc.capi.find_cell + openmc.capi.find_material openmc.capi.hard_reset openmc.capi.init openmc.capi.keff diff --git a/openmc/capi/core.py b/openmc/capi/core.py index 74669540b..fe5416dd6 100644 --- a/openmc/capi/core.py +++ b/openmc/capi/core.py @@ -33,39 +33,47 @@ def finalize(): _dll.openmc_finalize() -def find(xyz, rtype='cell'): - """Find the cell or material at a given point +def find_cell(xyz): + """Find the cell at a given point Parameters ---------- xyz : iterable of float Cartesian coordinates of position - rtype : {'cell', 'material'} - Whether to return the cell or material ID Returns ------- - int or None - ID of the cell or material. If 'material' is requested and no - material exists at the given coordinate, None is returned. + int + ID of the cell. int If the cell at the given point is repeated in the geometry, this indicates which instance it is, i.e., 0 would be the first instance. """ - # Set second argument to openmc_find - if rtype == 'cell': - r_int = 1 - elif rtype == 'material': - r_int = 2 - else: - raise ValueError('Unknown return type: {}'.format(rtype)) - - # Call openmc_find uid = c_int32() instance = c_int32() - _dll.openmc_find((c_double*3)(*xyz), r_int, uid, instance) - return (uid.value if uid != 0 else None), instance.value + _dll.openmc_find((c_double*3)(*xyz), 1, uid, instance) + return uid.value, instance.value + + +def find_material(xyz): + """Find the material at a given point + + Parameters + ---------- + xyz : iterable of float + Cartesian coordinates of position + + Returns + ------- + int or None + ID of the material or None is no material is found + + """ + uid = c_int32() + instance = c_int32() + _dll.openmc_find((c_double*3)(*xyz), 2, uid, instance) + return uid.value if uid != 0 else None def hard_reset(): From 242d633185828d48e522350a48fae96ffbe0c8f9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Aug 2017 10:35:23 -0500 Subject: [PATCH 123/123] Address more @smharper comments --- src/api.F90 | 9 +++++++-- src/simulation.F90 | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/api.F90 b/src/api.F90 index 0941e60fe..d45360d28 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -169,7 +169,7 @@ contains end if end associate - ! assign error codes for outside of temperature bounds provided the + ! Assign error codes for outside of temperature bounds provided the ! temperature was changed correctly. This needs to be done after ! changing the temperature based on the logical structure above. if (err == 0) then @@ -627,7 +627,7 @@ contains real(C_DOUBLE), intent(in) :: density(n) integer(C_INT) :: err - integer :: i, j, k + integer :: i character(C_CHAR), pointer :: string(:) character(len=:, kind=C_CHAR), allocatable :: name_ @@ -868,6 +868,11 @@ contains end if end function openmc_tally_set_nuclides +!=============================================================================== +! TO_F_STRING takes a null-terminated array of C chars and turns it into a +! deferred-length character string. Yay Fortran 2003! +!=============================================================================== + function to_f_string(c_string) result(f_string) character(kind=C_CHAR), intent(in) :: c_string(*) character(:), allocatable :: f_string diff --git a/src/simulation.F90 b/src/simulation.F90 index b406679ce..7427443bb 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -394,9 +394,9 @@ contains subroutine finalize_simulation() - integer :: i ! loop index for tallies - integer :: n ! size of arrays #ifdef MPI + integer :: i ! loop index for tallies + integer :: n ! size of arrays integer :: mpi_err ! MPI error code integer(8) :: temp real(8) :: tempr(3) ! temporary array for communication